View Full Version : [.NET - C#]Problema con la gestione delle stringhe
Salve, ho un gravissimo problema con la gestione delle stringhe, il fatto è che in .NET due oggetti di tipo stringa diversi, ma con lo stesso valore, puntano allo stessa stringa. Cioè se ho:
String pippo = "ciao";
String paperino = "ciao";
pippo e paperino referenziano lo stesso oggetto, per cui prendendo un lock su paperino è come se lo si prendesse anche su pippo.
Per quel che devo fare questa è una cosa gravissima e l'unica soluzione e fare in modo di avere 2 diverse stringhe diversi, che refernziano oggetti diversi, ma che hanno lo stesso valore.
C'è un modo per fare ciò?
La soluzione potrebbe trovarsi prima capendo perche' hai bisogno di fare il lock su un stringa.
il fatto è che in .NET due oggetti di tipo stringa diversi, ma con lo stesso valore, puntano allo stessa stringa. Cioè se ho:
String pippo = "ciao";
String paperino = "ciao";
pippo e paperino referenziano lo stesso oggetto, per cui prendendo un lock su paperino è come se lo si prendesse anche su pippo.
Per quel che devo fare questa è una cosa gravissima e l'unica soluzione e fare in modo di avere 2 diverse stringhe diversi, che refernziano oggetti diversi, ma che hanno lo stesso valore.
C'è un modo per fare ciò?
Ci sono vari modi per aggirare sto fatto dei reference, sia in VB sia in C#.
Ad esempio dichiarando le stringhe in modo da forzare C# a crearne una nuova istanza :
Modo 1 ( il tuo ) :
string pippo = "ciao";
string paperino = "ciao";
// Controllo :
if (ReferenceEquals(pippo, paperino) == true)
{
MessageBox.Show("STESSO REF");
}
else
{
MessageBox.Show("REF DIVERSI");
}
Restituisce "STESSO REF".
Modo 2 :
string pippo = new StringBuilder().Append("ciao").ToString();
string paperino = new StringBuilder().Append("ciao").ToString();
// Controllo :
if (ReferenceEquals(pippo, paperino) == true)
{
MessageBox.Show("STESSO REF");
}
else
{
MessageBox.Show("REF DIVERSI");
}
Restituisce "REF DIVERSI".
Modo 3 :
string pippo = "ciao";
string paperino = String.Copy(pippo);
// Controllo :
if (ReferenceEquals(pippo, paperino) == true)
{
MessageBox.Show("STESSO REF");
}
else
{
MessageBox.Show("REF DIVERSI");
}Restituisce "REF DIVERSI".
Vedi se può esserti utile...
Giusto.
Ma se non c'e' di mezzo il Marshaling verso C++ o simili non riesco a vedere la necessita' di giocare in questo modo.
La soluzione potrebbe trovarsi prima capendo perche' hai bisogno di fare il lock su un stringa.
Appunto.
Poi le stringhe sono immutabili, quindi fare un lock su una stringa non ha molto senso.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.