Il compilatore C# cercherà di ottenere tutte le stringhe costanti in fase di compilazione. Questo è chiamato internamento stringa. Quindi, dopo che il codice generato a
e sono riferimenti alla stessa stringa che contiene "xx".
È possibile controllare questo confrontando i loro riferimenti (gettandoli a oggetto e fare il controllo di uguaglianza o utilizzare object.ReferenceEquals
). Tieni presente che l'operatore ==
per le stringhe confronta i loro valori e non i loro riferimenti.
Un'altra cosa da ricordare è che strings are immutable in .NET.
string a = "xx";
string b = "x" + "x"; // String interning here
string c = string.Join("", new[] { "x", "x" }); // No interning here because it is evaluated at runtime
Console.WriteLine((object)a == (object)b); // True. Reference check
Console.WriteLine(a == b); // True. Value check
Console.WriteLine((object)a == c); //False. Reference check. Described below
Console.WriteLine(a == c); // True. Value check
Quindi perché Console.WriteLine((object)a == c);
fare un controllo di riferimento ?? Perché il compilatore sceglierà l'operatore ==
sull'oggetto che controlla l'uguaglianza di riferimento.
Quindi il punto di getto per fare obiezioni nella domanda è controllare se l'internamento di stringa funziona o meno. Supponendo che non ci sia interning al momento della compilazione.
string a = "xx";
string b = "xx";
string c = "x";
string d = String.Intern(c + c);
Poi Console.WriteLine((object)a == (object)b);
stampa su "False", perché a
e b
sono riferimenti per due diversa stringa in memoria, entrambi i quali sembrano "xx".
Assolutamente nessuno. System.String eredita da System.Object – misha130
Non c'è bisogno di trasmettere ... –
L'autore di quel codice vuole chiamare 'operator == (oggetto, oggetto)' (uguaglianza di riferimento) invece di (adattamento migliore, per quanto riguarda il sovraccarico la risoluzione è interessata) 'operator == (stringa, stringa)' (valore uguaglianza), quindi il cast. Le chiamate dell'operatore non sono polimorfiche, vengono risolte in fase di compilazione. Un'alternativa sarebbe chiamare 'object.ReferenceEquals()' senza il cast. –