¿Cuál es la diferencia entre las palabras clave ref y out en C#?
¡Hola a todos! Empecé a estudiar C# y me encontré con las palabras clave `ref` y `out`. Entiendo que ambas permiten modificar las variables pasadas dentro del método, pero no me queda clara la diferencia entre ellas.
Aquí hay un ejemplo que escribí:
```csharp
public void TestRef(ref int x)
{
x = x * 2;
}
public void TestOut(out int x)
{
x = 10;
}
static void Main()
{
int a = 5;
int b; // Error: variable no inicializada para out
TestRef(ref a);
Console.WriteLine(a); // Muestra 10
TestOut(out b);
Console.WriteLine(b); // Muestra 10
}
```
Noté que con `out` no puedo pasar una variable no inicializada sin error, pero en el método la inicializo. Y con `ref` estoy obligado a inicializar la variable antes de la llamada. Pero esta no es la única diferencia, estoy seguro.
¿Quizás hay otras sutilezas? Por ejemplo, ¿cómo afecta esto al rendimiento, o hay reglas sobre cuándo usar cada una? Agradecería una explicación detallada con ejemplos.