2009-03-22 12 views
14

Nella maggior parte degli esempi NHiberate usano un ISET su un IList. Sono a conoscenza delle differenze fondamentali tra i due ovveroun set è univoco. Tuttavia, non sono sicuro del motivo per cui utilizzano un ISet su un IList quando eseguono il caricamento pigro.NHibernate ISet Vs IList

Che vantaggio ha (Iesi.Collections.Generic) ISet rispetto a IList? Particolarità in caso di caricamento lento.

+0

Un argomento in qualche modo correlato: http://stackoverflow.com/questions/1023697/why-have-hashset-but-not-set-in-c questo è per quanto riguarda il BCL rispetto allo specifico di NHibernate. –

risposta

17

Credo che questo sia dovuto principalmente al patrimonio java di NHibernate.

Vedere the FAQ entry on persistent collections. La menzione specifica di come Java contenga più collezioni per impostazione predefinita, C#, e loro, in particolare, mappano su un ISet.

Credo che il motivo per cui la maggior parte dei campioni utilizza questo è principalmente perché questo è più comune in Java e gli esempi sono stati portati da Java. (Alcuni esempi usano set senza che sia davvero necessario impostare un set ...)

Detto questo, ci sono differenze distinte tra un set e un elenco. Il comportamento è diverso, quindi ci sono casi d'uso in cui il comportamento di un set è più appropriato. Per il caricamento lento, questo consente di ridurre le restrizioni sull'ordine in cui vengono caricate le cose, in modo da poter potenzialmente caricare meno informazioni e mantenere i contratti dell'interfaccia in atto.

7

Un'interfaccia insieme esprime solo che la collezione risultante può essere:

  1. testati per l'adesione
  2. enumerati sopra in qualche ordine arbitrario (che potrebbe cambiare)

un'interfaccia lista esprime il prima, ma il secondo è più forte, l'ordinamento è ben definito e non cambierà a meno che qualcosa lo istruisca.

Utilizzando un contratto meno restrittiva (set) si guadagna più libertà in quello che si può usare (si può caricare il set in qualsiasi ordine, per esempio, e nessuno con la tua classe dovrebbe preoccuparsi se questo ordinamento non è coerente)

Ho qui sorvolato sul fatto che l'insieme garantisce anche che non può contenere duplicati (che è un vincolo per gli implementatori). Tuttavia, se fosse necessario memorizzare tali istanze, un set sarebbe semplicemente inaccettabile, quindi questo cessa di essere un problema e invece diventa positivo. Il lavoro dei consumatori diventa ancora più facile in quanto non è necessario preoccuparsi che esistano duplicati in questo modo è già stato garantito per loro.