2016-07-14 8 views
7

Sono curioso di sapere quali sono i pro e i contro dell'uso di if(some_value is DBNull) rispetto a if(DBNull.Value.Equals(some_value)). Personalmente preferisco lo if(some_value is DBNull) perché lo trovo più leggibile. So che Microsoft consiglia di utilizzare if(DBNull.Value.Equals(some_value)) in base a https://msdn.microsoft.com/en-us/library/system.dbnull%28v=vs.110%29.aspx.è DBNull vs. DBNull.Value.Equals()

+4

non è duplicato, questa domanda è diversa da quella –

risposta

2

Vorrei andare per il modo DBNull.Value.Equals.

Perché?

Beacuse is controllerà il tipo rispetto all'uguaglianza. Deve cercare il tipo di mano sinistra e confrontarlo con il tipo di mano destra che deve anche cercare. Dopo di ciò, può confrontare i tipi, molto probabilmente controllando l'uguaglianza di riferimento.

Sarebbe meno efficiente del semplice controllo dell'eguaglianza di riferimento, che fa DBNull.Value.Equals. Poiché esiste una sola istanza di DBNull.Value, questo controllo è molto preciso e molto veloce.

+0

E usare '==' o '! =' È ancora meglio e più veloce :) –

+0

Quale sarebbe uguale a 'Equals' se sono corretto @IvanStoev Entrambi controllano l'uguaglianza di riferimento. –

+0

Beh, non esatto. Sarà 'ReferenceEquals', cioè semplice istruzione IL. –

0

some_value is DbNull: verifica il tipo di un valore_o contro il tipo di DBNull. Questo potrebbe essere usato se fosse possibile istanziare un'istanza di DBNull o ereditarla. Ma no, questa classe ha costruttori privati ​​ed è sigillata.

DBNull.Value.Equals(some_value): assegni valore di qualche_valore rispetto al valore rappresentato da DBNull.Value.

+0

Quindi, che non sono pro o contro, solo una nota di cosa si tratta. Lo sappiamo già ... –

+0

Nessun pro e contro. Entrambi confrontano cose completamente diverse: digitare in un caso e valore nell'altro. Cavalli per i corsi .... –

+2

In generale, hai ragione. Ma nel caso DbNull il risultato è lo stesso: DbNull.Value è l'unico valore possibile di tipo DbNull. –

2

value is DBNull verifichi effettivamente se value è un'istanza della classe DBNull, mentre value == DBNull.Value esegue effettivamente un confronto tra value riferimento e l'unica istanza della classe singleton DBNull.

I value is DBNull verifica se value è un'istanza di DBNull, che è possibile solo se value == DBNull.Value, poiché DBNull è un singoletto.

Il vantaggio dell'utilizzo di value == DBNull.Value è che fa un confronto diretto di riferimento che sarà più efficiente rispetto alla determinazione dei tipi per il confronto is DBNull.

Problemi correlati