Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么/何时覆盖ToString是合适的?_C#_Overriding - Fatal编程技术网

C# 为什么/何时覆盖ToString是合适的?

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

我正在学习C#,我想知道重写
到字符串
的意义和好处是什么,如下例所示

这可以用一种更简单的方法来完成吗,使用一个没有覆盖的通用方法

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
方法用于常规显示和调试目的。默认实现只提供对象类型名称。默认实现不是很有用,建议重写该方法

DOoverride
ToString
只要可以返回有趣的人类可读字符串。默认实现不是很有用,自定义实现几乎总能提供更多的价值

与唯一但不可读的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;
}