operator - AddressOf alternativa en C#
operator c# (4)
Ampliando la respuesta de Harper Shelby, sí se puede hacer, pero en general es un olor a código hacerlo en .NET.
Para obtener la dirección de una variable en C #, puede usar la sintaxis del puntero estilo C (*) / dirección (&) / desreferencia (->). Para hacerlo, tendrá que compilar la aplicación con el modificador de compilador inseguro, ya que está saltando de la red de seguridad del código administrado tan pronto como comience a manejar las direcciones de memoria directamente.
La muestra de MSDN cuenta la mayor parte de la historia:
int number;
int* p = &number;
Console.WriteLine("Value pointed to by p: {0}", p->ToString());
Esto asigna la dirección de la variable number
a puntero-a-int p
.
Hay algunas capturas a esto:
- La variable cuya dirección está buscando debe inicializarse. No es un problema para los tipos de valor, que es el predeterminado, pero es un problema para los tipos de referencia.
- En .NET, las variables pueden moverse en la memoria sin que usted lo note. Si necesita lidiar con la dirección de una variable, realmente quiere usar
fixed
para fijar la variable en la RAM. - & solo se puede aplicar a una variable, no a una constante ni a un valor. (En otras palabras, no puede usar una construcción como
int* p = &GetSomeInt();
) - De nuevo, su código debe compilarse en modo inseguro, lo que señala que CLR usará características fuera del código administrado "red de seguridad".
En general, mi consejo en este mundo es considerar seriamente por qué crees que necesitas hacer esto en el mundo de .NET. Una de las misiones de .NET fue proteger a los desarrolladores de ir contra el metal, y esta característica es contraria a esa misión. Existe para los escenarios (raros) donde se necesita; Si te encuentras frívolamente usando esto simplemente porque puedes, probablemente estés mal usándolo e introduciendo el olor del código.
Evítelo si es posible, pero sepa cómo usarlo si es absolutamente necesario.
¿Podría alguien ayudarme con la solución alternativa en C # con respecto al operador AddressOf en VB6 ? AddressOf devuelve un valor largo. ¿De qué manera puedo obtener la salida en C #?
Aparentemente, esto se puede hacer (aunque no estoy seguro de dónde lo necesitarías). Aquí está la página de MSDN .
C # tiene una sintaxis especial para asignar funciones a delegados / eventos. Simplemente use <delegate> += <function>;
Si en realidad está tratando de obtener la dirección para otro uso, no tiene suerte. Una de las cosas sobre el código administrado es que estas direcciones no son necesariamente correctas. Si bien es poco probable que la mayoría de las funciones cambien, existen circunstancias en las que es posible.
EventHandler handler1 = this.button1_Click;
EventHandler handler2 = new EventHandler( this.button1_Click );
...
...
...
void button1_Click( object sender, EventArgs e ){
// ....
}
Ambas anotaciones son equivalentes.