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

时间:2015-06-23 08:27:58

标签: c# .net

假设我们有以下代码。

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

实际发生了什么?

  1. 将obj转换为字符串,然后调用ToString方法?
  2. 在obj上调用ToString方法,这是不重要的字符串覆盖?
  3. 别的什么?
  4. 女巫更好吗?

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

3 个答案:

答案 0 :(得分:2)

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

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

所以,我不认为有什么值得担心的。

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

答案 1 :(得分:2)

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

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

覆盖只返回this

2)我只会使用var bar = foo;代替演员或.ToString()。如果您只有一个对象,则首选是.ToString()

答案 2 :(得分:0)

  

实际发生了什么?

您的代码实际上可能是这样的

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

C#string关键字是String类的别名。 您调用的ToString方法只使用多态机制来调用正确的ToString实现。您可能知道string是引用类型和Object

的子类
  

女巫更好吗?

来自this回答。

  

这两个用于不同目的。 ToString方法   任何对象都应该返回该字符串的表示形式   宾语。投射是完全不同的,'as'关键词执行   有条件的演员,如前所述。 'as'关键词基本上是说   “如果那个对象是这个,请给我一个这种类型的引用   输入“ToString说”给我一个字符串表示   对象“。在某些情况下结果可能相同但两者应该相同   从来没有被认为可以互换,因为正如我所说,它们的存在   不同的目的。如果你的意图是施展那么你应该   总是使用强制转换,而不是ToString。

相关问题