2009-03-22 15 views
14

En la mayoría de los ejemplos de NHiberate utilizan un ISET sobre un IList. Soy consciente de las diferencias básicas entre los dos es decirun conjunto es único. Sin embargo, no estoy seguro de por qué usan un ISet sobre un IList cuando realizan una carga diferida.NHibernate ISet Vs IList

¿Qué ventaja tiene (Iesi.Collections.Generic) ISet sobre IList? Particularidad cuando la carga es floja.

+0

Un tema algo relacionado: http://stackoverflow.com/questions/1023697/why-have-hashset-but-not-set-in-c esto es en lo que respecta al BCL en comparación con NHibernate específico. –

Respuesta

17

Creo que esto se debe principalmente al patrimonio de java de NHibernate.

Ver the FAQ entry on persistent collections. Mencione específicamente cómo Java contiene más colecciones por defecto que C# y, en particular, se asignan a un ISet.

Creo que la razón por la que la mayoría de las muestras lo utilizan es principalmente porque es más común en Java, y las muestras fueron portadas desde Java. (Algunas de las muestras usan un conjunto sin realmente necesitar que sea un conjunto ...)

Dicho esto, existen diferencias claras respecto de un conjunto frente a una lista. El comportamiento es diferente, por lo que hay casos de uso donde el comportamiento de un conjunto es más apropiado. Para la carga diferida, esto le permite reducir la restricción en el orden en que se cargan las cosas, por lo que puede cargar potencialmente menos información y mantener los contratos de interfaz en su lugar.

7

Una interfaz conjunto expresa sólo que la colección resultante puede ser:

  1. ensayaron para la adhesión
  2. enumerado más en algún orden arbitrario (que podría cambiar)

una interfaz lista expresa la primero, pero el segundo es más fuerte, el orden está bien definido y no cambiará a menos que algo lo indique.

Mediante el uso de un contrato menos restrictivo (juego) que adquiera más libertad en lo que se puede utilizar (puede cargar el juego en cualquier orden, por ejemplo, y nadie la utilización de su clase debe cuidar si esta ordenación no es consistente)

He pasado por alto el hecho de que el conjunto asegura aún más que no puede contener duplicados (que es una limitación para los implementadores). Sin embargo, si necesita almacenar tales instancias, un conjunto simplemente sería inaceptable, por lo que deja de ser un problema y, en su lugar, se convierte en positivo. El trabajo del consumidor se vuelve aún más fácil ya que no tienen que preocuparse de que existan duplicados porque esto ya se ha garantizado para ellos.