2014-07-10 9 views
10

Per quanto ne so, string è un tipo di riferimento. const può essere utilizzato con il tipo reference solo se sono assegnati a null. La mia domanda è chePerché la stringa che è un tipo di riferimento è un const non nullo mentre le altre varianti di riferimento devono essere nulle?

perché è possibile assegnare a string un tipo di riferimento una stringa letterale (o non nulla)?

+0

'const' significa che non può cambiare e sappiamo che' String' sono ** immutabili ** – Arjuna

+0

si confondono 'const' e' ReadOnly' – Franck

+1

@Franck: Purtroppo no. Conosco 'readonly' per la valutazione runtime. –

risposta

12

recuperate dalla documentazione const:

Un'espressione costante è un'espressione che può essere pienamente valutata al momento della compilazione. Pertanto, gli unici valori possibili per le costanti dei tipi di riferimento sono string e riferimento null.

In altre parole, è un'eccezione. La vita sarebbe molto più difficile se non ci fossero cose come le costanti di stringa.

Si può anche ricordare che non è tutti stringhe, per esempio, non è possibile compilare con il codice const string test = new string('t', 7);, anche se si potrebbe con static string test = new string('t', 7);. D'altra parte, mentre è possibile definire una costante di stringa come stringa letterale (test = "value";), non è possibile definire alcun altro tipo di riferimento con un valore letterale (Form f = ???).

4

Questa è una regola speciale nel linguaggio C# e una funzionalità del CLR. Il compilatore sa come incorporare le stringhe nei metadati dell'assieme.

2

Secondo MSDN:

costanti possono essere numeri, valori booleani, stringhe , o un riferimento nullo.

+0

No. Non ho detto che 'const' solo per tipo di riferimento. –

+0

@ FifaEarthCup2014 abbastanza giusto, risolto la mia risposta. – decPL

+1

'char's ed enum possono essere costanti. – AlexD

3

ECMA-334 C# Specifica ha la seguente nota (enfasi mia):

Come descritto in §14.16, una costante espressione è un'espressione che può essere pienamente valutato a compiletime. Poiché l'unico modo per creare un valore non nullo di un tipo di riferimento diverso da stringa è applicare il nuovo operatore e poiché il nuovo operatore non è consentito in un'espressione costante, l'unico valore possibile è per le costanti di i tipi di riferimento diversi dalla stringa sono nulli.

0

Ciascun gruppo contiene una sequenza di byte che comprendono tutte le stringhe definite all'interno dell'assieme, e quando viene caricato il tipo di sistema creerà un elenco di nuovi oggetti stringa utilizzando i byte in quella sequenza. A ogni stringa dichiarata all'interno dell'assembly viene assegnato un indice e un'istruzione per caricare un letterale stringa legge l'oggetto stringa dalla tabella degli oggetti stringa creati quando quell'assembly è stato caricato.

Tale comportamento sarebbe possibile con qualsiasi tipo di classe che non contenga campi di tipo classe nidificati, ma in genere sarebbe utile solo con tipi di classe immutabili. Poiché non esiste un modo generale per distinguere i tipi di classi immutabili, soprattutto considerando la possibilità che gli assembly possano essere caricati con definizioni "insolite" per tipi come ad es. Tuple<int, int>, il comportamento è limitato al tipo di classe che soddisfa tale criterio e non può essere fatto per fare diversamente: System.String.

Problemi correlati