是否可以将此不可变属性转换为auto属性?

本文关键字:属性 转换 auto 不可变 是否 | 更新日期: 2023-09-27 18:04:55

我一直在开发一个应用程序,它大量使用了不变性。我刚刚发现c# 6.0中只有getter自动属性,所以我正在重构以使用它们。我已经击中了一个可能的问号,这是我通过公共属性将private IList<T>对象暴露为ReadOnlyCollection<T>的地方,以避免它们被转换回原始List<T>对象的可能性,例如

private IList<string> tags = new List<string>();

public IEnumerable<string> Tags => new ReadOnlyCollection<string>(this.tags);

是否有任何方法使用自动属性与这种类型的自定义getter?

是否可以将此不可变属性转换为auto属性?

遗憾的是,没有。自动属性是没有自定义getter或setter的属性的快捷方式。


作为旁注:正如Sinatr在注释中正确提到的,您正在为每个属性调用创建一个ReadOnlyCollection的新实例。这对于房产来说并不常见。考虑每次都返回相同的实例:

private IList<string> tags = new List<string>();
public IEnumerable<string> Tags { get; }
public MyClass()
{
    Tags = new ReadOnlyCollection<string>(this.tags);
}

这可以工作,因为ReadOnlyCollection反映了对底层集合所做的更改:

ReadOnlyCollection<T>泛型类的实例总是只读的。只读的集合只是一个带有防止修改集合的包装的集合;因此,如果底层集合发生了更改,只读集合将反映这些更改。


注意:构造函数是必需的:c#不允许字段初始化项引用其他实例字段,因为编译器可能会重新安排初始化顺序。在VB。在NET中,字段是按照它们出现的顺序初始化的,可以这样写:

Private tagList As New List(Of String)()
Public ReadOnly Property Tags As IEnumerable(Of String) = New ReadOnlyCollection(Of String)(tagList)