问题标签 [readonly-collection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1585 浏览

c# - 哪种方式返回 List 的只读包装器更可取?

比如说,我们有一个带有私有 List 的泛型类。我们至少可以通过两种方式让它返回这个列表的只读包装器:

两者都Values1反映Values2基础集合中的任何变化,并防止它通过自身进行修改。

哪种方式更可取?应该注意什么?或者有没有其他更好的方法?

0 投票
2 回答
3986 浏览

c# - 如何使用 FluentNhibernate 将我的集合配置为非只读?

我已经在这里尝试了我能想到的一切,但我只是卡住了。我有一个User有很多Invitations但是当我尝试通过调用将异常添加Invitationinvitations字段时抛出异常,因为. 我觉得它是映射覆盖中的东西,但我有各种其他类/关系遵循相同的模式,并且(到目前为止)我在其他地方没有遇到这个问题。为什么支持字段是只读的,我应该怎么做才能防止支持字段变为只读?UserAddInvitation()NotSupportedCollection is read-only

用户.cs

邀请.cs

数据库.cs

管理器.cs

我得到了实际的异常消息(最初应该添加这个)

在 System.ThrowHelper.ThrowNotSupportedException(ExceptionResource 资源) 在 System.Collections.ObjectModel.ReadOnlyCollection'1.System.Collections.Generic.ICollection.Add(T 值) 在 NHibernate.Collection.Generic.PersistentGenericBag'1.System.Collections.Generic .ICollection.Add(T 项)

似乎即使我正在修改字段邀请,访问者邀请添加的 ReadOnlyCollection 包装器也在修改字段本身。

0 投票
2 回答
284 浏览

c# - 保护查找集合和项目不被编辑

我根本不希望这些内容是可编辑的。对于集合,使用 ReadOnlyCollection 似乎非常清楚(尽管我不知道它是否总是从集合中创建新的 ReadOnlyCollection 的好方法(成本高吗?))。

但更重要的是:我如何处理集合中的项目?我希望这个测试通过任何想法?

0 投票
6 回答
1018 浏览

c# - ReadOnlyCollection vs Liskov - 如何正确建模可变集合的不可变表示

Liskov-substitution 原则要求子类型必须满足超类型的契约。据我了解,这将ReadOnlyCollection<T>违反 Liskov。 ICollection<T>的合约暴露AddRemove操作,但是只读子类型不满足这个合约。例如,

显然需要不可变的集合。.NET 的建模方式有问题吗?更好的方法是什么? IEnumerable<T>在暴露集合方面做得很好,至少看起来是不可变的。然而,语义是非常不同的,主要是因为IEnumerable没有显式地暴露任何状态。

在我的特殊情况下,我正在尝试构建一个不可变的DAG类来支持FSM。一开始我显然需要AddNode/AddEdge方法,但我不希望一旦它已经运行就可以更改状态机。我很难表示 DAG 的不可变和可变表示之间的相似性。

现在,我的设计涉及预先使用 DAG Builder,然后创建一次不可变图,此时它不再可编辑。Builder 和具体的不可变 DAG 之间唯一的通用接口是Accept(IVisitor visitor). 我担心面对可能更简单的选项,这可能是过度设计/过于抽象。同时,我无法接受我可以在我的图形接口上公开方法,NotSupportedException如果客户端获得特定的实现,这些方法可能会抛出。处理这个问题的正确方法是什么?

0 投票
2 回答
2291 浏览

c# - HashSet vs HashedSet(Iesi):奇怪的行为

今天我在我的领域模型上测试了一些东西,我意识到这种行为不是我所期望的。

我试图隔离创建一个简单Customers-Orders模型的问题。

这是我的映射。

顾客:

命令:

我的Order课很简单:

这是我的Customer课:

在第一个示例中,我使用了一个ICollection<Order>创建为HashSet<Order>.

如果我运行此代码:

我可以看到INSERT客户的和INSERT订单的两个,但我也有UPDATE客户的。

在此处输入图像描述

如果我改变我的Customer班级切换到Iesi收藏:

我得到了预期的行为:

在此处输入图像描述

这是我的EntityGuid课:

有没有人可以帮助我尝试了解正在发生的事情?

问候。

如果有人真的有兴趣看看代码。我已经清理了所有东西并使其尽可能简单。可以在这里下载(NH_CollectionProblems)。

我正在使用 NHibernate 3.3.2.4000

0 投票
1 回答
26 浏览

shared - 异步访问几乎只读的共享列表

创造新需求的情况很少见PlanetInfo,但它确实发生了。一旦PlanetInfo创建并添加到Infos.planets它永远不会被删除。大多数时候,Infos.planets实际上是只读的。

有很多线程都有 的实例Foo,它们都需要一个指向PlanetInfo对象的指针。如您所见,internal_getPlanetInfo是同步的。

我想知道我是否可以更改代码,所以它可能会尝试2 次来找到所需的PlanetInfo. 第一次尝试将是Asynchronously,并且(如果没有找到那么做)第二次synchronously。所以......该方法getPlanetInfo将执行与方法相同的for循环internal_getPlanetInfo。因此,大多数时候线程不会相互锁定。

我想到的是一个线程可能有一个“陈旧”的副本Infos.planets但是!这个“陈旧”副本的唯一潜在问题是它错过了一段时间后添加的项目。因此,如果找不到所需的项目,那么我们使用“主”副本查找它。

任何意见将不胜感激!

我做。

0 投票
3 回答
8927 浏览

c# - 为什么我收到错误:“无法隐式转换类型 System.Collections.Generic.List”

我有以下密封类。我正在尝试将列表作为ReadOnlyCollection. 尝试了几件事,但我不明白这一点。那么如何将列表返回或转换为只读集合?

0 投票
3 回答
971 浏览

c# - 更新只读 int 数组?

在经典意义上,只读对象只能在构造函数中设置,以后不能修改。为什么 readonly int 数组的行为有任何不同。

PS:我知道Readonly收藏,我只是想知道为什么允许这样做?

0 投票
2 回答
2566 浏览

c# - 从派生类设置只读对象

我正在编写一个我们公司其他开发人员将使用的库。一个状态机基类有一个ReadOnlyCollection<T>允许的状态等,开发者需要从这个类继承并设置允许的状态。

我想限制它们ReadOnlyCollection<T>在其派生类的构造函数中初始化,并且以后不能修改它。

如果我ReadOnlyCollection<T>在基类中将 声明为只读属性,那将不起作用,因为它不能在派生类的构造函数中修改。

我想这是一个不常见的场景。有什么优雅的方法可以实现这一点,而不是让开发人员覆盖ReadOnlyCollection<T>?

0 投票
1 回答
827 浏览

c# - 序列化只读集合而不实现 IXmlSerializable

我有一堂课:

我想用 XmlSerializer 在 XML 中序列化它,而且我还必须符合 FxCop。问题是 FxCop 只想公开属性的只读集合,但 ReadOnlyCollection 当然不可序列化。我不想实现 IXmlSerializable 因为它太痛苦了。还有其他解决方案吗?