Indirizzamento di una variabile in VB

1

Perché Visual Basic.NET non ha l'operatore indirizzo di come C #? In C #, si può

int i = 123;
int* addr = &i;

Ma VB non ha controparti equivalenti. Sembra che dovrebbe essere importante.

UPDATE Poiché c'è un certo interesse, sto copiando la mia risposta a Strilanc di seguito.

The case I ran into didnt necessitate pointers by any means, but I was trying to trouble shoot a unit test that was failing and there was some confusion over whether or not an object being used at one point in the stack was the same object as an object several methods away.

    
posta Jeff 18.02.2011 - 17:49
fonte

3 risposte

6

Non puoi utilizzare i puntatori raw in VB.Net, perché non ha blocchi non sicuri.

Anche se VB avesse blocchi non sicuri, come C #, sarebbe meglio non usarli. Gli assembly con codice non sicuro necessitano di permessi speciali per essere eseguiti, perché non passano il controllo del tipo.

Non penso che questa limitazione sia importante. I puntatori non sono il modo in cui fai la maggior parte delle cose. Net. Non provare a scrivere codice VB come se fosse un dialetto di C. Detto questo, ci sono alcuni casi (interop?) In cui può essere necessario ed è sicuramente mancato.

In quale caso ti trovi dove pensi che un puntatore sia l'opzione migliore? Forse dovresti usare un parametro ByRef o una tripletta array / offset / lunghezza?

    
risposta data 18.02.2011 - 18:58
fonte
0

Puoi inviare un puntatore a una determinata variabile in VB specificando l'intestazione della funzione / sub nel seguente esempio:

Sub MySub(ByRef Var1 as String)
    Var1 = "Some Random Value"    'You can overwrite the value passed to the sub
End Sub

Nota la parola chiave ByRef che significa che questo Sub accetta l'indirizzo di una variabile. Ma l'assegnazione di un nuovo valore alla variabile non ha bisogno di annotazioni speciali.

ma per assicurarti di non passare una copia della Var1 al sub, devi chiamare il sottotitolo in questo modo:

MySub(AddressOf Var1)

invece di

MySub(Var1)

Sebbene tu stia passando Var1 come parametro di input, verrà sovrascritto nello stesso modo in cui lo farebbe se facessi qualcosa del tipo:

Var1 = MySub()
    
risposta data 13.09.2011 - 15:04
fonte
0

L'operazione AddressOf serve a dichiarare un delegato (gestore di eventi) da un metodo. In questo modo:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim handler As EventHandler = AddressOf ButtonClickHandler
End Sub

Public Sub ButtonClickHandler(ByVal sender As Object, ByVal e As EventArgs)
    ...
End Sub

senza VB.NET proverebbe a chiamare il metodo invece di fare semplicemente riferimento alla sua posizione. In C# questo non è necessario perché ButtonClickHandler fa riferimento all'indirizzo del metodo e ButtonClickHandler() chiama il metodo. In VB.NET puoi omettere la parentesi su una funzione e comunque essere chiamato. Fa parte della pazzia di VB.NET che prova ad assomigliare a VB6 e si sente come C# allo stesso tempo.

    
risposta data 23.02.2012 - 17:46
fonte

Leggi altre domande sui tag