我希望重新定义一个类中的ToString()函数。
我写了:
public string ToString()
我正在使用一个HTML段落标签,它可以正确工作。但是ReSharper提示我将其更改为
标签。public new string ToString()
或者
public override string ToString()
有何不同?为什么C#需要像这样的东西?
我希望重新定义一个类中的ToString()函数。
我写了:
public string ToString()
我正在使用一个HTML段落标签,它可以正确工作。但是ReSharper提示我将其更改为
标签。public new string ToString()
或者
public override string ToString()
有何不同?为什么C#需要像这样的东西?
public string ToString()
,那么你的意图不够明确。如果你想通过多态性改变ToString
的行为,那么请使用override
。你可以添加一个新的ToString()
,但这样做很愚蠢,请不要这样做!MyType t = new MyType();
object o = t;
Console.WriteLine(t.ToString());
Console.WriteLine(o.ToString());
override
,两个版本都会输出你的新版本。如果你使用new
,只有第一个版本会使用你的新版本;第二个版本将使用原始实现。ToString()
上使用方法隐藏(又称new
)。C#本身不需要,但Resharper需要。这是因为这两个关键字代表着显著不同的行为,如果你不指定,那么读取你代码的人可能无法完全清楚默认行为是什么(它是new
)。
在这种情况下,你明显想要覆盖默认行为。
ToString是基类中的虚方法。如果要使当前成员覆盖该实现,请添加override关键字。否则,添加new关键字。
在.NET中,ToString()方法适用于每种类型,因为该方法在基本的System.Object类中定义为虚拟方法,并且所有类型直接或间接继承自System.Object。如果默认的ToString()方法实现不能满足您的需求,您可以选择重写(使用override关键字)或隐藏(使用new关键字)它。
我找到了以下两篇优秀的文章,解释了重写ToString()方法的原因,以及方法隐藏和方法重写之间的区别。还有一个关于相同概念的YouTube视频。
重写ToString()方法的原因
方法隐藏和方法重写的区别