Siempre pensé que un parámetro de método con un tipo de clase se pasa como un parámetro de referencia por defecto. Aparentemente, ese no es siempre el caso. Considere estas pruebas unitarias en C# (usando MSTest).Pasar una clase como un parámetro ref en C# no siempre funciona como se esperaba. ¿Alguien puede explicar?
[TestClass]
public class Sandbox
{
private class TestRefClass
{
public int TestInt { get; set; }
}
private void TestDefaultMethod(TestRefClass testClass)
{
testClass.TestInt = 1;
}
private void TestAssignmentMethod(TestRefClass testClass)
{
testClass = new TestRefClass() { TestInt = 1 };
}
private void TestAssignmentRefMethod(ref TestRefClass testClass)
{
testClass = new TestRefClass() { TestInt = 1 };
}
[TestMethod]
public void DefaultTest()
{
var testObj = new TestRefClass() { TestInt = 0 };
TestDefaultMethod(testObj);
Assert.IsTrue(testObj.TestInt == 1);
}
[TestMethod]
public void AssignmentTest()
{
var testObj = new TestRefClass() { TestInt = 0 };
TestAssignmentMethod(testObj);
Assert.IsTrue(testObj.TestInt == 1);
}
[TestMethod]
public void AssignmentRefTest()
{
var testObj = new TestRefClass() { TestInt = 0 };
TestAssignmentRefMethod(ref testObj);
Assert.IsTrue(testObj.TestInt == 1);
}
}
Los resultados son que AssignmentTest()
falla y pasar los otros dos métodos de prueba. Supongo que el problema es que la asignación de una nueva instancia al parámetro testClass
rompe la referencia del parámetro, pero de alguna manera se agrega explícitamente la palabra clave ref
.
¿Alguien puede dar una buena y detallada explicación de lo que está pasando aquí? Principalmente intento expandir mi conocimiento de C#; No tengo ningún escenario específico que estoy tratando de resolver ...
Respuesta agradable y detallada, pero por alguna razón siempre me resulta irritante cuando alguien dice "los parámetros siempre pasan por valor, incluso si es una referencia que está pasando". No veo cómo ilumina una distinción tan pedante. –
@RobertHarvey Irritante, pero lamentablemente en el caso predeterminado, siempre es verdadero (a menos que, por supuesto, 'ref' o' out' estén presentes). Creo que la mejor explicación que he leído fue de Jon Skeet, en su libro de C#. –
@RobertHarvey la terminología es desafortunadamente confusa :( – JaredPar