Я всегда думал, что параметр метода с типом класса передается по умолчанию как ссылочный параметр. По-видимому, это не всегда так. Рассмотрим эти модульные тесты в С# (используя MSTest).
[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
устраняет это.
Может ли кто-нибудь дать хорошее подробное объяснение того, что происходит здесь? Я в основном просто пытаюсь расширить свои знания о С#; У меня нет конкретного сценария, который я пытаюсь решить...