gpt4 book ai didi

.net - 在 .NET 中表示不可变列表的最佳方式是什么?

转载 作者:行者123 更新时间:2023-12-04 17:05:09 27 4
gpt4 key购买 nike

我最近开始将 F# 用于“实际工作”,并重新发现了不可变数据结构的美妙之处,例如 F# 中的可区分联合和记录。我还发现它们可以直接从 C# 中使用,特别是因为它们不需要对 F# 运行时的任何直接依赖。但是,当谈到在这些结构中表示列表时,我还没有找到理想的解决方案。

我的第一次尝试是将列表键入为 seq<'a> (C# 世界中的 IEnumerable),它提供了一个很好的通用集合接口(interface),而无需像 ICollection<> 及其 friend 那样导出任何改变集合的方法。但是,由于我无法控制可区分联合或记录的构造函数,因此这些类型的实例的创建者可以提供一个 IEnumerable<> 实现,该实现在使用时可能会更改或抛出(例如 LINQ 表达式) .因此 IEnumerable<> 不会给我任何编译器的帮助来证明该值是不可变的,因此是线程安全的。

我目前的策略是使用 F# 列表类型,它确实保证了不可变集合,但增加了对 F# 运行时的依赖,并且在非 F# 项目中使用时看起来有点不对劲。但是,它确实允许 IEnumerable<> 不允许的 F# 模式匹配。它也没有在列表的实际表示中提供任何选择,并且在某些情况下(例如原始值的大型列表),F# 列表表示并不真正适合。

我真正希望看到的是 .NET 中的不可变数组类型,它与普通数组一样紧凑,但编译器保证不会发生变异。我会欢迎 const 在 C++ 中,尽管它可能不太可能发生。与此同时,我还有其他选择吗?

最佳答案

如果你想要的是一个不可变的数组实现,那么你可以使用类似下面的东西

public sealed class ImmutableArray<T> : IEnumerable<T>{
private readonly T[] m_array;
public T this[int index] {
get { return m_array[index]; }
}
public int Length {
get { return m_array.Length; }
}
public ImmutableArray(IEnumerable<T> enumerable) {
m_array = enumerable.ToArray();
}
// IEnumerable<T> implementation ommitted
}

关于.net - 在 .NET 中表示不可变列表的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3612054/

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