在大多数NHiberate示例中,他们使用ISET而不是IList。我知道两个的基本差异,即 一个集是唯一的。但是,我不确定为什么他们在进行延迟加载时会在IList上使用ISet。
(Iesi.Collections.Generic)ISet对IList有什么好处?延迟加载时的特殊性。
答案 0 :(得分:17)
我认为这主要归功于NHibernate的java遗产。
见the FAQ entry on persistent collections。具体提到Java默认情况下如何包含更多集合C#,特别是它们映射到ISet。
我相信大多数样本使用它的原因主要是因为这在Java中更常见,并且样本是从Java移植的。 (有些样本使用set而不需要它成为一组......)
话虽如此,集合与列表之间存在明显差异。行为是不同的,因此有一些用例,其中集合的行为更合适。对于延迟加载,这允许您减少对加载的订单的限制,因此您可以加载更少的信息并保持接口合同到位。
答案 1 :(得分:7)
set接口仅表示生成的集合可以是:
列表界面表示第一个,但第二个表示更强,订单定义明确,除非有什么指示,否则不会改变。
通过使用限制较少的合同(集合),您可以获得更多的自由(例如,您可以按任何顺序加载集合,如果此顺序不一致,则任何使用您的类的人都不应该关心)
我在这里掩盖了这样一个事实:该集合进一步确保了它不能包含重复项(这是对实现者的约束)。但是,如果你需要存储这样的实例,那么集合将是不可接受的,所以这不再是一个问题,而是变成一个积极的。消费者的工作变得更加容易,因为他们不必担心存在重复的问题已经得到了保证。