String 型の値渡し

という内容のスレッドが @IT で燃え上がってます。不思議といえば不思議だし、当たり前と言われれば当たり前ですが、なかなか興味深いです。

ポイントとしては、

public void my_func(string value)
{
    value = "もじれつ";
}

string str = "文字列";
my_func(str);
MessageBox.Show(str);

この時に何が表示されるのか、ということですね。.NET の String は参照型なんですが、実際には my_func() の中のコードは新たな String 型のインスタンスを生成して代入するだけなので、元のインスタンスは全く変更されません。参照を渡しているのに感覚的には値渡しですね。コメントで「String クラスには値を変更する為のメソッドが無いから・・・」云々という回答がありましたが思わず「なるほど!」と思ってしまいました。

でも変更したい場合もあります。その場合は ref キーワードを使います。

public void my_func(ref string value)
{
    value = "もじれつ";
}

string str = "文字列";
my_func(ref str);
MessageBox.Show(str);

とはいえ、あまり使わない方が良いですね。String 型でこの方法が必要なケースはあまり無さそうですし。