在C#中new修饰符可以用来创建一个对象,也可以重新定义从基类继承下来的非virtual成员。但是在使用new修饰符的过程中需要特别注意以下问题。
来看一组代码:
定义基类:BasePersion
public class BasePersion
{
public void SayHellow()
{
Console.WriteLine("this is BaseClass");
Console.ReadKey();
}
public virtual void SayHellow2()
{
Console.WriteLine("this is BaseClass virtual method ");
Console.ReadKey();
}
}
定义子类:MyPersion
public class MyPersion : BasePersion
{
public new void SayHellow()
{
Console.WriteLine("this id MyPersionClass");
Console.ReadKey();
}
public override void SayHellow2()
{
Console.WriteLine("this id MyPersionClass method ");
Console.ReadKey();
}
}
Main方法:
private static void Main(string[] args)
{
BasePersion persion = new MyPersion();
persion.SayHellow();//打印的结果是?
BasePersion persion2 = new MyPersion();
persion2.SayHellow2();//打印的结果是?
}
输出结果如下:
是不是很困惑,明明new的是MyPersion 为什么打印的是 BaseClass?
实际上,new修饰符并不会把本来非虚的方法转变成虚方法,而是会在类的命名空间里面另外创建一个方法,非虚的方法是静态绑定的(这句话来源于《Effective C#》 第39页 因C#代码不开源,不能看到底层代码的实现,暂且先相信这句话)会根据.号前面的对象来决定运行哪一个方法。
当然在使用中要尽量避免这样用,避免给代码维护者代码不必要的误解。