Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中使用新关键字#_C#_.net_Inheritance - Fatal编程技术网

C# 在c中使用新关键字#

C# 在c中使用新关键字#,c#,.net,inheritance,C#,.net,Inheritance,我有两节课 class A { public virtual void Metod1() { Console.WriteLine("A.Method1"); } } class B : A { public new void Metod1() { Console.WriteLine("B.Method1"); } } 然后我编写一些代码来声明这些类的实例,并调用它们的方法 static vo

我有两节课

class  A
{
     public virtual void Metod1()
     {
         Console.WriteLine("A.Method1");
     }
}

class B : A
{
    public new void  Metod1()
    {
        Console.WriteLine("B.Method1");
    }
}
然后我编写一些代码来声明这些类的实例,并调用它们的方法

     static void Main(string[] args)
    {
        A a = new B();
        a.Metod1();
        B b = new B();
        b.Metod1();
        Console.ReadKey();
    }
我给出了以下结果:

A.Method1
B.Method1
但当我从类B的SignatureMethod1中删除关键字new并运行Main方法时,我得到了相同的结果。 问题:方法签名中的新关键字是否只是为了更好的可读性

编辑:在某些情况下,我们不能没有一个新的关键字吗

在C#中,派生类中的方法可以与方法同名 在基类中。您可以通过使用指定方法的交互方式 新建和覆盖关键字。“覆盖”修改器扩展了基础 类方法,,新修改器将其隐藏

通过使用new,您声明您知道该成员 它修改将隐藏从基继承的成员 类

new关键字让代码读取器知道此方法将在其基中隐藏具有相同名称的方法。即使您使用了它,编译器也会以同样的方式处理它,但会警告您这一点

由于已将该方法声明为虚拟方法,因此在编译时会收到以下警告:

“B.Metod1()”隐藏继承的成员“A.Metod1()”。要使当前成员覆盖该实现,请添加override关键字。否则,添加新关键字

但是,如果通过删除虚拟身份更改声明:

  • A

    class A {
        public void Metod1() {
            Console.WriteLine("A.Method1");
        }
    }
    
    class B: A {
        public void Metod1() {
            Console.WriteLine("B.Method1");
        }
    }
    
仍将编译,但警告消息为:

B.Method1 B.Method1 “B.Metod1()”隐藏继承的成员“A.Metod1()”。如果打算隐藏,请使用新关键字

无论采用上述哪种方式,均应满足以下要求:

  • 测试代码

    var b=new B();
    b.Metod1();
    (b as A).Metod1();
    
将输出:

B.Method1 A.Method1 那么输出将是:

B.Method1 B.Method1
在这种情况下,不能只使用new,因为
A
要求派生类重写
Method1

是的,你是对的,这是为了在这种情况下更好的可读性

但是仔细检查,在隐藏基本方法时,您应该有一个警告,即不要使用new

您可以在此处阅读更多内容:

您写这篇文章是为了在这种情况下提高可读性。但是,在某些情况下,如果没有新的keyword@cosset是的,当它不用作修饰符时,即:Class1 C=new Class1()或当您设置将警告视为错误时。是否存在在方法签名中没有新关键字的情况,fields@cossetNew关键字可以在泛型声明中用作运算符、修饰符和约束-只有当它用作修饰符时,才可以省略,但代价是警告,在其他情况下,如果不更改代码行为,则不能忽略它。必须在类B中使用override或new,否则它会隐藏父元素的方法。。默认情况下是新的,所以如果你不放新的,它不会给你带来错误和运行罚款。边注:考虑“混淆读者和代码的用户”是主要的使用“新”在这样的背景下。在某些情况下,使用它可能会提高可读性(即,需要为某些不友好的基类派生类),但在大多数情况下,它只会使人们更难理解何时调用基类的方法以及何时派生一个方法。没关系,但问题是:方法签名中的新关键字是否只是为了更好的可读性,并且在某些情况下,我们不能没有新关键字,所以它实际上不会改变任何行为——这只是为了可读性??基类是否仍然需要在派生中的
new
方法中的
virtual
来产生任何影响?在我的测试中,对派生类使用
new
与不使用
override
具有相同的行为-我缺少什么?什么是
隐藏它
abstract class A {
    public abstract void Metod1();
}

class B: A {
    public override void Metod1() { // use `new` instead of `override` would not compile
        Console.WriteLine("B.Method1");
    }
}