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

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

我写

public string ToString() 

……而且工作正常。 但ReSharper告诉我要改变它

 public new string ToString() 

要么

 public override string ToString() 

有什么不同? 为什么C#需要这样的东西?

如果使用public string ToString() ,则不清楚您打算做什么。 如果您的意思是通过多态来改变ToString的行为,那么override 。 你可以添加一个new ToString() ,但这很愚蠢。 不要那样做!

不同之处在于:

 MyType t = new MyType(); object o = t; Console.WriteLine(t.ToString()); Console.WriteLine(o.ToString()); 

如果override ,两者都将输出新版本。 如果你是new ,只有第一个会使用你的新版本; 第二个将使用原始实现。

我不认为我曾经见过任何人在ToString()上使用方法隐藏(又名new ToString()

问题是ToString是一个虚方法。 要覆盖C#中的虚方法,您需要指定override关键字。

你几乎肯定不想要“新”版本。 。

new修饰符将隐藏或“隐藏”基类中具有相同签名的成员,其中重写提供从基类inheritance的成员的新实现。 这是一篇关于阴影和覆盖之间差异的好文章 。

你想要覆盖。 隐藏在你的情况下(使用“新”)真的没有优势。

这是一篇关于覆盖和隐藏之间差异的文章。

C#不需要它; Resharper确实如此。 它需要它,因为这两个关键字表示显着不同的行为,如果您没有指定,那么读取您的代码的人可能不完全清楚默认行为是什么(它是new

在这种情况下,你显然想要覆盖。

ToString是基类中的虚方法。 要使当前成员覆盖该实现,请添加override关键字。 否则添加新关键字。

你所做的一切取决于你想要的行为。 本文解释了ToString的行为如何工作取决于您如何定义方法以及您调用ToString的类层次结构中的级别。

我个人的建议是不要使用隐藏; 它引起了许多含糊之处并且解决了很少的问题。

ToString()方法适用于.NET中的每个类型 ,因为此方法在基本System.Object类中定义为虚方法,并且所有类型都直接或间接从System.Objectinheritance。 如果ToString()方法的默认实现不服务于您的目的,您可能希望覆盖(使用override关键字)或隐藏(使用new关键字)它。

我遇到了以下2篇优秀文章,解释了重写ToString()方法的原因,以及方法隐藏和方法覆盖之间的区别。 还有一个关于相同概念的YouTubevideo
覆盖ToString()的原因
方法隐藏和方法覆盖之间的区别