【问题标题】:Making a property getter and setter equal something (auto-property initializer)使属性 getter 和 setter 相等(自动属性初始化器)
【发布时间】:2019-01-27 12:53:38
【问题描述】:

两者有什么区别:

public List<MyType> Something{ get; set; } = new List<MyType>();

public List<MyType> Something{ 
    get{
        return new List<MyType>();
    }
    //set...
}

背景:
我不确定我在代码中看到的行为。构造函数上有一个服务,但 null 在未来的方法调用中,我假设是该类的同一个实例。

【问题讨论】:

  • 投反对票的原因是什么 :) ?直截了当,只包括问题所需的内容,搜索了我能找到的任何内容,但不知道正确搜索的单词。不知道我还能在这里做些什么来使问题变得更好?另外,我在几秒钟内就得到了答案。
  • 可能是因为代码没有编译。 'Something.set' must declare a body because it is not marked abstract, extern, or partial
  • 感谢@fredrik - 我已经更新了 Q 以供未来窥视。
  • 您可以通过添加断点轻松调试此行为,此时您应该注意到每次访问 getter 时都会调用 return new List&lt;MyType&gt;();。另外,您应该包括为什么您提出这个问题,我想是因为您可能没有看到列表的内容被保留。
  • 我的问题与曾经存在但第二次没有的服务的实例化有关。所以对差异/行为感到困惑。这就是我来这里的原因。感谢您的意见@Igor

标签: c# properties


【解决方案1】:

第一行:

public List<MyType> Something{ get; set; } = new List<MyType>();

将在实例化对象(具有此属性)时调用一次。这是Something 实例的一次性创建。

第二个例子是 getter 的显式实现。每次访问 Something 的 getter 时,它都会返回一个新的空列表。

编辑:

第一行称为auto-property initializer,详细答案请查看a post by Jon Skeet。此功能自 C# 6.0 起就存在

【讨论】:

  • 谢谢!考虑到我所看到的行为,这是有道理的:D
  • 感谢您的加入!
  • @Jimmyt1988 答案对您有帮助吗?你愿意接受吗?=!还是您在等待进一步的答案?干杯队友