Ich dachte immer, dass ein Methodenparameter mit einem Klassentyp standardmäßig als Referenzparameter übergeben wird. Anscheinend ist das nicht immer der Fall. Betrachten Sie diese Komponententests in C# (mit MSTest).Das Übergeben einer Klasse als Ref-Parameter in C# funktioniert nicht immer wie erwartet. Kann mir jemand erklären?
[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);
}
}
Die Ergebnisse sind, dass AssignmentTest()
ausfällt und die beiden anderen Testmethoden übergeben. Ich nehme an, das Problem ist, dass das Zuweisen einer neuen Instanz zu dem Parameter testClass
den Parameterverweis unterbricht, aber das Hinzufügen des Schlüsselworts ref
irgendwie das Problem behebt.
Kann jemand eine gute, detaillierte Erklärung geben, was hier vor sich geht? Ich versuche hauptsächlich mein Wissen über C# zu erweitern; Ich habe kein bestimmtes Szenario, das ich versuche zu lösen ...
Schöne, detaillierte Antwort, aber aus irgendeinem Grund finde ich es immer irritierend, wenn jemand sagt "Parameter werden immer nach Wert übergeben, auch wenn es eine Referenz ist, die du passierst." Ich sehe nicht, wie solch eine pedantische Unterscheidung leuchtet. –
@RobertHarvey Irritierend, aber leider im Standardfall immer wahr (außer natürlich, 'ref' oder' out' sind anwesend). Ich glaube, die beste Erklärung, die ich je gelesen habe, stammt von Jon Skeet in seinem C# -Buch. –
@RobertHarvey die Terminologie ist leider verwirrend :( – JaredPar