|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
[VB.net]confronto tra Stringhe
Provenendo dal mondo Java o utilizzato in VB normalmente il metodo Equals messo a disposizione dalla classe String di VB.Ho visto però del codice in cui il confronto viene fatto con l' operatore '=' e provando effettivamente, differenza di java dove viene confrontato il reference, funziona esattamente come l' equals in quanto confronta il contenuto e non l' indirizzo in memoria.A questo punto se in VB si volesse confrontare il reference cosa bisogna fare?
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Questo perchè in VB.NET viene mantenuto sempre un certo orientamento "a ciò che può servire nella vita reale", perciò il confronto diretto tra due stringhe viene interpretato "alla VB6"...
Java invece è inflessibile in queste cose ( e anche un po' stronzo ![]() Comunque, ovviamente tutto si può fare in VB.NET. Se vuoi un confronto tra references fai così, ad esempio ( s1 e s2 sono 2 stringhe ) : Codice:
If ReferenceEquals(s1, s2) Then MsgBox("I Reference Sono Uguali.") Else MsgBox("I Reference Non Sono Uguali.") End If |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Esatto.
Il metodo ReferenceEquals serve proprio per questi casi. Ma tieni anche conto che le stringhe sono oggetti un po' particolari in .net. Sembrano oggetti di tipo reference, ma in realta' sono di tipo value. Per questo motivo l'indirizzo di una stringa non e' di tua proprieta' e non e' sotto il tuo controllo e non ha quindi molto senso il confronto tra reference. Cerco di spiegarmi: Codice:
string s="pippo"; string p="pippo"; Invece non e' cosi'. Sia s che p puntano alla stessa zona di memoria. Il reference e' lo stesso. Sono proprio la stessa stringa. Se invece scrivo Codice:
string s="pippo"; string p="pippo"; p=p+" pluto"; Dopo l'operazione +, p assume un altro valore, e puntera' ad un'altra zona di memoria contenente esattamente la stringa "pippo pluto". In pratica il C# (ma anche in VB.net e' cosi') ha creato al volo una nuova stringa, e ha cambiato il reference di p, senza che io apparentemente me ne fossi accorto. Questo e' anche uno dei motivi per cui in .net le stringhe vengono dette "immutabili". Non puoi fisicamente cambiare i caratteri di una stringa (perche' magari quella zona di memoria e' puntata da un'altra stringa). Puoi solo crearne di nuove. A parte quando le costruisco io esplicitamente uguali (primo esempio), caso in cui non mi serve confrontarle tra loro perche' gia' so per costruzione che sono proprio la stessa stringa, non ha effettivamente senso chiedersi se 2 stringhe abbiano lo stesso reference (ovvero se sono la stessa stringa), perche' potendo noi creare solo nuove stringhe, ne consegue che 2 stringhe non avranno mai lo stesso reference. Tutto questo fino a che si usa il .net in modo nativo nei modi per cui e' stato pensato.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 7863
|
Partendo dal presupposto che anche in java le stringhe sono immutabili,da quello che ho inteso dalla tua spiegazione il framework.net all' atto dell' istanziazione di una stringa controlla che ve ne sia una con testo uguale ed eventualmente assegna il riferimento,in caso contrario ne crea una nuova.
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Esatto, ma solo per quelle create esplicitamente.
Per quelle create come calcolo (Es: str=str+"pippo") allora non si mette a cercare se dopo il calcolo c'e' una stringa esattamente uguale. Oramai gia' che ce l'ha la usa direttamente. Se da un'altra parte del programma avessi un'altro codice tipo string qqq="pippo" e poi ancora if (u=="pippo") {..... allora anche queste stringhe "pippo" sara' esattamente la stessa del calcolo di cui sopra, stesso reference e stessa stringa. La parola "pippo" usata come stringa ci sara' una volta sola, risolta in compilazione. Se pero' ho un calcolo il cui risultato a runtime e' di nuovo la stringa "pippo", allora qusta nuova stringa sara' proprio nuova.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:36.