为什么字符串类型有一个.ToString()方法?

51
为什么字符串数据类型有一个.ToString()方法?
6个回答

76

类型 System.String 和 .NET 中的几乎所有类型一样,都派生自System.ObjectObject 有一个ToString() 方法,因此 String 继承了该方法。这是一个虚方法,String 覆盖它以返回对自身的引用,而不是使用默认实现返回类型名称。

从 Reflector 中,这是 Object 中 ToString 的实现:

public virtual string ToString()
{
    return this.GetType().ToString();
}

这是 String 中的覆盖:

public override string ToString()
{
    return this;
}

10

正如Mark指出的那样,它只返回对自身的引用。但是,这为什么很重要呢?所有基本类型都应该返回自己的字符串表示形式。想象一下一个像这样工作的日志记录函数:

public void Log(object o) {
    Console.WriteLine(o.ToString());
}

这允许您传递任何基本类型并记录其内容。如果没有返回字符串本身,它将仅打印出"字符串"而不是其内容。您也可以使用模板函数完成同样的事情。

认为这很傻?这基本上就是字符串格式化函数所做的事情。当您执行以下操作时,它调用"ToString":

Console.WriteLine("{0}", myString);

3

String是一个对象,它不是一种数据类型。因为String是一个对象,它继承了根对象的ToString()方法。

就像在Java、Objective-C或Scala中一样:)


这让我感到惊讶:),我之前认为C#和Java很像,那些东西没有toString方法:) - vodkhang
它不是大写的字符串,而是别名。编译后,该别名将被转换为大写的字符串。 - vodkhang
不,字符串永远不会装箱成为对象。http://stackoverflow.com/questions/215255/string-vs-string-in-c - vodkhang

3

即使对于Java来说也是如此,我认为大多数面向对象编程语言都有这个问题,需要对对象进行字符串表示,因为默认情况下创建的每个类都继承自Object,从而具有toString()方法。请记住,它仅适用于对象而不适用于原始类型。


1

如果你的字符串为NULL并且使用.ToString(),你将会得到Null Reference Exception异常;

以下代码会抛出异常:

string.Format("msgBoxTitle = {0}", msgBoxTitle.ToString())

最好直接写... 这不会抛出异常。
string.Format("msgBoxTitle = {0}", msgBoxTitle)

0
在C#中,任何对象都有一个ToString()方法,尽管我目前想不到为什么会将字符串强制转换为字符串。这是因为ToString()方法是从对象类型继承而来的,而字符串当然是其中的一个示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接