私はいつも、クラス型のメソッドパラメータは、デフォルトで参照パラメータとして渡されると考えました。必ずしもそうであるとは限りません。 C#で(MSTestを使用して)これらの単体テストを検討してください。C#でrefパラメータとしてクラスを渡しても、期待どおりに機能しない場合があります。誰でも説明できますか?
[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()
が失敗し、他の2つのテスト方法が失敗します。 testClass
パラメータに新しいインスタンスを割り当てると、パラメータ参照が破損することがあると思われますが、何らかの形で明示的にref
キーワードを追加するとこれが修正されます。
ここで何が起こっているのか、詳細な説明は誰にもありますか?私は主にC#の知識を広げようとしています。私は解決しようとしている特定のシナリオを持っていません...
ニースの詳細な回答ですが、何らかの理由で、「パラメータが渡された参照であっても、常にパラメータが値渡されます」と言われると、いつも気になります。私はそのような賢明な区別がどのように照らされるかを見ない。 –
@RobertHarvey不愉快ですが、残念ながらデフォルトの場合、常に真です(もちろん、「ref」または「out」が出席していない限り)。私が今までに読んだことのある最良の説明は、Jon SkeetのC#の本です。 –
@RobertHarvey用語は残念ながら混乱しています:( – JaredPar