我已阅读方法签名中的new
关键字 ,并在this帖子上看过以下示例,但我仍然不明白为什么要编写{{ 1}}方法签名中的关键字 。如果我们省略它,它仍然会做同样的事情。它会编译。会有一个警告,但它会编译。
那么,在方法签名中编写new
只是为了提高可读性?
new
答案 0 :(得分:9)
隐含在这个问题中:隐藏基类成员时,为什么不需要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的帖子之一:https://stackoverflow.com/a/8231523/385844
答案 1 :(得分:5)
我的猜测是C#设计师希望我们注意到,如果不使用virtual
和override
,我们不会获得多态行为。这就是大多数来自Java的人所期望的。 new
清楚地说明了这一点,因为省略它会导致编译器发出警告。
答案 2 :(得分:2)
不,这不是“可读性”!它明确地表明,你不想意外地覆盖继承的虚拟消息或“影子”继承的方法,但是真的想要给出一个方法的新实现。
答案 3 :(得分:1)
它不是必需的,但我强烈推荐它。
声明变量的名称与基类中的变量相同。但是,未使用新关键字。此警告通知您应该使用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;
答案 4 :(得分:0)
......没有人出来说它,因为他们试图指出为什么你仍然想要使用它。但是使用它的任何理由都是为了支持可读性。