メソッドの引数で結果を返したい場面というのは少なからずある。
// Class1 は構造体ではない。
Class1 c = new Class1();
bool success = Func( ref c );
if( success )
{
c.Hoge();
}
private bool Func( ref Class1 c )
{
c.Id = 1;
return true;
}
C や C++ に慣れ親しんだ人が上記のように書いているのを時折見かけるが、このような ref は無意味だ。参照型で ref を指定するシナリオは 100% ない。ref を指定しなくても同じ結果を得られる。
private bool Func( Class1 c )
{
c.Id = 1;
return true;
}
これで呼び出し元に結果が返る。
次の例では呼び出し元に結果は返らない。
private bool Func( Class1 c )
{
c = new Class1();
c.Id = 1;
return true;
}
この時は out を指定してやればよい。そうすれば呼び出し元でインスタンスを作ってやる必要がない。
Class1 c;
bool success = Func( out c );
if( success )
{
c.Hoge();
}
private bool Func( out Class1 c )
{
c = new Class1();
c.Id = 1;
return true;
}
唯一 ref を使わなければ出来ない用法が次だ。
private bool Func( ref Class1 c )
{
int id = c.Id;
// id を何かに使う。
c = new Class1();
c.Id = 1;
return true;
}
これは絶対にやめた方がよい。
Func() メソッドは、意味のある引数を必要としながら、尚且つそれを別のインスタンスに置き換える。これでは Func() を使用するクライアントは混乱をきたすだろう。
つまり、参照型で ref を使う事はない。