Qual è il punto della stringa. Proprietà vuota

35

Perché la proprietà string foo = string.Empty è stata inclusa nel BCL? Sembra più prolisso e non più chiaro di una semplice stringa vuota ( string foo = "" )

    
posta Tom Squires 17.01.2012 - 18:36
fonte

4 risposte

55

Posso solo supporre qui:

string.Empty è stato definito per explicitness - durante l'inizializzazione di una stringa, potrebbe non essere chiaro dal contesto che "" era effettivamente inteso come inizializzatore (invece di null o say " " o solo come segnaposto durante il test). L'utilizzo di string.Empty è una risposta definitiva a quel tipo di enigma.

Potrebbe anche essere un ritorno a C - una stringa vuota in C non è una stringa vuota. È un array di caratteri il cui primo carattere è nullo (quindi vuoto), che non è lo stesso di C #. Il mio punto di vista è che in diverse lingue rappresenterebbe una stringa vuota in modi diversi (e potrebbero avere significati diversi) - avere un string.Empty preclude tale ambiguità.

Al contrario di ciò che gli altri dicono di più oggetti - questo non è un problema dato che qualsiasi stringa letterale verrà internata nella compilazione. Questo include il valore di string.Empty - "" . Ogni volta che uno di questi viene ripetuto nel codice, l'oggetto verrà recuperato dal pool interno. Questo è vero per dominio dell'app .

    
risposta data 17.01.2012 - 19:24
fonte
14

Non sono sicuro al 100% delle fonti in cui ho appreso queste informazioni, ma alcuni dei punti per l'utilizzo includono:

  • Ogni stringa in un assembly .NET è univoca, quindi avere

    string foo = "";
    string bar = "";
    

    restituisce 2 stringhe nell'assieme di output poiché le stringhe sono immutabili. Avere entrambi il riferimento string.Empty riduce le dimensioni dell'assieme.

  • esplicitezza. Quando ti imbatti in string.Empty , l'intento è chiaro che si suppone che sia una stringa vuota. Ma se incontri foo = "" il programmatore rimuove il contenuto della stringa durante il test e dimentica di aggiungerlo di nuovo, o dovrebbe essere in quel modo?
risposta data 17.01.2012 - 18:53
fonte
2

Nessun oggetto verrà creato per string.Empty . Utilizzando "" creerai un oggetto che molto probabilmente proviene dal pool interno di stringhe.

In passato, le persone hanno eseguito test e String.Empty risulta leggermente più veloce, ma è una micro-ottimizzazione.

String.Empty è questo:

//The Empty constant holds the empty string value.   
//We need to call the String constructor so that the compiler doesn't mark 
//this as a literal.   
//Marking this as a literal would mean that it doesn't show up as a field 
//which we can access from native.  
public static readonly String Empty = ""; 
    
risposta data 17.01.2012 - 21:32
fonte
0

Si tratta di ottimizzare il consumo di memoria e ottimizzare il confronto tra stringhe. Ogni volta che si utilizza una stringa vuota nell'applicazione, si assegna un oggetto stringa contenente 0 caratteri. Per quanto riguarda il confronto delle stringhe, può essere fatto confrontando i riferimenti (puntatori) invece di carattere per carattere, che è più veloce anche per le stringhe vuote.

Se si utilizza più volte la stessa stringa nell'applicazione, è possibile utilizzare lo stesso tipo di meccanismo chiamando String.Intern () con la stringa. Ma se utilizzi ogni stringa solo una volta, utilizzerai solo più memoria.

Quindi String.Empty è solo un caso di ottimizzazione speciale che vale la pena fare per la maggior parte delle applicazioni .Net, ecco perché è stato integrato nel BCL.

Per maggiori dettagli su questo argomento ti consiglio vivamente di leggere post del blog di Eric Lippert .

Dovresti anche dare un'occhiata a questa documentazione a cui fa riferimento il suo blog palo.

    
risposta data 24.01.2012 - 04:01
fonte

Leggi altre domande sui tag