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()的原因
方法隐藏和方法覆盖之间的区别