2013-10-30 15 views
15

Sto lavorando a un nuovo progetto e ho notato un codice che non sono sicuro sia vero. I nomi e i valori che sto usando per dimostrare la domanda sono falsi.Una classe di costanti di stringa dovrebbe essere statica?

public class MyConsts //Should it be static? 
{ 
    public const string MyConst1 = "a"; 
    public const string MyConst2 = "b"; 
    public const string MyConst3 = "c"; 
    public const string MyConst4 = "d"; 
    .... 
} 

Per la mia logica di questa classe (che contiene solo valori const) deve essere statico, quindi nessuna possibilità di inizializzare esso, che non ha alcun senso, Ho ragione?

EDIT: Stavo scrivendo il codice cieco, quindi ho confuso l'ordine di stringa e const, e poiché non era l'obiettivo della mia domanda, l'ho risolto.

+1

La classe non dovrebbe esistere affatto. Vuoi invece usare le risorse. –

+3

@JoelCoehoorn Ho visto molti casi in cui questo approccio esatto è un buon compromesso e le risorse nel migliore dei casi non forniscono alcun vantaggio. Cioè 'HtmlTags.Div =" div "' è perfettamente adatto come raccolta di costanti, ma se inserito in risorse richiederà un'attenzione particolare per evitare la localizzazione. –

+2

@JoelCoehoorn - No, dovrebbe avere un 'IAbstractFactory' che è ereditato da' ConstantsFactory' che legge le costanti dalle risorse e quindi le inietta usando il contenitore IOC. – Davor

risposta

32

Sì, ha senso che sia statico. Questo sta a significare l'intenzione , impedisce ai client di anche dichiarare una variabile di quel tipo, ecc

Avrai bisogno di spostare il modificatore di constprima il tipo di parte, però:

public const string MyConst1 = "a"; 
... 

Se il i valori potrebbero mai cambiare, prendere in considerazione l'utilizzo dei campi public static readonly anziché const, altrimenti il ​​valore verrà inserito in qualsiasi codice che fa riferimento alle costanti, il che significa che è necessario ricostruire qualsiasi codice client se i valori cambiano.

(Un'altra opzione è quella di rendere le costanti internal invece di public.)

+1

Grazie. La modifica statica ha effetti sulla memoria o sulle prestazioni? (perché come so le classi statiche compila all'inizio dell'applicazione e non quando viene chiamato) –

+2

@MishaZaslavsky: No - e la tua "conoscenza" della differenza nelle classi statiche è falsa per quanto ne so. –

+0

Classi statiche compilate quando tutto il resto è compilato, sono _initialized_ una volta che sono state accedute per la prima volta. – Brad

2

Sì, dovrebbe essere statico se i valori non cambiano mai. Come dici tu, non ha senso permettere al codice client di istanziarlo.

1

Se contiene solo const s e non conterrà nient'altro, sarebbe meglio renderlo una classe statica per impedire l'istanziazione e in tal modo l'ostruzione.

5

Sì, la classe deve essere static. Ma in relazione, quei valori dovrebbero essere effettivamente const?

Qualsiasi cosa dichiarata const verrà compilata in tutti gli assembly di riferimento, quindi se questa è una libreria di classi, ad esempio, e si mette fuori una nuova versione con modifiche a quei valori const, non verranno rilevati dagli assembly che riferimento a loro.

In questo caso particolare, public static readonly string ha senso.

Tuttavia, se questi sono visibili solo all'interno di un singolo assembly particolare (ad esempio un'applicazione console o un'app WinForms), è necessario dichiarare che la classe internal e gli const s funzionano correttamente.

0

Davvero, tocca a voi. Statico è utile per le classi puramente di utilità.

Tenere presente che una classe statica è sigillata; non può essere ereditato da

Problemi correlati