软件开发|编程技术|编程代码|编程入门先学什么—程序设计语言

C#关键字之base和this讲解

base this

base

官方描述:关键字用于从派生类中访问基类的成员:

调用基类上已被其他方法重写的方法。

指定创建派生类实例时应调用的基类构造函数。

仅允许基类访问在构造函数、实例方法或实例属性访问器中进行。

this

官方描述:指代类的当前实例,还可用作扩展方法的第一个参数的修饰符。

项目:LearnBaseAndThis

环境VS2017 .NET Core2.0


继承调用方式

     class Father    {        public Father()        {            Console.WriteLine($"{nameof(Father)}.构造函数");        }        public Father(string name)        {            Console.WriteLine($"{nameof(Father)}.构造函数,Name={name}");        }        public virtual void DoSomething()        {            Console.WriteLine($"{nameof(Father)}.Work");        }    }    class Son : Father //继承Father    {        public Son() : this("萝卜")        {            Console.WriteLine($"{nameof(Son)}.构造函数");        }        public Son(string name)        {            Console.WriteLine($"{nameof(Son)}.构造函数,Name={name}");        }        public override void DoSomething()        {            Console.WriteLine($"{nameof(Son)}.Learn");        }    }    class Daughter : Father  //继承Father    {        public Daughter() : base("大萝卜")        {            Console.WriteLine($"{nameof(Son)}.构造函数");        }        public override void DoSomething()        {            Console.WriteLine($"{nameof(Daughter)}.Play");        }    }//输出内容static void Main(string[] args)        {            Father f = new Father();            f.DoSomething();            Console.WriteLine("------------------------");            Son s = new Son();            s.DoSomething();            Console.WriteLine("------------------------");            Daughter d = new Daughter();            d.DoSomething();            Console.ReadKey();        }输出如下内容:Father.构造函数Father.Work------------------------Father.构造函数Son.构造函数,Name=萝卜Son.构造函数Son.Learn------------------------Father.构造函数,Name=大萝卜Son.构造函数Daughter.Play

Son类表述的是this用法,构造时默认先调用基类的默认构造方法,然后在看是否自己有指定的this构造方法

Daughter类表述的是base用法,构造时先看是否指定调用基类的某个构造方法,如无则调用默认构造


this 扩展方法

    public static class Extension    {        public static double ToDollar(this double i)        {            return ToDollar(i, 6);        }        public static double ToDollar(this double i, int j)        {            return i *= j;        }    }    static void Main(string[] args)    {        double j = 2;        Console.WriteLine(j.ToDollar(7).ToString());  //输出 14        Console.WriteLine(j.ToDollar().ToString());   //输出 12        Console.ReadKey();   }

本示例把double类进行扩展ToDollar(转换为美元)方法,根据扩展需要制定参数。

扩展方法官方解释:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 对于用 C#、F# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法没有明显区别。

LINQ查询都是扩展方法,引用System.Linq 后你会发现 集合的查询多出很多 where、count等查询方法。


注意点

不可在静态方法中使用base和this。 this也经常用在当前类中用this.属性或this.方法表明要调用当前的属性和方法。 扩展方法最好集中放在一起方便管理维护。