2013-04-29 10 views
13

Qual è il controllo a destra:Confronta con predefinito o vuoto?

Guid value; 
// ... 
if (value != Guid.Empty) 

o

if (value != default(Guid)) 

penso che il secondo, ma non può spiegare perché.

+3

Beh ... che cosa stai cercando di verificare la presenza? – Oded

+0

secondo esempio si dà 'L'uso della variabile locale non assegnata 'value'' – Default

+4

' default (Guid) == Guid.Empty' – Oded

risposta

21

Dal Guid.Empty == default(Guid) non ha molta importanza, ma preferisco lo Guid.Empty per la leggibilità.

+1

Direi che entrambi vanno bene dal punto di vista della leggibilità, in realtà si tratta di ciò che significa effettivamente il controllo. Controllare se il record è in uno stato predefinito è diverso da controllare se contiene un valore vuoto (IMO). – James

4

direi la seconda semplicemente perché si ha il record in uno stato non inizializzato , quindi, conterrà il valore di default . Stai verificando se la variabile è in uno stato predefinito, non se è vuota - 2 diversi assegni (IMO).

Guid.Empty è l'equivalente di default(Guid) in .NET in modo da un punto di vista tecnico non importa, però, il confronto a Guid.Empty mi dà l'impressione che il vostro controllo per un valore particolare, non se il record è in una stato di default

5

Guid.Empty è equivalente a new Guid(), che è anche equivalente a default(Guid).

Quando si decompila la struttura Guid, sembra;

public static readonly Guid Empty = new Guid(); 

Da Guid è un struct, da Default Values Table;

Il valore prodotto dall'impostazione di tutti i campi di tipo valore sui valori predefiniti e tutti i campi di tipo di riferimento su null.

Dal tipi di campi di Guid sono, short, int, byte, (e questo valore predefinito tipi è 0), quando usiamo default(Guid) otteniamo una Guid con tutti i campi sono 0.

Da Guid.Empty Field

Un esempio della struttura Guid cui valore è tutti zeri sola lettura.

Quando scriviamo questo codice;

Console.WriteLine(default(Guid)); 
Console.WriteLine(new Guid()); 

uscite;

00000000-0000-0000-0000-000000000000 
00000000-0000-0000-0000-000000000000 

Se vi preoccupate per la leggibilità (che credo si dovrebbe) Guid.Empty sembra meglio per me.

+4

Questa è la spiegazione più inutile che abbia mai fatto ':' –

4

Entrambi sono uguali!

Guid.Empty è un campo di sola lettura di Guid, con il valore {00000000-0000-0000-0000-000000000000}.

Con default(Guid) la compilazione crea un valore costante, con {00000000-0000-0000-0000-000000000000}.

In entrambi i casi il valore viene confrontato con un altro valore da qualche parte in memoria.

Utilizzare Guid.Empty per la leggibilità.
Utilizzare default(T) quando si lavora con generici.

2

Personalmente userei Guid.Empty per la leggibilità. L'unica volta che uso veramente lo default in questo modo è quando non ci sono altre opzioni, ad esempio quando si controlla un KeyValuePair.

2

si dovrebbe utilizzare il seguente:

var guidIsEmpty = value == Guid.Empty; 

Entrambi sono tecnicamente corretto, tuttavia, il confronto a Guid.Empty rende sicuramente per il codice più leggibile.

0

So che questo è un vecchio thread, ma volevo solo carillon in:

Quando si definisce un valore predefinito per un GUID come un parametro a un metodo, si dovrà utilizzare di default (GUID) anziché Guid . Impuro, poiché Guid.Empty non è considerato una costante in fase di compilazione.

Questo compilerà:

private void MyMethod(Guid id = default(Guid)) 

Questo non compilerà:

private void MyMethod(Guid id = Guid.Empty) 
+0

Grazie a @Mekuri, ma questo non risponde direttamente alla domanda. Il tuo post è ottimo come un commento, ma non contiene abbastanza informazioni per essere una risposta in termini di SO. –

Problemi correlati