【发布时间】:2010-05-06 06:11:08
【问题描述】:
为什么字符串数据类型有.ToString()方法?
【问题讨论】:
为什么字符串数据类型有.ToString()方法?
【问题讨论】:
System.String 类型与 .NET 中的所有类型 almost 一样,派生自 System.Object。 Object 有一个 ToString() 方法,所以 String 继承了这个方法。它是一个虚方法,String 覆盖它以返回对自身的引用,而不是使用返回类型名称的默认实现。
来自Reflector,这是Object中ToString的实现:
public virtual string ToString()
{
return this.GetType().ToString();
}
这是String中的覆盖:
public override string ToString()
{
return this;
}
【讨论】:
String 是一个对象,它不是数据类型。因为String是一个对象,所以它从Root Object继承了ToString()方法。
就像在 Java、Objective-C 或 Scala 中一样:)
【讨论】:
这对于 java 来说也是如此,我认为大多数面向对象的编程语言都有 this ,这是所讨论对象的字符串表示形式,因为默认情况下您创建的每个类都从 Object 扩展,从而导致具有 toString() 方法,请记住它仅适用于不适用于前置类型的对象。
【讨论】:
正如 Mark 所指出的,它只是返回对自身的引用。但是,为什么这很重要?所有基本类型都应返回其自身的字符串表示形式。想象一个像这样工作的日志记录函数:
public void Log(object o) {
Console.WriteLine(o.ToString());
}
这允许您传递任何基本类型并记录其内容。如果没有字符串返回自身,它只会打印出“字符串”而不是它的内容。你也可以用模板函数做同样的事情。
觉得这很傻?这基本上就是字符串格式化函数的作用。当您执行此操作时,它会调用“ToString”:
Console.WriteLine("{0}", myString);
【讨论】:
如果您的字符串为 NULL 并且您使用 .ToString();,您将获得 Null 引用异常;
以下将抛出:
string.Format("msgBoxTitle = {0}", msgBoxTitle.ToString())
最好只写...这不会抛出。
string.Format("msgBoxTitle = {0}", msgBoxTitle)
【讨论】:
C# 中的任何对象都有一个 to string 方法,虽然我想不出为什么在 ToString() 继承自对象类型(当然是字符串)时将字符串转换为字符串的原因就是一个例子。
【讨论】: