公共财产和不变性

发布于 2024-12-01 22:34:32 字数 451 浏览 0 评论 0原文

是否有更好的方法来确保以下 Test 类的不变性,而无需在每次访问属性 Array 时返回数组的新深层副本(请假设 DeepCopy () 是一个扩展方法,它创建数组的新深层副本)?

public class Test
{
    private SomeObject[] _array;

    public SomeObject[] Array
    {
        get { return (_array.DeepCopy();) }
    }

    public Test(SomeObject[] array) 
    {
        _array = array.DeepCopy();
    }
}

这涉及到在初始化时制作一份深层副本,并在每次访问属性时制作另一份深层副本。有没有更好的方法来实现不变性?

Is there a better way of ensuring immutability of the following Test class without returnin a new deep copy of the array every time property Array gets acessed (please assume that DeepCopy() is an extension method which makes a new deep copy of the array)?

public class Test
{
    private SomeObject[] _array;

    public SomeObject[] Array
    {
        get { return (_array.DeepCopy();) }
    }

    public Test(SomeObject[] array) 
    {
        _array = array.DeepCopy();
    }
}

That envolves making a deep copy at initialization and another one everytime the property gets accessed. Is there any better way to achieve immutability?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

薄荷港 2024-12-08 22:34:32

.NET1 没有使成员元素不可变的“深度不可变”集合。例如。 ReadonlyCollection 可防止添加/删除元素,但单个元素不会被复制,因此仍可能更改其属性。

因此,如果组成集合的元素本身不是不可变的,则必须复制它们。如果元素是不可变的,那么在集合周围放置一个浅层不可变的包装器(例如 ReadonlyCollection)就足够了。


1 考虑 BCL。像 F# 运行时这样的扩展是另一回事。

.NET1 has no "deeply immutable" collections that make member elements immutable. Eg. ReadonlyCollection<T> prevents elements being added/removed, but the individual elements are not copied so could still have their properties changed.

Therefore you have to copy the elements making up the collection if they are not themselves immutable. If the elements were immutable putting an shallowly immutable wrapper around the collection (like ReadonlyCollection<T>) would be sufficient.


1 Considering the BCL. Extensions like the F# runtime are a different matter.

转身以后 2024-12-08 22:34:32

System.Collections.Generic.List>>实现 AsReadOnly 函数,并且有一个 System.Collections.ReadOnlyCollectionBase 类,您可以从中继承一个表示只读元素集合的类。但是,虽然它们的行为类似于数组,但它们并不是真正的数组。实际的数组总是允许更改元素。因此,我能想到的唯一选择是像您所做的那样制作副本,或者将每个级别的对象包装在只读包装器中。

另请参阅:.NET 中的只读数组

System.Collections.Generic.List<> implements an AsReadOnly function, and there is a System.Collections.ReadOnlyCollectionBase class from which you can inherit a class that represents a collection of read-only elements. But while those behave like arrays, they are not actual arrays. An actual array always allows changing of the elements. So the only alternatives I can think of are making a copy as you are doing, or wrapping each level of objects in a read-only wrapper.

See also: Read-only array in .NET

带刺的爱情 2024-12-08 22:34:32

请参阅属性不应返回数组。这是运行 FxCop 时收到的消息之一。 Microsoft 页面建议的一种解决方案是返回 ReadOnlyCollection正如@BlueMonkMN 所建议的。您还可以使用 IEnumerable; (假设你可以相信消费者不会投射结果)。

See Properties should not return arrays. This is one of the messages you will get if you run FxCop. One solution the Microsoft page suggests is returning ReadOnlyCollection<T> as @BlueMonkMN suggests. You can also use IEnumerable<T> (assuming you can trust consumers not to cast the results).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文