1.base关键字
首先看一个代码实例:
class BaseClass
{
public BaseClass()
{
Console.WriteLine("BaseClass without parameters");
}
public BaseClass(int i)
{
Console.WriteLine($"BaseClass with <{i}>");
}
}
class DerivedClass : BaseClass
{
public DerivedClass()
{
Console.WriteLine("DerivedClass without parameters");
}
public DerivedClass(int i)
{
Console.WriteLine($"DerivedClass with <{i}>");
}
}
class Program
{
static void Main()
{
DerivedClass d = new DerivedClass(100);
Console.ReadKey();
}
}
其输出结果如下:
BaseClass without parameters
DerivedClass with <100>
由输出结果可以发现当创建派生类的实例时,首先会默认调用基类的默认构造函数,而后调用派生类中的构造函数。现对以上代码中的 DerivedClass 类做如下改变,添加 base 关键字:
public DerivedClass(int i) : base (i)
{
Console.WriteLine($"DerivedClass with <{i}>");
}
此时的输出结果如下所示:
BaseClass with <100>
DerivedClass with <100>
由输出结果可以发现,派生类在调用基类构造函数时,调用了基类的有参构造函数,这是由于派生;类中的有参构造函数显示的声明了 base 关键字来初始化基类的构造函数。
除了在声明派生类对象时初始化基类的构造函数外,base 关键字还可以实现在派生类中显式的调用基类中的已被派生类重写过的原方法,其用法如下所示:
class BaseClass
{
public virtual void Show()
{
Console.WriteLine("BaseClass");
}
}
class DerivedClass : BaseClass
{
public override void Show()
{
Console.WriteLine("DerivedClass");
}
public void NewShow()
{
base.Show();
}
}
class Program
{
static void Main()
{
DerivedClass d = new DerivedClass();
d.Show();
d.NewShow();
Console.ReadKey();
}
}
输出结果如下所示:
DerivedClass
BaseClass
可以发现 DerivedClass 类中的 NewShow() 方法通过 base 关键字显式地调用了基类 BaseClass 中的 Show() 方法,通过关键字 base 访问的只能是直接基类中的成员。
2.this关键字
this关键字的第一个作用为:限定被相似的名称隐藏的成员。其示例代码如下:
class Person
{
string name;
public Person(string name)
{
this.name = name;
}
}
在上述代码的构造函数中,类的成员 name 与 方法中的参数重名,使得类的私有成员变量会被传入的参数隐藏。若想要使用类的私有成员变量,可以使用关键字 this 限定,告诉编译器此处的 name 式类的私有成员变量,而不是传入参数 name。
this关键字的第二个作用为:将对象作为参数传递到其他方法。其示例代码如下:
class ClassA
{
ClassB b = new ClassB();
public ClassA(ClassB b)
{
this.b = b;
}
}
class ClassB
{
public ClassB()
{
ClassA a = new ClassA(this);
}
}
在上述代码中,ClassB 类将自身对象作为参数传递给 ClassA 类中的构造函数。
this关键字的第三个作用为:声明索引器,详情请见随笔“索引器”。
this关键字的第四个作用为:可用作扩展方法的第一个参数的修饰符,详情请见随笔“扩展方法”。
补充:在静态类中,关键字 base 和 this 都是不允许的。