Norme di codifica C # "Utilizzare la direttiva const solo sulle costanti naturali

5

Ho visto queste 2 linee guida nella codifica di c # standard e non sono sicuro di cosa significhi il secondo.

  1. Con l'eccezione di zero e uno, non scrivere mai un valore numerico; dichiara sempre una costante.
  2. Utilizza la direttiva const solo su costanti naturali come il numero di giorni della settimana.

Qual è la definizione di una costante naturale e se il numero non è una costante naturale data la prima regola come si dichiara una costante in c # senza la direttiva const?

Quindi in che modo la seconda regola non contraddice la 1a regola per le costanti non naturali?

Vedi link per riferimento.

    
posta Nathan Wilfert 27.11.2012 - 17:15
fonte

4 risposte

7

Non puoi dichiarare una "costante" senza la direttiva const . Quando si riferisce a "costanti naturali" si tratta semplicemente di valori definiti da una garanzia assolutamente ovvia, qualcosa di assiomatico, ad esempio:

Ci sono 7 giorni in una settimana. Questo non cambierà mai.

Ci sono 12 pollici in un piede. Questo non cambierà mai.

Questi sembrano abbastanza fissi e difficili da identificare in modo affidabile in una situazione reale, tuttavia esistono comunque garanzie fisse simili a quelle che puoi trovare nei tuoi sistemi.

Ad esempio, supponiamo che tu stia scrivendo un servizio web e stai eseguendo la versione dei contratti come dovresti, quindi hai un servizio OblogonRepository, sarebbe ragionevole rivendicare all'interno di quel servizio:

Questa è la versione 1 dell'OblogonRepository. Questo non cambierà mai.

Ora che tutto ciò è stato detto, lasciatemi dire, questa regola sembra molto restrittiva e non sono particolarmente d'accordo.

Tuttavia è molto importante capire il comportamento di un const in C #, in relazione a questo: Ovunque viene fatto riferimento a una const, al momento della compilazione sarà sostituito da un riferimento fisso ai valori letterali nella tabella degli assembly. Ciò significa che se si hanno altri assembly che fanno riferimento a questo const e li si compila, quindi ricompilare l'assembly con const con i valori modificati, gli assembly di riferimento not aggiorneranno il valore const fino alla ricompilazione.

Sii cauto con i consti, ma secondo la mia personale opinione soggettiva, questa regola è molto più restrittiva di quanto sia utile. Usare i comandi per cose come gli utenti massimi o i numeri di colonna è completamente comune C # idiomatico, anche se possono cambiare a differenza dei "numeri naturali".

Ecco un po 'più di ulteriore lettura su Sali che dettaglia il loro comportamento in fase di compilazione: link

Questo articolo rivendica una regola che mi sembra abbastanza chiara (sottolineatura mia):

Thus, const should be used mainly for values that are not subject to change, or [can be used] freely if the scope of the const is limited to the same assembly or smaller.

    
risposta data 27.11.2012 - 17:26
fonte
3

Penso che tu possa leggere "Natural Constant" come "Questo è un numero ben noto e ben compreso, ed è improbabile che cambi mai". Costanti come e e pi soddisfano questa definizione.

I numeri magici come i semi per i generatori di numeri pseudo-casuali non sono costanti naturali e, secondo questo standard di codifica, sono meglio serviti usando la parola chiave readonly .

    
risposta data 27.11.2012 - 17:28
fonte
3

Supponiamo che tu sia stato incaricato di scrivere un programma che gestisce la traiettoria di un satellite in orbita. Hai scritto questo programma aspettando che il satellite raggiunga l'orbita terrestre, quindi tutti i tuoi calcoli sono fatti con una costante di gravità di 9.81. Bene, la NASA decide di inviare questo satellite alla Luna, dove la gravità è 1/6 della terra. Hai codificato la costante di gravità nell'app, quindi Joe Schmo passa attraverso il codice sorgente, modificando tutte le istanze da 9.81 a 1.66. Tranne Joe Schmo ha dimenticato di cambiare 1 formula, e il satellite da molti miliardi di dollari si schianta e brucia sulla superficie lunare perché 1 formula utilizzava la costante gravitazionale terrestre. Dichiarando una costante per gravità e usando quella costante in ogni posto in cui si ha bisogno della gravità, qualsiasi modifica a quella costante può essere implementata cambiando 1 riga di codice, anziché cinquemila righe.

Quindi è PERCHE 'si dovrebbero usare le costanti invece di codificarle a fondo.

Non puoi dichiarare una costante senza usare la direttiva const. E se stai dichiarando una costante, usa la direttiva const. È possibile assegnare un valore costante solo quando lo si dichiara. Ad esempio:

   public const float Gravity = 9.81;
   Gravity = 1.6;

non verrà compilato perché si sta tentando di modificare il valore di una costante.

Una costante naturale è qualcosa che non cambierà mai: la lunghezza di un pollice. L'accelerazione dovuta alla gravità sulla terra. Il numero di giorni in una settimana. Il numero di giorni in gennaio. Il rapporto tra cm e pollici. Queste sono tutte costanti naturali.

    
risposta data 27.11.2012 - 17:32
fonte
0

Quello che ottieni quando usi una costante è una descrizione del valore e un singolo punto di cambiamento. Una costante è un valore hardcoded. Tutti gli usi della variabile costante vengono sostituiti con il valore attuale al momento della compilazione.

Per quanto riguarda quando utilizzare const ... puoi usare const o non puoi. Io uso const ogni volta che posso, il mio programma dovrà tracciare una variabile in meno e sarà molto più efficiente.

    
risposta data 27.11.2012 - 18:08
fonte

Leggi altre domande sui tag