gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:19:08 24 4
gpt4 key购买 nike

我一直在研究我正在开发的应用程序,它大量使用了不可变性。我刚刚发现 C# 6.0 中有 getter-only 自动属性,所以我正在重构以使用它们。不过,我遇到了一个可能的问号,这就是我要公开的地方 private IList<T>对象为 ReadOnlyCollection<T>通过公共(public)属性,以避免将它们恢复为原始状态的可能性 List<T>对象,例如

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

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

有什么方法可以将自动属性与这种类型的自定义 getter 一起使用吗?

最佳答案

不幸的是,没有。自动属性是没有自定义 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反射(reflect)对基础集合所做的更改:

An instance of the ReadOnlyCollection<T> generic class is always read-only. A collection that is read-only is simply a collection with a wrapper that prevents modifying the collection; therefore, if changes are made to the underlying collection, the read-only collection reflects those changes.


注意:构造函数是必需的: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)

关于c# - 这个不可变属性可以转换为自动属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39226003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com