我想重新定义的ToString()函数在我的课之一。
我写
public string ToString()
...和它的正常工作。 但ReSharper的告诉我这个更改为
public new string ToString()
要么
public override string ToString()
有什么不同? 为什么C#要求是这样的?
我想重新定义的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
,只有第一个将使用新版本; 第二个将使用原来的执行。
我不认为我见过的任何人使用方法,遮盖力(又名new
上) ToString()
的问题是,的ToString是一个虚拟方法。 为了覆盖在C#中的虚方法,你需要指定override关键字。
你几乎肯定不希望“新”版本。 。
该新的改性剂将隐藏或“阴影”与在基类,其中作为同一签名的构件首要提供一个新的实现从基类继承的成员的。 这里是一个很好的文章在阴影和压倒一切的差异。
要覆盖。 这确实对躲藏在你的情况没有优势(用“新”)。
这里有一篇文章重写和隐藏之间的差异 。
C#并不需要它; ReSharper的一样。 它需要它,因为这两个关键字代表显著不同的行为,如果不指定,别人读你的代码可能不是完全清楚有关的失责行为是(它的new
。)
在这种情况下,你显然希望重写。
的ToString是在基类的虚拟方法。 为了使当前成员重写该实现,加上override关键字。 否则,添加新的关键字。
你做什么都取决于你想要的行为。 本文介绍的ToString的行为是如何工作的这取决于你如何在你调用toString上一个类层次结构中定义的方法和什么样的水平。
从我个人的建议是不要使用隐藏; 它会导致许多模糊之处,解决了一些。
ToString()方法可用于在.NET每一种类型的 ,因为该方法被定义为在基System.Object类的虚拟方法,和所有类型的直接或间接地从System.Object继承。 如果ToString()方法的默认实现不服务器你的目的,你可能希望重写(使用override关键字)或隐藏(使用new关键字)它。
我所遇到下列2篇优秀的文章解释原因重写ToString()方法,和方法隐藏和方法重载的区别。 还有在同一概念的YouTube视频
原因重载的ToString()
方法隐藏和方法重载的区别