这个不可变属性可以转换为自动属性吗?

时间:2016-08-30 11:15:05

标签: c# c#-6.0

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

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

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

有没有办法在这种类型的自定义getter中使用自动属性?

1 个答案:

答案 0 :(得分:6)

不幸的是,没有。自动属性是具有自定义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#不允许字段初始值设定项引用其他实例字段,因为the compiler might rearrange the initialization order。在VB.NET中,字段按照它们出现的顺序进行初始化,这可以写成如下:

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