2011-10-28 10 views
10

ReSharper appena mi ha spinto su questa linea di codice:È sempre corretto non inizializzare esplicitamente un valore se lo si imposterà solo sul valore predefinito?

private static bool shouldWriteToDatabase = false; 

che indica che non dovrei dire "= false", perché bools, a quanto pare, default to false in C#. Ho programmato in C# per oltre un anno e mezzo e non lo sapevo mai. Immagino che sia scivolato tra le fessure, ma questo mi fa pensare a cosa sia una buona pratica.

Lavoro supponendo che i valori predefiniti siano compresi da tutti? Ciò risulterebbe in un codice più pulito, ma invita all'ambiguità se un altro programmatore non è a conoscenza del valore predefinito.

+4

Non sono d'accordo con quella regola ReSharper e la disabiliterei immediatamente se dovessi usare ReSharper. Chi si ricorda mai quali sono i valori predefiniti? –

+5

@DavidePiras Mentre acconsento a disabilitare questa regola, io ** fortemente ** non sono d'accordo con la tua seconda affermazione. Ogni sviluppatore C# dovrebbe avere una conoscenza di base dei valori predefiniti - ed è facile in .NET, poiché le regole CLI per i valori predefiniti sono sostanzialmente valori "zero". Devi solo ricordare null per i tipi di riferimento, false per bool e zero per tutti i tipi numerici primitivi. Diventa strano quando si guardano tipi come DateTime, ecc., Ma per questi tipi, il valore predefinito non è in genere mai un buon valore di inizializzazione ... –

+1

@DavidePiras Quali valori predefiniti non conosci? – Marc

risposta

11

Personalmente penso:

  • E 'bello essere esplicito se il codice si basa sul valore intial.
  • Se il tuo codice non si basa sul valore iniziale, ometterlo avrebbe più senso e ingombrerebbe meno il codice.

Tuttavia, non credo che Resharper possa rilevare facilmente la differenza tra queste due situazioni.

+1

Ok. Metterò il resharper al suo posto, allora! :) –

+3

* Perché * è bello essere espliciti?Sembra una distrazione per me. Voglio dire, se non sai che un 'bool' è impostato su false, allora hai altri problemi ... Sembra simile a dire" if (b == true) ... ". Di nuovo, una distrazione dal momento che è ridondante. –

+6

@Kirk Woll: 'bool x = false;' significa "Voglio che questo membro inizialmente sia falso." Questo è molto diverso da 'bool x;' che dice "Forse voglio che questo membro sia inizialmente falso, o forse non uso il valore iniziale, o potrei aver dimenticato di inizializzarlo. indovina quale. " –

2

Personalmente, i valori predefiniti sono documentati proprio come qualsiasi altra cosa in una lingua (C# o qualsiasi altra lingua). È abbastanza semplice da supporre, cioè un int inizia da 0. Uno scenario che spicca per me è se si desidera che una grande serie di int mantenga tutti gli 0. Lo definirai, o lascialo semplicemente C# inizializzarlo con 0s?

Sembra un po 'contro-intuitivo supporre che un array di grandi dimensioni di int s sia 0s, ma di dover specificare che uno bool è falso. Specifica della variabile base ma non della struttura più complessa. Quindi non inizializzo nulla al suo valore predefinito per motivi di coerenza.

+0

Mentre fai un ottimo punto per quanto riguarda la coerenza, ti sei perso il fatto che a) a differenza di un bool, inizializzare il contenuto di un array non può essere fatto facilmente su una riga eb) diversamente da un bool, ci sarebbe una prestazione extra significativa costare in modo esplicito (ri) l'inizializzazione dei valori in una matrice ai loro valori predefiniti. Questi due punti per me significano che è accettabile trattare le due situazioni in modo diverso. Ma +1 comunque. –

3

Sono l'unico a pensare che lo = false; non disturbi il codice? Come sviluppatore che mantiene le applicazioni largamente scritte da altri, essere espliciti con ciò che intendi può essere molto utile. Sì, l'impostazione predefinita è false in C#, ma quando stai guardando il codice di qualcun altro può confondere se questo fosse il comportamento previsto o se fossero semplicemente trascurati.

Problemi correlati