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 = ""
)
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 = ""
)
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 .
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.
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? 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 = "";
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.
Leggi altre domande sui tag c#