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修饰符就讲到这里了,希望大家能够喜欢。

You may also like...

Leave a Reply

Your email address will not be published.