c# - 在 C# 中使用 new 关键字

标签 c# .net inheritance

这个问题在这里已经有了答案:





new keyword in method signature

(9 个回答)


8年前关闭。




我有两个类

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 类的签名方法 1 中删除关键字 new 并运行 Main 方法时,我得到了相同的结果。
问题:方法签名中的 new 关键字是否只是为了更好的可读性?

编辑:是否有我们不能没有新关键字的情况?

最佳答案

new 关键字让代码阅读器知道此方法将在其基础中隐藏具有相同名称的方法。即使你省略了它,编译器也会以同样的方式对待它,但会警告你。

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

'B.Metod1()' hides inherited member 'A.Metod1()'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword.



但是,如果您通过删除 virtual 来更改声明:
  • A中无虚拟声明
    class A {
        public void Metod1() {
            Console.WriteLine("A.Method1");
        }
    }
    
    class B: A {
        public void Metod1() {
            Console.WriteLine("B.Method1");
        }
    }
    

  • 仍会编译,但警告消息将是:

    'B.Metod1()' hides inherited member 'A.Metod1()'. Use the new keyword if hiding was intended.



    以上述任何一种方式,以下内容:
  • 测试代码
    var b=new B();
    b.Metod1();
    (b as A).Metod1();
    

  • 将输出:
    B.Method1
    A.Method1
    

    But, if you declare as the following:

    • Declaration with override in B

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

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

      That is because Method1 of the base class is not just hidden but overridden by the derived class.

      A case that you cannot just use new is that if Method1 is a abstract method in a abstract class:

      • Code that must use override in derived classes

        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");
            }
        }
        

      • 在这种情况下,您不能只使用 new,因为 A需要派生类覆盖 Method1 .

    关于c# - 在 C# 中使用 new 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15803965/

    相关文章:

    c++ - 声明指向基类和派生类的指针

    c# - 卡在Json API调用中的DateTime对象名称

    c# - 如何简化具有多个OR案例的if条件

    c# - 外键属性无效? ( Entity Framework 代码先)

    c# - 不一致 “Cross-thread operation not valid”异常

    c# - 用于在 CLR 上实现语言的书籍和文献

    PHP Doctrine 继承

    c# - 使用ROLEX从OWL文件中以编程方式生成程序集

    c# - Excel工作表修改当前工作表C#

    c++ - 覆盖虚拟方法时,Cat 与 Animal 不协变