【问题标题】:list<T> property with private setlist<T> 具有私有集的属性
【发布时间】:2012-03-05 09:06:21
【问题描述】:

我想知道是不是这样:

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

等价于:

public List<FixedTickProvider> MinorTickProviders { get; private set; }

问题是:我继承了第一段代码,而我自己更习惯于第二个选项。由于 Is 即将重新编写代码部分,我想知道这两者是否完全相同。

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

注意:我几乎可以肯定我曾经读过一篇文章,指出编译器会从这两个提取物中生成完全相同的代码,但我再也找不到它,也找不到关于这个主题的准确答案。所以请赐教。

【问题讨论】:

  • 如您所知,该代码在功能上是等效的。您是在询问性能差异吗?
  • 我没有特别询问任何事情,我想知道任何区别,无论是性能方面还是其他方面。这更像是“我想了解更多有关该主题的信息”。不是一个实际的“问题”。因此,欢迎任何有关该主题的内容

标签: c# list private


【解决方案1】:

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

【讨论】:

    【解决方案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之后的单独字段和属性将生成

    如果单个属性没有支持字段

    【讨论】:

    • 愚蠢的问题:可以肯定的是,IL = 内部逻辑,对吧? (以前从未见过 IL 的缩写)
    • 不,它表示中间语言。每个 .Net 代码都被编译并转换为 IL。它不直接转换并存储为机器代码。在运行时,这个 IL 被转换成机器码并被执行
    • 啊,这就是英语中的术语。谢谢,我也一直在寻找它:p
    【解决方案3】:

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多