C#:public new string ToString()VS public override string ToString()

时间:2009-06-18 19:57:59

标签: c# oop

我想在我的一个类中重新定义ToString()函数。

我写了

public string ToString()

......它工作正常。但ReSharper告诉我要将其更改为

public new string ToString() 

public override string ToString()

有什么区别?为什么C#需要这样的东西?

9 个答案:

答案 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”)确实没有优势。

这是关于the differences between overriding and hiding的文章。

答案 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