在方法签名中使用新关键字通常只是为了可读性?

我已经阅读了方法签名中的 new关键字并在本文中看到了下面的示例,但我仍然不明白为什么要在方法签名中编写new关键字。 如果我们省略它,它仍然会做同样的事情。 它会编译。 会有一个警告,但它会编译。

那么, 在方法签名中编写new内容只是为了提高可读性?

 public class A { public virtual void One() { /* ... */ } public void Two() { /* ... */ } } public class B : A { public override void One() { /* ... */ } public new void Two() { /* ... */ } } B b = new B(); A a = b as A; a.One(); // Calls implementation in B a.Two(); // Calls implementation in A b.One(); // Calls implementation in B b.Two(); // Calls implementation in B 

隐含在这个问题中:隐藏基类成员时为什么不需要new关键字? 原因是脆弱的基类问题 。 假设你有一个库:

 public class Base { public void M() { } } 

并且您在自己的代码库中派生了一个类:

 public class Derived : Base { public void N() { } } 

现在,库作者发布了一个新版本,为Base添加了另一个方法:

 public class Base { public void M() { } public void N() { } } 

如果方法隐藏需要new关键字,那么您的代码现在无法编译! 使新关键字可选意味着您现在拥有的所有内容都是一个值得担心的新警告。

编辑

正如Eric Lippert在评论中指出的那样,“担心的新警告”大大低估了警告的目的,即“挥动大红旗”。 我写这篇文章的时候一定很匆忙; 当人们反复地将警告视为可以容忍的烦恼而不是将其视为有用信息时,这是令人讨厌的。

编辑2

我终于找到了这个答案的来源,当然,这是Eric的post之一: https : //stackoverflow.com/a/8231523/385844

我的猜测是C#设计师希望我们意识到,通过不使用virtualoverride我们不会得到多态行为。 这就是大多数来自Java的人所期望的。 new清楚地表明,省略它会导致编译器发出警告。

不,这不是“可读性”! 它是明确清楚的,你不想意外地覆盖inheritance的虚拟消息或“影子”inheritance的方法,但真的想要给出一个方法的新实现。

它不是必需的,但我强烈推荐它。

MSDN

声明的变量与基类中的变量具有相同的名称。 但是,未使用新关键字。 此警告通知您应该使用new; 声明变量,就像在声明中使用了new一样。

  public static int i = 2; // CS0108, use the new keyword // the compiler parses the previous line as if you had specified: // public static new int i = 2; 

是的,只是为了便于阅读。

在子类的方法签名中,有或没有它的function相同。

…没有人出来说它,因为他们试图指出为什么你仍然可能想要使用它。 但是使用它的任何理由都是为了支持可读性