Let Me dividirla en dos preguntas:
1) ¿Cuándo se debe utilizar declaraciones de parámetros ref de entrada/salida formal cuando escribiendo un método?
Uso ref/cuando desea que su método sea capaz de leer y escribir una variable pasaron por la persona que llama, en lugar de una simple lectura de un valor .
2) ¿Por qué una refactorización de "método de extracción" produce un parámetro ref?
No conozco los detalles de Resharper, pero puedo adivinar.Considere el siguiente mal tipo de valor mutable:
struct S
{
private int x;
public int X() { return this.x; }
public void M() { this.x += 1; }
}
Usted tiene un método:
void Foo()
{
S s = new S();
Fred(s);
Blah(s);
Bar(s);
s.M();
Console.WriteLine(s.X()); // prints 1
}
y lo hace "método de extracto de" en el bit medio:
void NewMethod(ref S s)
{
Blah(s);
Bar(s);
s.M();
}
void Foo()
{
S s = new S();
Fred(s);
NewMethod(ref s);
Console.WriteLine(s.X()); // still prints 1
}
Si por el contrario usted hizo un método sin "ref" y luego llamar NewMethod (s) pasaría una copia de s a NewMethod. Recuerde, los tipos de valores se copian por valor; es por eso que los llamamos "tipos de valor". Sería la copia que se muta, y luego s.X() devuelve cero. Es una mala idea para una refactorización introducir un cambio semántico en un programa, y es difícil para un motor de refactorización saber si un método dado se basa o no en la mutabilidad de un tipo de valor.
Esta es solo otra razón más por la que debe evitar los tipos de valores variables.
y cuándo pasar '' out'? – Natrium
código postal por curiosidad? – bdd
@Natrium: me parece que es el momento después de que retroceda unos pocos a muchos :) –