[英]Should I override string cast or ToString method?
如果我要创建一个从根本上包含字符串消息但也包含与字符串消息关联的有用数据的类,那么是否有任何理由我应该重写ToString()方法,而不是定义对字符串的强制转换以获取对象的内部字符串信息?
例如,我有一个名为msg的Message对象,其text == "Hello"
但其中也包含有关文本来源的信息。 我想要Console.WriteLine(msg);
输出"Hello"
。 我应该重写ToString()
还是定义强制转换为字符串?
您应该重写ToString
方法。
首先: Console.WriteLine
接受object
并从中调用ToString
方法。
其次:在将来的某个时候,您可能需要创建从Message
派生的类。 让我们看一下:
using System;
using System.IO;
namespace Namespace
{
class StringCastBase
{
public static explicit operator string(StringCastBase o)
{
return "string cast base";
}
}
class StringCastDerived : StringCastBase
{
public static explicit operator string(StringCastDerived o)
{
return "string cast derived";
}
}
class ToStringOverridenBase
{
public override string ToString()
{
return "ToString overriden base";
}
}
class ToStringOverridenDerived : ToStringOverridenBase
{
public override string ToString()
{
return "ToString overriden derived";
}
}
class Programm
{
public static void Main()
{
StringCastBase scb = new StringCastBase();
Console.WriteLine((string)scb);
StringCastBase scd = new StringCastDerived();
Console.WriteLine((string)scd);
ToStringOverridenBase tsob = new ToStringOverridenBase();
Console.WriteLine(tsob);
ToStringOverridenBase tsod = new ToStringOverridenDerived();
Console.WriteLine(tsod);
}
}
}
输出将是
弦线铸造基地
弦线铸造基地
ToString重写的基础
ToString重写派生
由于scd
的静态类型为StringCastBase
,因此将调用StringCastBase
的转换方法(即使动态类型不是StringCastBase
)。 使用虚拟方法ToString
解决了此问题。
我会说最好的技术是让您的类实现一个名为(例如)“ Text”的只读属性,该属性提供主字符串。 您已经说过,该类包含消息文本之外的其他信息-因此,获取文本意味着从类中提取该数据。 这正是物业的目的!
为了方便起见,我可能还会重写ToString()-为了(a)协助调试,并且(b)确保如果ToString()被其他方法(例如Console.WriteLine())调用,则返回有意义的东西-正如他在回答中提到的那样。 请记住,ToString()的目的是提供对象的字符串表示形式,因此您可能会考虑是否要让ToString()仅返回主文本,或者是否希望它提供其他信息的指示该对象也包含。
在这种情况下,我绝对不会使用演员表。 从语义上来说,您所做的事情是错误的。 强制转换表示您正在将数据从一种类型转换为另一种类型。 但这不是您正在做的-您想从类中提取特定的数据(主要文本)。 为此目的使用演员表可能会使其他开发人员感到困惑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.