C#基础语法:Base关键字学习笔记
它与this关键字一样,都是作为类的实例(因此不能调用基类的静态成员和抽象成员)简写或者替代而存在的,只不过this关键字用于替代本类的实例,base关键字用于替代基类的实例,用法很简单,其访问基类的形式如下:
base.【标识符】
base[【表达式列表】] 这个类型的一看便可以大概猜测多用于基类实例的索引器操作,在我下面演示的代码中你会看到它的用法。
对于 base.【标识符】的访问形式再次说明一下:
对于非虚方法,这种访问仅仅是对基类实例成员的直接访问,完全等价于((base)this).【标识符】。
对于虚方法,对于这种访子类重写该虚方法运用这种访问形式也是(禁用了虚方法调用的机制)对基类实例成员的直接访问,将其看做非虚方法处理,此时则不等价于((base)this).【标识符】,因为这种格式完全遵守虚方法调用的机制,其声明试时为积累类型,运行时为子类类型,所以执行的还是子类的重写方法。于未重写的虚方法等同于简单的非虚方法处理。
测试代码如下:
usingSystem; namespaceBaseTest { classfather { stringstr1="thisfield[1]ofbaseclass",str2="thisfield[2]ofbaseclass"; publicvoidF1()//Non-virtualmethod { Console.WriteLine("F1ofthebaseclass"); } publicvirtualvoidF2()//virtualmethod { Console.WriteLine("F2ofthebaseclass"); } publicvirtualvoidF3() { Console.WriteLine("F3ofthebaseclassthatisnotoverrided"); } publicstringthis[intindex] { set { if(index==1) { str1=value; } else { str2=value; } } get { if(index==1) { returnstr1; } else { returnstr2; } } } } classChild:father { publicvoidG() { Console.WriteLine("======Non-virtualmethodsTest========="); base.F1(); ((father)this).F1(); Console.WriteLine("======virtualmethodsTest========="); base.F2(); ((father)this).F2(); base.F3(); ((father)this).F3(); Console.WriteLine("=====Testthetypethatthetbase[[expression]]=========="); Console.WriteLine(base[1]); base[1]="overridethedefault"; Console.WriteLine(base[1]); Console.WriteLine("================TestOver====================="); } publicoverridevoidF2() { Console.WriteLine("F2ofthesubclass"); } staticvoidMain(string[]args) { Childchild=newChild(); child.G(); Console.ReadKey(); } } }
base用于构造函数声明,用法和this用于构造函数声明完全一致,但base是对基类构造函数形参的匹配。
usingSystem; namespaceBaseCoTest { classBase { publicBase(inta,stringstr) { Console.WriteLine("Base.Base(inta,stringstr)"); } publicBase(inta) { Console.WriteLine("Base.Base(inta)"); } publicBase() { } } classSub:Base { publicSub() { } publicSub(inta) :base(1,"123") { Console.WriteLine("Sub.Sub(inta)"); } classTest { publicstaticvoidMain() { Subsub=newSub(1); Console.ReadKey(); } } } }