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