2008-11-11 10 views
5

¿Podría anyboby 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#?AddressOf alternativa en C#

+0

¿Puede proporcionar un fragmento de código? tal vez podríamos convertir la línea 'addressof' a un equivalente C#. – Hath

+0

Ver http://stackoverflow.com/questions/7725511/vb-net-to-c-sharp-equivalent-of-addressof – reinierpost

Respuesta

6

C# tiene una sintaxis especial para asignar funciones a delegados/eventos. Solo use <delegate> += <function>;

Si realmente 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.

2

Aparentemente, esto se puede hacer (aunque no estoy seguro de dónde lo necesitaría). Aquí está el MSDN page.

0
EventHandler handler1 = this.button1_Click; 
EventHandler handler2 = new EventHandler(this.button1_Click); 
... 
... 
... 
void button1_Click(object sender, EventArgs e){ 
    // .... 
} 

Ambas anotaciones son equivalentes.

11

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 utilizar la sintaxis del puntero estilo C (*)/dirección (&)/dereferencia (->). 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 dice 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 a la number-puntero a un int-p.

Hay algunas capturas a esto:

  1. La variable cuya dirección esté recogiendo debe ser inicializado. No es un problema para los tipos de valor, que es el predeterminado, pero es un problema para los tipos de referencia.
  2. En .NET, las variables pueden moverse en la memoria sin que usted se dé cuenta. Si necesita manejar la dirección de una variable, realmente quiere usar fixed para fijar la variable en la RAM.
  3. & solo se puede aplicar a una variable, ni una constante ni un valor. (En otras palabras, no puede usar una construcción como int* p = &GetSomeInt();)
  4. De nuevo, su código debe compilarse en modo inseguro, lo que señala que la CLR utilizará características fuera del código administrado "red de seguridad".

En general, mi consejo en este mundo es a considerar seriamente qué cree que necesita para hacer esto en el mundo .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.