2009-05-08 19 views
7

Cuando comencé a usar C# no estaba seguro de cómo se trataban las referencias exactamente (si se pasaban por valor, etc.). Pensé erróneamente que la palabra clave 'ref' era necesaria al pasar objetos que serían modificados por el método llamado.palabra clave 'ref' y AppDomains

Luego, después de leer hilos como this, me di cuenta que 'ref' solo era necesario cuando necesita cambiar la referencia/puntero real.

Pero hoy me he encontrado con un problema al pasar un parámetro a través de una llamada remota, donde realmente se necesitaba una referencia para modificar el contenido del objeto. Cuando pasó sin ref, el objeto regresó sin cambios. Me dijeron que agregara la palabra clave ref, pero argumenté por un tiempo que solo era necesario cuando cambias el puntero en sí, no el contenido al que se apunta.

He buscado en la red y solo he encontrado un single page que lo discute brevemente. ¿Es esto un problema conocido y alguien puede señalar alguna documentación al respecto? Me parece que tendré que usar ref ahora para cualquier parámetro que se esté modificando a través de una llamada remota.

Respuesta

4

Agregar "ref" podría, o podría no ser de ayuda. Todo depende de la inteligencia de la implementación particular de Marshaller. Si llamas, por ejemplo, a un servicio web, ninguna cantidad de "ref" te ayudará; los parámetros de la función simplemente no se envían por el cable. Lo único que regresa del servicio es el valor de retorno de la función. Cuando se trata de comunicación remota, debe comprender (al menos hasta cierto punto) la forma en que realmente funcionan las cosas: el hecho de que los parámetros deben ser serializados y enviados al destinatario mediante algún tipo de "cable", deserializado en el otro extremo, funcionan lo realiza el servidor, y los resultados se serializan y envían de vuelta a usted. Si estos resultados incluyen cambios en los parámetros que aprobó en primer lugar depende más de la implementación remota específica, luego en los "ref" que agrega para decorar sus parámetros ...

+2

Estoy bastante seguro de que tanto SOAP (asmx) como los servicios web de WCF se encargarán de la "ref" como se espera, organizándolo en ambas direcciones. –

1

Me pregunto por qué dijiste "referencia/puntero" ?. Hay una gran diferencia entre esos términos. Ver, un puntero es solo una dirección, digamos un int.

Por otro lado, una referencia no es más que un alias de algo. En términos de C++:

int x; 
int& y = x; 

De aquí en adelante, pase lo que pase a x, pasa a yy viceversa, están obligados "para siempre".

De nuevo, en C++, un ref pase por:

void foo(int& y); 
int main(){ 
    int x = 0; 
    foo(x); 
} 

Significa que Y, es sólo otro nombre (alias) para x dentro del ámbito de foo. Esto es lo que ref significa en C#.

+0

Eso es lo que significa ref, pero no es lo que significa referencia Creo que introducir C++ en la mezcla confunde las cosas, porque una referencia de C++ no es realmente lo mismo que una referencia de C#. –

+0

Dije 'referencia/puntero' allí que solo 'referencia' para resaltar que estaba hablando de la referencia real y no del objeto al que hacía referencia la referencia. Pensó que podría ayudar a evitar que la gente tenga que leer dos veces la oración. – LegendLength