为什么字符串数据类型有一个.ToString()方法?
类型 System.String
和 .NET 中的几乎所有类型一样,都派生自System.Object
。 Object
有一个ToString()
方法,因此 String
继承了该方法。这是一个虚方法,String
覆盖它以返回对自身的引用,而不是使用默认实现返回类型名称。
从 Reflector 中,这是 Object
中 ToString 的实现:
public virtual string ToString()
{
return this.GetType().ToString();
}
这是 String
中的覆盖:
public override string ToString()
{
return this;
}
正如Mark指出的那样,它只返回对自身的引用。但是,这为什么很重要呢?所有基本类型都应该返回自己的字符串表示形式。想象一下一个像这样工作的日志记录函数:
public void Log(object o) {
Console.WriteLine(o.ToString());
}
这允许您传递任何基本类型并记录其内容。如果没有返回字符串本身,它将仅打印出"字符串"而不是其内容。您也可以使用模板函数完成同样的事情。
认为这很傻?这基本上就是字符串格式化函数所做的事情。当您执行以下操作时,它调用"ToString":
Console.WriteLine("{0}", myString);
String是一个对象,它不是一种数据类型。因为String是一个对象,它继承了根对象的ToString()方法。
就像在Java、Objective-C或Scala中一样:)
即使对于Java来说也是如此,我认为大多数面向对象编程语言都有这个问题,需要对对象进行字符串表示,因为默认情况下创建的每个类都继承自Object,从而具有toString()方法。请记住,它仅适用于对象而不适用于原始类型。
如果你的字符串为NULL并且使用.ToString(),你将会得到Null Reference Exception异常;
以下代码会抛出异常:
string.Format("msgBoxTitle = {0}", msgBoxTitle.ToString())
string.Format("msgBoxTitle = {0}", msgBoxTitle)