列出具有私有集</t>的<t>属性

时间:2012-03-05 09:06:21

标签: c# list private

我想知道是否:

private List<FixedTickProvider> minorTickProviders;
public List<FixedTickProvider> MinorTickProviders { get { return minorTickProviders; } }

相当于:

public List<FixedTickProvider> MinorTickProviders { get; private set; }
事情是:我继承了第一段代码,而我自己更习惯第二种选择。由于Is即将重写代码部分,我想知道这两个代码是否完全相同。

请注意,我不是在谈论只读列表。我完全了解所讨论的“只读列表”主题here,我的问题略有不同。

注意:我几乎可以肯定我曾经读过一篇文章,说明编译器会从这两个摘录中生成完全相同的代码,但我找不到它,也无法找到关于这个主题的精确答案。所以请赐教。

3 个答案:

答案 0 :(得分:3)

在C#3.0及更高版本中,当属性访问器中不需要其他逻辑时,自动实现的属性使属性声明更简洁。它们还使客户端代码能够创建对象。声明属性时,编译器会创建一个专用的匿名支持字段,只能通过属性的get和set访问器进行访问。 所以,两者都会有相同的输出......

答案 1 :(得分:2)

是的,两段代码都会达到相同的效果

//here you are declaring a private field of class
private List<FixedTickProvider> minorTickProviders;
//and only exposing get to rest of the code
public List<FixedTickProvider> MinorTickProviders { get { return minorTickProviders; } }

//here you are declaring a public property which can only be set by the class which is declaring it
public List<FixedTickProvider> MinorTickProviders { get; private set; }

就IL而言,会有轻微差异

如果出现单独的字段和属性,则会生成IL enter image description here

如果是没有支持字段的单一财产

enter image description here

答案 2 :(得分:0)

它们实现了相同的结果,除了分配值的任何代码在两者之间是不同的(第一个将分配给字段,第二个将分配给属性),因此,当然,生成的IL将略有不同也不同。


(当然,在属性赋值的情况下,方法调用和最终字段赋值很可能很简单,可以内联)