'const string' vs. 'static readonly string' in C #


Risposte:


171

Quando si utilizza una conststringa, il compilatore incorpora il valore della stringa in fase di compilazione .
Pertanto, se si utilizza un constvalore in un gruppo diverso, quindi aggiornare l'originale montaggio e modificare il valore, l'altro gruppo non vedrà il cambiamento fino riselezionate compila esso.

Una static readonlystringa è un campo normale che viene cercato in fase di esecuzione. Pertanto, se il valore del campo viene modificato in un assembly diverso, le modifiche verranno visualizzate non appena l'assembly viene caricato, senza ricompilare.

Ciò significa anche che una static readonlystringa può utilizzare membri non costanti, come Environment.UserNameo DateTime.Now.ToString(). Una conststringa può essere inizializzata solo utilizzando altre costanti o valori letterali.
Inoltre, una static readonlystringa può essere impostata in un costruttore statico; una conststringa può essere inizializzata solo inline.

Notare che a static stringpuò essere modificato; dovresti usare static readonlyinvece.


25
+1, E l'ovvia conclusione, da un punto di vista pratico e semantico: constdovrebbe essere usato solo per le costanti - le costanti sono valori che non cambiano mai , mai , mai .
LukeH

3
@ LukeH mai, mai, mai è un po 'forte. Non riesco a pensare a niente di male che accadrebbe se si dichiarasse una stringa privata come const e la cambiasse tra due eventi di ricompilazione.
Brenda Bell

5
@Brenda: ammetto che uso private constper valori che non sono, in senso stretto, costanti; fondamentalmente è un uso improprio constper scopi di microottimizzazione. Rimarrò fedele alla mia affermazione "mai, mai, mai" , anche se mi rende ipocrita. ;)
LucaH

E le prestazioni in caso di archi in particolare? Ogni utilizzo di const produrrà una nuova copia di una stringa in memoria?
Andrii

@Andrii no, le stringhe costanti vengono create una volta. Ogni utilizzo avrà lo stesso riferimento in memoria.
Migg

43

Ecco una buona ripartizione dei pro e dei contro :

Quindi, sembra che le costanti dovrebbero essere usate quando è molto improbabile che il valore cambierà mai, o se nessuna app / libreria esterna utilizzerà la costante. I campi di sola lettura statica devono essere utilizzati quando è richiesto il calcolo del tempo di esecuzione o se i consumatori esterni sono un fattore.


19
Punto molto interessante dell'articolo - "Ad un livello alto, le costanti sono ovviamente trattate in fase di compilazione, mentre i campi di sola lettura statica sono impostati nel momento in cui vengono valutati in fase di esecuzione. Il fatto che i valori costanti sono sostituiti dal compilatore significa che qualsiasi libreria / assembly che fa riferimento al valore della costante dovrà essere ricompilato se il valore della costante cambia. Le librerie che fanno riferimento a un campo di sola lettura statica faranno riferimento al campo e non al valore, quindi prenderanno qualsiasi modifica nel campo senza la necessità per la ricompilazione "
s_hewitt

1
Sì, ho letto anche quello e ho avuto un momento. Sicuramente non lo sapevo.
spinon

Ecco il Google memorizzato nella cache versione: webcache.googleusercontent.com/...
spinon

2
Il link di riferimento non è più disponibile.
Salomon Zhang

Questo è un ottimo complimento alla risposta contrassegnata come la soluzione. La definizione dell'utilizzo è molto utile. +1 da me.
Bonez024

11

const

public const string MyStr;

è una costante di tempo di compilazione (puoi usarla come parametro predefinito per un parametro di metodo, ad esempio) e non sarà offuscata se utilizzi tale tecnologia

static readonly

public static readonly string MyStr;

è la costante di runtime . Significa che viene valutato all'avvio dell'applicazione e non prima. Questo è il motivo per cui non può essere utilizzato come parametro predefinito per un metodo (errore di compilazione), ad esempio. Il valore in esso memorizzato può essere offuscato.


6

OQ ha chiesto del static stringvsconst . Entrambi hanno casi d'uso diversi (sebbene entrambi siano trattati come statici).

Usa const solo per valori veramente costanti (es. Velocità della luce - ma anche questo varia a seconda del mezzo). La ragione di questa rigida linea guidaèche il valore const viene sostituito negli usi del const negli assembly che lo fanno riferimento, il che significa che puoi avere problemi di controllo delle versioni se il const cambia al posto della sua definizione (cioè non avrebbe dovuto essere una costante Dopotutto). Tieni presente che ciò influisce anche sui private constcampi perché potresti avere una base e una sottoclasse in diversi assembly e campi privati ​​vengono ereditati .

I campi statici sono legati al tipo in cui sono dichiarati. Vengono utilizzati per rappresentare valori che devono essere gli stessi per tutte le istanze di un determinato tipo. Questi campi possono essere scritti tutte le volte che vuoi (a meno che non sia specificato in sola lettura).

Se intendevi static readonlyvs const, allora lo consiglierei static readonlyper quasi tutti i casi perché è più a prova di futuro.


Di chi è questo "OQ" di cui parli?
Peter Mortensen

"Domanda originale"
Ben Aston il

0

È possibile modificare il valore di a static readonly stringsolo nel staticcostruttore della classe o in un inizializzatore di variabile, mentre non è possibile modificare il valore di una conststringa da nessuna parte.


2
Non vedo come questo aggiunga qualcosa oltre a ciò che già dicono le risposte esistenti.
Finanzia la causa di Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.