C# Tips


関数のパラメータの挙動を理解する


C#では関数のパラメータとしてobjectはそのコピーを渡されます。つまり渡されたobjectは基本的に元のままで返されます。
C++の値渡しと一緒です。参照渡しではありません。

ここでは、二つのサンプルSwapとModifyを紹介します。
Swapは2つのObjectの中身を入れ替えようとする関数、ModifyはObjectの中身を変更しようとする関数です。
どちらも期待通りには動作しません。
パラメータとして渡されたObjectは関数の処理終了後も元のままです。

どうしてもこのような関数を作りたいときには、キーワードrefを使用します。
しかし、実際には関数ではなく、classを作成しclassの関数もしくはパラメータを通じて同じような動作を実装するのが良いでしょう。

// Swap; attempt to swap two object
private void swap(object a, object b)
{
	object temp = a;
	a = b;
	b = temp;
}

// Test Swap function...
private void buttonSwap_Click(object sender, System.EventArgs e)
{
	string a = "a";
	string b = "b";
        swap (a, b);
	Console.WriteLine("a: {0}", a);
	Console.WriteLine("b: {0}", b);
}

// Swap Result
// a: a
// b: b
// Swap failed!!


// Modify
private void modify(string a)
{
	a = "modified";
}

// Try to modify...
private void button_Click(object sender, System.EventArgs e)
{
	string a = "a";
	modify(a);
	Console.WriteLine(a);
}

// Modify Result
// a
// not modified!!


目次に戻る
Copyright(c) 2008 WoodenSoldier Software