2011-01-11 16 views
6

alguien en mi equipo tropezaron con un peculiar uso de la palabra clave ref en un tipo de referenciatipos de palabras clave y de referencia "REF"

class A { /* ... */ } 

class B 
{  
    public void DoSomething(ref A myObject) 
    { 
     // ... 
    } 
} 

¿Hay alguna razón alguien en su sano juicio haría una cosa así? No puedo encontrar un uso para esto en C#

+0

Véase también [esta cuestión] (http: // stackoverflow.com/questions/961717/c-what-is-the-use-of-ref-for-reference-type-variables). –

+0

De hecho, me perdí esa pregunta durante la búsqueda. Buena captura – Luk

Respuesta

12

Deje

class A 
{ 
    public string Blah { get; set; } 
} 

void Do (ref A a) 
{ 
    a = new A { Blah = "Bar" }; 
} 

continuación

A a = new A { Blah = "Foo" }; 
Console.WriteLine(a.Blah); // Foo 
Do (ref a); 
Console.WriteLine(a.Blah); // Bar 

Pero si simplemente

void Do (A a) 
{ 
    a = new A { Blah = "Bar" }; 
} 

continuación

A a = new A { Blah = "Foo" }; 
Console.WriteLine(a.Blah); // Foo 
Do (a); 
Console.WriteLine(a.Blah); // Foo 
+1

+1 para un ejemplo explícito de lo que está hablando Oded, incluso si ya estaba bastante claro. –

+0

¡Muchas gracias, eso lo deja muy claro! – Luk

+0

@Luk: ¡Me alegro de que haya sido útil! :) – abatishchev

15

Sólo si quieren cambiar la referencia al objeto pasado como myObject a uno diferente.

public void DoSomething(ref A myObject) 
{ 
    myObject = new A(); // The object in the calling function is now the new one 
} 

Lo más probable es que esto no es lo que quieren hacer y ref no es necesario.

0

La palabra clave ref es útil si se supone que el método cambia la referencia almacenada en la variable pasada al método. Si no usa ref, no puede cambiar la referencia; solo los cambios serán visibles fuera del método.

this.DoSomething(myObject); 
// myObject will always point to the same instance here 

this.DoSomething(ref myObject); 
// myObject could potentially point to a completely new instance here 
0

No hay nada de peculiar en esto. Usted referencia las variables si desea devolver varios valores de un método o simplemente no desea reasignar el valor devuelto al objeto que ha pasado como un argumento.

De esta manera:

int bar = 4; 
foo(ref bar); 

en lugar de:

int bar = 4; 
bar = foo(bar); 

O si desea recuperar varios valores:

int bar = 0; 
string foobar = ""; 
foo(ref bar, ref foobar); 
+0

De hecho, OP está hablando de tipos de referencia, no de tipos de valores, como 'int' – abatishchev

+0

Entonces, ¿está diciendo que las referencias no se usan con tipos de valores? – peterthegreat

+0

afaik, no. los tipos de valor se copian completamente cada vez, es decir, por valor. es por eso que se llaman tipos de valor – abatishchev