我想在我的一个类中重新定义ToString()函数。
我写了
public string ToString()
......它工作正常。但ReSharper告诉我要将其更改为
public new string ToString()
或
public override string ToString()
有什么区别?为什么C#需要这样的东西?
答案 0 :(得分:34)
如果您使用public string ToString()
,则不清楚打算做什么。如果您的意思是通过多态来改变ToString
的行为,那么override
。您可以添加new ToString()
,但这很愚蠢。不要那样做!
区别在于你做的事情:
MyType t = new MyType();
object o = t;
Console.WriteLine(t.ToString());
Console.WriteLine(o.ToString());
如果你override
,两者都会输出你的新版本。如果你new
,只有第一个会使用你的新版本;第二个将使用原始实现。
我不认为我曾经看到有人在new
上使用隐藏方法(又名ToString()
)。
答案 1 :(得分:9)
问题是ToString是一种虚方法。要覆盖C#中的虚方法,您需要指定override关键字。
你几乎肯定不想要“新”版本。 。
答案 2 :(得分:4)
new modifier将隐藏或“隐藏”基类中具有相同签名的成员,其中overriding提供从基类继承的成员的新实现。这是关于阴影和覆盖之间差异的good article。
答案 3 :(得分:2)
你想要覆盖。隐藏在你的情况下(使用“new”)确实没有优势。
答案 4 :(得分:1)
C#不需要它; Resharper确实如此。它需要它,因为这两个关键字代表了截然不同的行为,如果你没有指定,那么阅读你的代码的人可能不完全清楚默认行为是什么(它是new
。)
在这种情况下,您显然想要覆盖。
答案 5 :(得分:1)
ToString是基类中的虚方法。要使当前成员覆盖该实现,请添加override关键字。否则添加新关键字。
答案 6 :(得分:0)
你所做的一切取决于你想要的行为。 This article解释了ToString的行为如何工作取决于您如何定义方法以及您调用ToString的类层次结构中的级别。
答案 7 :(得分:0)
我的个人建议是不要使用隐藏;它引起了许多含糊之处并且解决了很少的问题。
答案 8 :(得分:0)
ToString()方法适用于.NET 中的每种类型,因为此方法在基本System.Object类中定义为虚方法,并且所有类型都直接或间接从System继承。宾语。如果ToString()方法的默认实现不能达到您的目的,您可能希望覆盖(使用override关键字)或隐藏(使用new关键字)它。
我遇到了以下2篇优秀文章,解释了重写ToString()方法的原因,以及方法隐藏和方法覆盖之间的区别。还有一个关于相同概念的YouTube视频
Reason to override ToString()
Difference between method hiding and method overriding