方法 : メソッドに構造体を渡すこととクラス参照を渡すことの違いを理解する (C# プログラミング ガイド)
メソッドに 構造体 を渡すことがメソッドに クラス のインスタンスを渡す場合の違いを次の例に示します。例では、引数の両方で、値との両方のメソッド (構造体とクラス インスタンス)変更する引数の 1 つがのフィールドの値渡しされます。ただし、 2 回のメソッドは、クラスのインスタンスを渡すと、渡されたを渡すと、渡された場合に構造体が異なるため同じではありません。
構造体が 値型であるため、メソッドへの 値を構造体を渡します。 構造体、メソッドの引数のコピーを受信し、操作するとき。したがって、メソッドに呼び出し元のメソッドに、元の構造体へのアクセスがなく、何かの要素を変更できません。メソッドは一つしか変更できます。
クラス インスタンスは 参照型値型ではありません。メソッドへの 参照型は値渡しされます メソッドが、クラス インスタンスへの参照のコピーを受信したとき。つまり、メソッドはインスタンス インスタンスのコピーではなく、のアドレスのコピーを受信します。呼び出し元のメソッドのクラス インスタンスにアドレスがありますが、呼び出されたメソッドのパラメーターにアドレスのコピーがあり、アドレスは両方とも、同じオブジェクトを示します。パラメーターがアドレスのコピーであるため、呼び出されたメソッドは、呼び出し元のメソッド インスタンスのアドレスを変更できません。ただし、呼び出されたメソッドは元のアドレスとコピーの両方が参照するクラス メンバーにアクセスするには、アドレスを使用できます。呼び出されたメソッドがクラス メンバーを変更して、呼び出し元のメソッドの元のクラス インスタンスも変更されます。
次の例の出力は違いを示しています。クラス インスタンスの willIChange フィールドの値は、メソッド ClassTaker に呼び出しによってクラス インスタンスの指定したフィールドを検索するには、メソッドがパラメーターのアドレスを使用するので変更されます。呼び出し元のメソッドの構造体の willIChange フィールドは、メソッド StructTaker 、アドレスのコピーを呼び出し、引数の値が構造体自体のコピーであるため変更されません。StructTaker は コピーを変更し、 StructTaker への呼び出しが完了すると、コピーは失われます。
使用例
class TheClass
{
public string willIChange;
}
struct TheStruct
{
public string willIChange;
}
class TestClassAndStruct
{
static void ClassTaker(TheClass c)
{
c.willIChange = "Changed";
}
static void StructTaker(TheStruct s)
{
s.willIChange = "Changed";
}
static void Main()
{
TheClass testClass = new TheClass();
TheStruct testStruct = new TheStruct();
testClass.willIChange = "Not Changed";
testStruct.willIChange = "Not Changed";
ClassTaker(testClass);
StructTaker(testStruct);
Console.WriteLine("Class field = {0}", testClass.willIChange);
Console.WriteLine("Struct field = {0}", testStruct.willIChange);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Class field = Changed
Struct field = Not Changed
*/