2013-05-01 45 views
2

在C#什么是String属性GET返回?

假设我有以下几点:

public String whatHappens{ get; set; } 

假设属性已初始化和设置。

然后到这里我打电话

Console.WriteLine(whatHappens); 

是否GET调用返回一个字符串对象和Console.WriteLine命令调用toString() OR 是否又将GET调用调用内的ToString()方法字符串类并返回一个字符串。

这不是一个学校的问题,这是我的同事和我有的论点。

+5

属性getter返回对字符串对象的引用,并调用接受字符串的Console.WriteLine()的重载,并且根本不调用“ToString()”。 (请注意,编译器会为该类生成一个隐藏的字符串字段,以实现一个自动字符串属性,例如您指定的字符串属性,并且它是对从该getter返回的该隐藏字符串字段的引用。) – 2013-05-01 18:56:23

+2

您还没有到'.ToString()'''字符串';它已经是一个'字符串'了。 – JosephHirn 2013-05-01 18:59:19

回答

7

在你的例子中你使用了一个自动属性。自动属性具有额外的隐藏字段,即后台字段。这个字段与属性的类型相同,在你的情况下是一个字符串。

此属性内的代码将不会调用ToString(),因为后台字段已经是string类型。

Console.WriteLine有许多过载。其中一个重载接受string类型的参数。因此在Console.WriteLine之内,不需要调用ToString(),因为该参数已经是该类型的。

总之:没有ToString()将被称为任何地方。

另一方面,如果该属性不是自动属性,并且该属性背后的字段是另一种类型,则需要使用ToString()将其转换为字符串。

如果,另一方面,Console.WriteLine另一个重载叫,其中参数是object型,比WriteLine有在某些时候调用ToString()

+0

您的倒数第二个“段落”中的措词使它听起来像'ToString()'从不需要自动属性。在类型不是'String'的任何情况下,都会调用ToString()。 – Cemafor 2013-05-01 19:10:30

+0

@Cemafor:任何自动属性都不会调用任何转换方法,因为后台字段总是与属性相同。为什么要转换数据,如果他们是相同类型的。这只会消耗性能。 – 2013-05-01 19:13:19

+0

我的意思是在调用'Console.WriteLine(whatHappens);'的情况下,我想这是调用'ToString()'的问题出现的地方。 – Cemafor 2013-05-01 19:15:57

相关问题