我一直认为带有类类型的方法参数默认作为参考参数传递。显然情况并非总是如此。考虑一下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