C# 中的 base和this
某天看代码的时候,突然发现了这样的一句话:

完全不知道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.

浙公网安备 33010602011771号