假设我有以下几点:
public String whatHappens{ get; set; }
假设属性已初始化和设置。
然后到这里我打电话
Console.WriteLine(whatHappens);
是否GET调用返回一个字符串对象和Console.WriteLine命令调用toString() OR 是否又将GET调用调用内的ToString()方法字符串类并返回一个字符串。
这不是一个学校的问题,这是我的同事和我有的论点。
假设我有以下几点:
public String whatHappens{ get; set; }
假设属性已初始化和设置。
然后到这里我打电话
Console.WriteLine(whatHappens);
是否GET调用返回一个字符串对象和Console.WriteLine命令调用toString() OR 是否又将GET调用调用内的ToString()方法字符串类并返回一个字符串。
这不是一个学校的问题,这是我的同事和我有的论点。
在你的例子中你使用了一个自动属性。自动属性具有额外的隐藏字段,即后台字段。这个字段与属性的类型相同,在你的情况下是一个字符串。
此属性内的代码将不会调用ToString()
,因为后台字段已经是string
类型。
Console.WriteLine
有许多过载。其中一个重载接受string
类型的参数。因此在Console.WriteLine
之内,不需要调用ToString()
,因为该参数已经是该类型的。
总之:没有ToString()
将被称为任何地方。
另一方面,如果该属性不是自动属性,并且该属性背后的字段是另一种类型,则需要使用ToString()
将其转换为字符串。
如果,另一方面,Console.WriteLine
另一个重载叫,其中参数是object
型,比WriteLine
有在某些时候调用ToString()
。
您的倒数第二个“段落”中的措词使它听起来像'ToString()'从不需要自动属性。在类型不是'String'的任何情况下,都会调用ToString()。 – Cemafor 2013-05-01 19:10:30
@Cemafor:任何自动属性都不会调用任何转换方法,因为后台字段总是与属性相同。为什么要转换数据,如果他们是相同类型的。这只会消耗性能。 – 2013-05-01 19:13:19
我的意思是在调用'Console.WriteLine(whatHappens);'的情况下,我想这是调用'ToString()'的问题出现的地方。 – Cemafor 2013-05-01 19:15:57
属性getter返回对字符串对象的引用,并调用接受字符串的Console.WriteLine()的重载,并且根本不调用“ToString()”。 (请注意,编译器会为该类生成一个隐藏的字符串字段,以实现一个自动字符串属性,例如您指定的字符串属性,并且它是对从该getter返回的该隐藏字符串字段的引用。) – 2013-05-01 18:56:23
您还没有到'.ToString()'''字符串';它已经是一个'字符串'了。 – JosephHirn 2013-05-01 18:59:19