问题标签 [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.
c# - 哪种方式返回 List 的只读包装器更可取?
比如说,我们有一个带有私有 List 的泛型类。我们至少可以通过两种方式让它返回这个列表的只读包装器:
两者都Values1
反映Values2
基础集合中的任何变化,并防止它通过自身进行修改。
哪种方式更可取?应该注意什么?或者有没有其他更好的方法?
c# - 如何使用 FluentNhibernate 将我的集合配置为非只读?
我已经在这里尝试了我能想到的一切,但我只是卡住了。我有一个User
有很多Invitations
但是当我尝试通过调用将异常添加Invitation
到invitations
字段时抛出异常,因为. 我觉得它是映射覆盖中的东西,但我有各种其他类/关系遵循相同的模式,并且(到目前为止)我在其他地方没有遇到这个问题。为什么支持字段是只读的,我应该怎么做才能防止支持字段变为只读?User
AddInvitation()
NotSupported
Collection 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 包装器也在修改字段本身。
c# - 保护查找集合和项目不被编辑
我根本不希望这些内容是可编辑的。对于集合,使用 ReadOnlyCollection 似乎非常清楚(尽管我不知道它是否总是从集合中创建新的 ReadOnlyCollection 的好方法(成本高吗?))。
但更重要的是:我如何处理集合中的项目?我希望这个测试通过任何想法?
c# - ReadOnlyCollection vs Liskov - 如何正确建模可变集合的不可变表示
Liskov-substitution 原则要求子类型必须满足超类型的契约。据我了解,这将ReadOnlyCollection<T>
违反 Liskov。 ICollection<T>
的合约暴露Add
和Remove
操作,但是只读子类型不满足这个合约。例如,
显然需要不可变的集合。.NET 的建模方式有问题吗?更好的方法是什么? IEnumerable<T>
在暴露集合方面做得很好,至少看起来是不可变的。然而,语义是非常不同的,主要是因为IEnumerable
没有显式地暴露任何状态。
在我的特殊情况下,我正在尝试构建一个不可变的DAG类来支持FSM。一开始我显然需要AddNode
/AddEdge
方法,但我不希望一旦它已经运行就可以更改状态机。我很难表示 DAG 的不可变和可变表示之间的相似性。
现在,我的设计涉及预先使用 DAG Builder,然后创建一次不可变图,此时它不再可编辑。Builder 和具体的不可变 DAG 之间唯一的通用接口是Accept(IVisitor visitor)
. 我担心面对可能更简单的选项,这可能是过度设计/过于抽象。同时,我无法接受我可以在我的图形接口上公开方法,NotSupportedException
如果客户端获得特定的实现,这些方法可能会抛出。处理这个问题的正确方法是什么?
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
shared - 异步访问几乎只读的共享列表
创造新需求的情况很少见PlanetInfo
,但它确实发生了。一旦PlanetInfo
创建并添加到Infos.planets
,它永远不会被删除。大多数时候,Infos.planets
实际上是只读的。
有很多线程都有 的实例Foo
,它们都需要一个指向PlanetInfo
对象的指针。如您所见,internal_getPlanetInfo
是同步的。
我想知道我是否可以更改代码,所以它可能会尝试2 次来找到所需的PlanetInfo
. 第一次尝试将是Asynchronously,并且(如果没有找到那么做)第二次synchronously。所以......该方法getPlanetInfo
将执行与方法相同的for循环internal_getPlanetInfo
。因此,大多数时候线程不会相互锁定。
我想到的是一个线程可能有一个“陈旧”的副本Infos.planets
,但是!这个“陈旧”副本的唯一潜在问题是它错过了一段时间后添加的项目。因此,如果找不到所需的项目,那么我们使用“主”副本查找它。
任何意见将不胜感激!
我做。
c# - 为什么我收到错误:“无法隐式转换类型 System.Collections.Generic.List”
我有以下密封类。我正在尝试将列表作为ReadOnlyCollection
. 尝试了几件事,但我不明白这一点。那么如何将列表返回或转换为只读集合?
c# - 更新只读 int 数组?
在经典意义上,只读对象只能在构造函数中设置,以后不能修改。为什么 readonly int 数组的行为有任何不同。
PS:我知道Readonly
收藏,我只是想知道为什么允许这样做?
c# - 从派生类设置只读对象
我正在编写一个我们公司其他开发人员将使用的库。一个状态机基类有一个ReadOnlyCollection<T>
允许的状态等,开发者需要从这个类继承并设置允许的状态。
我想限制它们ReadOnlyCollection<T>
在其派生类的构造函数中初始化,并且以后不能修改它。
如果我ReadOnlyCollection<T>
在基类中将 声明为只读属性,那将不起作用,因为它不能在派生类的构造函数中修改。
我想这是一个不常见的场景。有什么优雅的方法可以实现这一点,而不是让开发人员覆盖ReadOnlyCollection<T>
?
c# - 序列化只读集合而不实现 IXmlSerializable
我有一堂课:
我想用 XmlSerializer 在 XML 中序列化它,而且我还必须符合 FxCop。问题是 FxCop 只想公开属性的只读集合,但 ReadOnlyCollection 当然不可序列化。我不想实现 IXmlSerializable 因为它太痛苦了。还有其他解决方案吗?