【问题标题】:What does a String Property GET return?字符串属性 GET 返回什么?
【发布时间】:2013-05-01 18:54:54
【问题描述】:

在 C# 中

假设我有以下内容:

public String whatHappens{ get; set; }

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

然后我在这里打电话

Console.WriteLine(whatHappens);

GET 调用是否返回一个字符串对象和 Console.WriteLine 调用 ToString() 或者 GET 调用是否依次调用字符串类中的 ToString() 方法并返回一个字符串。

这不是学校问题,而是我和我的同事正在争论的问题。

【问题讨论】:

  • 属性getter返回对字符串对象的引用,调用接受字符串的Console.WriteLine()的重载,根本不调用ToString()。 (请注意,编译器会为类生成一个隐藏字符串字段以实现自动字符串属性,例如您指定的那个,它是对从 getter 返回的隐藏字符串字段的引用。)
  • 你不必.ToString()string;已经是string

标签: c# string theory


【解决方案1】:

在您的示例中,您使用了自动属性。自动属性有一个额外的隐藏字段,即支持字段。此字段与属性的类型相同,在您的情况下为字符串。

在此属性内,代码不会调用 ToString(),因为支持字段已经是 string 类型。

Console.WriteLine 有很多重载。其中一个重载接受string 类型的参数。所以在Console.WriteLine里面就不需要调用ToString()了,因为参数已经是那个类型了。

简而言之:不会在任何地方调用ToString()

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

另一方面,如果调用了Console.WriteLine 的另一个重载,其中参数类型为object,则WriteLine 必须在某个时候调用ToString()

【讨论】:

  • 倒数第二个“段落”中的措辞听起来好像ToString() 不需要自动属性。 ToString() 在类型不是 String 的任何情况下都会被调用。
  • @Cemafor:任何自动属性都不会调用任何转换方法,因为支持字段始终与属性的类型相同。如果它们属于同一类型,为什么要转换数据。那只会消耗性能。
  • 我的意思是在调用Console.WriteLine(whatHappens); 的情况下,我认为这是调用ToString() 的问题。
  • @Cemafor:仅当数据从一种类型转换为另一种类型时才会发生转换操作。在您的示例中,它没有。
  • 我的意思是,例如,您的财产是否属于 double 类型。当您调用Console.WriteLine(thisIsADouble); 时,WriteLine 函数将在内部调用 thisIsADouble.ToString()。 WriteLine 需要某种方式来获取它想要写出的任何内容的字符串表示形式。所以如果它不是String,它会调用ToString()函数来获取它。
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 2020-08-13
  • 2019-01-19
相关资源
最近更新 更多