Domanda

Questa è una domanda sul linguaggio VB.NET. Dal momento che lo sto usando ogni giorno, cerco solo di capire le motivazioni alla base di alcuni dei suoi costrutti.

Ho appena scoperto che questa riga:

If myObject Is Nothing then

è corretto come questo:

If Nothing Is myObject Then

Stessi risultati. Usando ildasm, possiamo vedere che queste righe sono tradotte in:

if myObject = null then

e

if null = myObject then

Bene, ma, in VB.NET, non puoi scrivere:

if myObject = Nothing Then

Il compilatore non lo accetterà.

Mmm, per me, If Nothing Is myObject è molto meno ovvio di Se myObject = Nothing .

Perché gli autori di VB.NET hanno semplicemente pensato il contrario? Qualche suggerimento?

È stato utile?

Soluzione

Il problema che stai riscontrando è che VB.Net differenzia i 2 tipi di confronto di oggetti. Vale a dire riferimento e confronto di valore.

Il " È " L'operatore in VB.Net viene utilizzato per il confronto di riferimento. Questo può essere usato quando i valori in questione sono sia tipi di riferimento che nullable. Tentare di confrontare i tipi di valore in questo modo comporterà un errore di compilazione.

Il " = " L'operatore viene utilizzato per il confronto dei valori. Il confronto dei valori può essere utilizzato solo sui tipi che definiscono un esplicito =, & Lt; & Gt; coppia di operatori nella definizione della classe. L'attuazione effettiva dell'uguaglianza dipende dall'attuazione dell'operatore.

C # adotta un approccio diverso in quanto utilizza == sia per il confronto di valore che di riferimento. Il metodo utilizzato dipende da un paio di fattori tra cui il tipo di valori da confrontare e l'implementazione di alcuni metodi di uguaglianza.

Altri suggerimenti

È una di queste cose ereditate da VB6 e COM. VB6 fa una distinzione tra oggetti di tipo di riferimento (che sono istanziabili) e tipi nativi come int. I tipi di riferimento dovevano essere creati e assegnati con il & Quot; Set & Quot; operatore mentre i tipi nativi hanno semplicemente usato " = " ;.

Bene, in alcuni casi puoi scrivere If myObject = Nothing Then, ma non sarà un confronto nullo:

Dim someValue As Integer
If someValue = Nothing Then
    ' do something '
End If

Il codice sopra è equivalente al seguente:

Dim someValue As Integer
If someValue = 0 Then
    ' do something '
End If

In questo caso hai un tipo di valore che ha il suo " emtpy " valore (0 per un Integer, Point.Empty per una Point struttura come esempio). L'operatore Is esegue un confronto di riferimento (verificando se gli oggetti confrontati sono la stessa istanza), mentre il segno uguale è un confronto di valori .

Un altro pensiero è che VB è destinato a essere più dettagliato se si osserva un po 'del ciclo e della sintassi condizionale. Un paio di esempi:

VB:

If x==0 Then
End If

While 
End While

For i = 0 to 10 Step 2
Next i

C #

 If x==0 
 {
 }

 While 
 {
 }

 for (int i = 0; i<=10;i+2)
 {
 }

Vedi tutte le parole extra nel codice VB.Net? Questa è un'altra possibile ragione della differenza.

L'uso di Is Nothing è un costrutto che risale ai tempi del classico Visual Basic (cioè 6.0 e precedenti).

Per mantenere una certa parvenza di compatibilità (proprio come il modo in cui VB6 gestisce la valutazione non pigra dell'istruzione If), questo è stato riportato in VB.NET.

Fortunatamente come ocdecio sottolinea, c'erano altri peccati simili che non sono stati portati avanti in VB.NET come l'istruzione Set per assegnare oggetti alle variabili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top