C# 为什么/何时覆盖ToString是合适的?
我正在学习C#,我想知道重写C# 为什么/何时覆盖ToString是合适的?,c#,overriding,C#,Overriding,我正在学习C#,我想知道重写到字符串的意义和好处是什么,如下例所示 这可以用一种更简单的方法来完成吗,使用一个没有覆盖的通用方法 public string GetToStringItemsHeadings { get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); } } public override string ToString() { string strOut
到字符串
的意义和好处是什么,如下例所示
这可以用一种更简单的方法来完成吗,使用一个没有覆盖的通用方法
public string GetToStringItemsHeadings
{
get { return string.Format("{0,-20} {1, -20}", "Office Email", "Private Email"); }
}
public override string ToString()
{
string strOut = string.Format("{0,-20} {1, -20}", m_work, m_personal);
return strOut;
}
重写ToString()
允许您为类提供有用的人类可读的字符串表示
这意味着输出可以显示有关类的有用信息。例如,如果您有一个Person类,您可以选择让ToString()
输出该人员的id、名字、姓氏等。这在调试或日志记录时非常有用
关于你的例子,在不知道这个类是什么的情况下很难判断你的重写是否有用,但是实现本身是可以的。如果你不重写
ToString
,那么你就得到了你的基类实现,对于Object
,它只是类的简短类型名
如果您想要ToString
的其他更有意义或有用的实现,请重写它
当使用您类型的列表作为
列表框
的数据源时,这会很有用,因为ToString
将自动显示
另一种情况是,当您想将类型传递给String.Format
时,它调用ToString
来获取类型的表示形式。- 是否需要覆盖
编号到字符串
- 你能用另一种方式得到对象的字符串表示吗是。
ToString
您使用的方法对所有对象都是通用的,因此其他类都知道这个方法。例如,每当.NET framework想要将对象转换为字符串表示时,ToString
是主要候选对象(如果您想提供更详细的格式设置选项,还有其他选项)
具体地说,
Console.WriteLine(yourObject);
将调用对象。ToString()将对象转换为其字符串表示形式。如果您想更改用户在您创建的类上调用
ToString()
时返回的内容,那么您需要重写该类中的ToString()
。这实际上是一个很好的练习
ToString()
在许多地方用于返回对象的字符串表示形式,通常供用户使用。通常,可以使用相同的字符串来重新水化对象(例如,想想int
或DateTime
),但这并不总是给定的(例如,一棵树可能有一个有用的字符串表示形式,它只显示一个计数,但显然不能用它来重建它)
特别是调试器将使用它在监视窗口、即时窗口等中显示变量,因此ToString
对于调试来说实际上是非常宝贵的
通常,这种类型通常也会有一个显式成员返回字符串。例如,Lat/Long对可能具有
ToDecimalDegrees
,例如返回“-10,50”
,但它也可能具有ToDegreesMinuteSeconds
,因为这是Lat/Long对的另一种格式。同样的类型也可能会覆盖ToString
,为调试之类的事情提供“默认值”,甚至可能为呈现网页之类的事情提供“默认值”(例如,Razor中的@
构造将非字符串表达式的ToString()
结果写入输出流).我将直接从.NET开发系列中给出答案
避免从到字符串引发异常
考虑返回与实例关联的唯一字符串
考虑将ToString
的输出作为此类型上任何解析方法的有效输入
确保ToString
没有明显的副作用
仅在请求适当的权限后,才通过覆盖ToString
来报告安全敏感信息。如果权限要求失败,则返回不包含安全敏感信息的字符串
Object.ToString
方法用于常规显示和调试目的。默认实现只提供对象类型名称。默认实现不是很有用,建议重写该方法
DOoverrideToString
只要可以返回有趣的人类可读字符串。默认实现不是很有用,自定义实现几乎总能提供更多的价值
与唯一但不可读的ID相比,您更喜欢友好的名称
同样值得一提的是,Chris Sells在指南中也解释了ToString
对用户界面通常是危险的。一般来说,我的经验法则是公开一个用于将信息绑定到UI的属性,并将ToString
覆盖保留下来,以便向开发人员显示诊断信息。您还可以使用DebuggerDisplayAttribute
装饰您的类型
DO尽量使从ToString
返回的字符串保持简短。调试器使用ToString
获取要显示给开发人员的对象的文本表示。如果字符串长度超过调试器可以显示的长度,则会妨碍调试体验
返回区域性相关信息时,根据当前线程区域性设置字符串格式
DO提供重载ToString(字符串形式
TCP:[destination:000, source:000]
print(array.ToString());
print(array.ToVerboseString());
public override ToString() {
return string.Format("{0,-20} {1, -20}", m_work, m_personal);
}
public ToString(string formatter) {
string formattedEmail = this.ToString();
switch (formatter.ToLower()) {
case "w":
formattedEmail = m_Work;
break;
case "p":
formattedEmail = m_Personal;
break;
case "hw":
formattedEmail = string.Format("mailto:{0}", m_Work);
break;
}
return formattedEmail;
}