我一直認爲帶有類類型的方法參數默認作爲參考參數傳遞。顯然情況並非總是如此。考慮一下C#中的這些單元測試(使用MSTest)。在C#中將類作爲參數傳遞並不總是按預期方式工作。誰能解釋一下?
[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);
}
}
結果是AssignmentTest()
失敗,另外兩個測試方法通過。我認爲這個問題是,將一個新實例分配給參數testClass
會中斷參數引用,但以某種方式明確添加ref
關鍵字可修復此問題。
任何人都可以提供一個很好的,詳細的解釋這是怎麼回事?我主要只是想擴大我對C#的知識;我沒有任何具體的場景,我試圖解決...
好的,詳細的答案,但由於某種原因,當有人說「參數總是按值傳遞,即使它是你傳遞的參考值時,我總是覺得它很刺激。」我不明白這種迂腐的區別是如何闡明的。 – 2012-04-03 15:31:02
@RobertHarvey刺激,但不幸的是,在默認情況下,總是如此(當然,除非'ref'或'out'出席)。我認爲我讀過的最好的解釋是Jon Skeet在他的C#書中。 – 2012-04-03 15:32:28
@RobertHarvey術語不幸混淆:( – JaredPar 2012-04-03 15:32:33