某天看代码的时候,突然发现了这样的一句话:
完全不知道this在这里的作用和意义。借此,一起捋一下 this和base的使用和区别。
首先,base和this 在C#中都被定义为访问关键字:
base(C# 参考)
访问基类的成员。
base
关键字用于从派生类中访问基类的成员:
-
调用基类上已被其他方法重写的方法。
-
指定创建派生类实例时应调用的基类构造函数。
仅允许基类访问在构造函数、实例方法或实例属性访问器中进行。
从静态方法中使用 base
关键字是错误的。
所访问的基类是类声明中指定的基类。 例如,如果指定 class ClassB : ClassA
,则从 ClassB 访问 ClassA 的成员,而不考虑 ClassA 的基类。
Q:根据上面的描述,我们在此提一个问题:在多层继承的情况下,生成最外层的实例的时候,实例化过程应该是怎么样的顺序呢?
this(C# 参考)
引用类的当前实例。
this
关键字指代类的当前实例,还可用作扩展方法的第一个参数的修饰符。
以下是 this
的常见用法:(此处不包含this的扩展方法!)
-
限定类似名称隐藏的成员,例如:
public class Employee { private string alias; private string name; public Employee(string name, string alias) { this.name = name; this.alias = alias; } }
-
将对象作为参数传递给方法,例如:
CalcTax(this);
-
声明索引器,例如:
public int this[int param] { get { return array[param]; } set { array[param] = value; } }
-
注:
静态成员函数,因为它们存在于类级别且不属于对象,不具有this
指针。 在静态方法中引用this
会生成错误。
总结
1.this 用于当前类内,base用于派生类中
2.实例化过程首先要先实例化其基类,并且依此类推,一直到实例化System.Object为止。例如:
//第一级 public class One { public One() { Console.WriteLine("这是第一级"); } public One(string name) { Console.WriteLine($"这是第一级,带有name参数的构造函数{name}"); } public virtual void Show() { Console.WriteLine("这是第一级的show方法"); } } //第二级 public class Two : One { public Two() { Console.WriteLine("这是第二级"); } public Two(string name):this() { Console.WriteLine($"这是第二级的带有name参数的构造函数{name}"); } public override void Show() { Console.WriteLine("这是第二级的show方法"); } } //第三级 public class Three : Two { public Three() { Console.WriteLine("这是第三级"); } public Three(string name) : base(name) { Console.WriteLine($"这是第三级的带有name参数的构造函数:{name}"); } public override void Show() { base.Show(); Console.WriteLine("这是第三级的show方法"); } }
//调用测试 class Program { static void Main(string[] args) { var test = new Three("测试"); Console.ReadKey(); } }
执行结果:
可以复制以上代码,自己运行一下看看,基本就都了解了。
以上,over.