当实际类型为String时,调用Object.ToString会发生什么

本文关键字:ToString Object 什么 调用 类型 String | 更新日期: 2023-09-27 17:59:01

假设我们有以下代码。

var foo = "I am a string";
Object obj = foo;
var bar = obj.ToString();

实际发生了什么?

  1. 将obj强制转换为字符串,然后调用ToString方法
  2. 调用obj上的ToString方法,这是字符串的重写而不进行强制转换
  3. 还有别的吗

女巫一号更好做?

  1. var bar = obj.ToString();
  2. var bar = (string)obj;

当实际类型为String时,调用Object.ToString会发生什么

ToString是在Object类中定义的方法,然后在整个框架中的每个类中继承。

String类中的ToString方法已被一个简单返回自身的实现覆盖。因此,在String对象上调用ToString()没有任何开销。

所以,我认为没有什么可担心的。

此外,我会选择第一个选项。它可读性更强,无论"obj"是什么类型,都应该得到一个结果。

1)来自https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/String.cs:

// Returns this string.
public override String ToString() {
    Contract.Ensures(Contract.Result<String>() != null);
    Contract.EndContractBlock();
    return this;
}

覆盖仅返回this

2) 我只想使用var bar = foo;而不是强制转换或.ToString()。如果您只有一个对象,则首选"是".ToString()

实际发生了什么?

你的代码实际上可以是这样的

var foo = new String("I am a string".ToCharArray());
Object obj = foo;
var bar = obj.ToString();

C#string关键字是String类的别名。您调用的ToString方法只是使用多态性机制来调用正确的ToString实现。如您所知,stringObject的一个引用类型和子类

女巫一号更好做?

根据这个答案。

两者的目的不同。的ToString方法任何对象都应该返回该对象的字符串表示对象铸造是完全不同的,"as"关键字执行如前所述,条件转换。"as"这个关键词基本上说"如果该对象是键入",而ToString说"给我一个它的字符串表示对象"。在某些情况下,结果可能相同,但两者应该永远不要被认为是可互换的,因为正如我所说,它们的存在是为了不同的目的。如果你打算投,那么你应该始终使用强制转换,而不是ToString。