C#中的new修饰符
今天我们和大家介绍一下C#中的new修饰符,注意这个修饰符,不是我们创建class的new哦。
new修饰符的基本介绍
New 修饰符主要要在子类中,当他修饰一个方法或者成员时,就表示,我们在基类中也有同样名字的方法或者成员,这里我们相当于重新建了一个同名的方法或者成员。在调用的时候,也就会覆盖基类的调用。当然我们不加new这个修饰符,也是可以运行得,但是会在编译的时候报警告。我们来来看下面的代码:
class NewModifer { public int x; public void Invoke() { Console.WriteLine("Base Invoke"); } } class DerivedNewModifer : NewModifer { public void Invoke() { Console.WriteLine("Derived Invoke"); } }
这里,我们在基类中也有一个和父类同名的Invoke函数,假如我们这样写,在编译的时候就会出现下面这样的警告:
1>C:\Users\xiaya\source\repos\ToString\ToString\NewModifer.cs(20,21,20,27): warning CS0108: ‘DerivedNewModifer.Invoke()’ hides inherited member ‘NewModifer.Invoke()’. Use the new keyword if hiding was intended.
那么要消除这个警告,我们可以给Invoke函数加上new的修饰符,如下所示:
class DerivedNewModifer : NewModifer { new public void Invoke() { Console.WriteLine("Derived Invoke"); } }
这样之后,警告就没有了。
子类同名方法的高优先级
到这里,我相信大家还是可以理解的,同名的方法覆盖基类的方法,同步的property,field等等也是可以覆盖基类同名相关内容。下面我们继续来看这个:
class NewModifer { public int x; public void Invoke() { Console.WriteLine("Base Invoke"); } } class DerivedNewModifer : NewModifer { new public void Invoke() { Console.WriteLine("Derived Invoke"); } public void x() { Console.WriteLine("Derived x"); } }
这里你会发现编译也会出警告,难道这里的方法也会覆盖同名的int property?是的,C#一个规则写得很清楚,同名的方法其实优先级很高,他可以覆盖对应基类的properties,fields和types。这一点要小心。
1>C:\Users\xiaya\source\repos\ToString\ToString\NewModifer.cs(25,21,25,22): warning CS0108: ‘DerivedNewModifer.x()’ hides inherited member ‘NewModifer.x’. Use the new keyword if hiding was intended.
同样加上new修饰符就可以了:
class DerivedNewModifer : NewModifer { new public void Invoke() { Console.WriteLine("Derived Invoke"); } new public void x() { Console.WriteLine("Derived x"); } }
new修饰符和override的差别
说到这里,我想大家其实会发现,咦这不就是override吗?为什么还要一个新的new啊。首先,第一点,我们不能同时使用new和override,一次只能用一个。其次呢,就是这两者其实是有不同意思的,new修饰符其实是创建了一个新的同名的member,然后让子类的同名member被隐藏了。而override其实只是扩展了集成成员的实现而已。
测试代码
我们在main函数加入下面代码进行测试:
static void Main(string[] args) { DerivedNewModifer dnm = new DerivedNewModifer(); dnm.Invoke(); dnm.x(); NewModifer nm = new NewModifer(); nm.x = 100; nm.Invoke(); Console.WriteLine(nm.x);
我们可以得到下面的结果:
再来测试一下基类的x是不是被子类的x方法覆盖了:
static void Main(string[] args) { DerivedNewModifer dnm = new DerivedNewModifer(); dnm.Invoke(); dnm.x(); int test = dnm.x;
这个时候,我们的编译都会出现如下错误,说明已经找不到x这个int变量了,只有x这个方法。
好了,关于C#的new修饰符就讲到这里了,希望大家能够喜欢。
Recent Comments