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()
risposta
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.
E usare '==' o '! =' È ancora meglio e più veloce :) –
Quale sarebbe uguale a 'Equals' se sono corretto @IvanStoev Entrambi controllano l'uguaglianza di riferimento. –
Beh, non esatto. Sarà 'ReferenceEquals', cioè semplice istruzione IL. –
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
.
Quindi, che non sono pro o contro, solo una nota di cosa si tratta. Lo sappiamo già ... –
Nessun pro e contro. Entrambi confrontano cose completamente diverse: digitare in un caso e valore nell'altro. Cavalli per i corsi .... –
In generale, hai ragione. Ma nel caso DbNull il risultato è lo stesso: DbNull.Value è l'unico valore possibile di tipo DbNull. –
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
.
non è duplicato, questa domanda è diversa da quella –