我一直在浏览我正在开发的应用程序,它大量使用不变性。我刚刚发现只有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中使用自动属性?
答案 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)