C# new 修饰符

在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#代码不开源,不能看到底层代码的实现,暂且先相信这句话)会根据.号前面的对象来决定运行哪一个方法。

当然在使用中要尽量避免这样用,避免给代码维护者代码不必要的误解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值