今回はC#の参照渡しを解説してきます。
目次
スポンサーリンク
C#における参照渡し
C#では関数の引数にref
をつけると参照渡しとなります。
サンプルコード
using System;
namespace RefSample
{
class Program
{
static void Main(string[] args)
{
int x = 10;
Calc1(x);
Console.WriteLine("X = " + x);
Calc2(ref x);
Console.WriteLine("X = " + x);
Console.ReadLine();
}
/// <summary>
/// 値型の値渡し
/// </summary>
/// <param name="y"></param>
static void Calc1(int y)
{
y = 55;
}
/// <summary>
/// 値型の参照渡し
/// </summary>
/// <param name="y"></param>
static void Calc2(ref int y)
{
y = 55;
}
}
}
実行結果
X = 10
X = 55
参照渡しをしているCalc2(ref int y)
の方はxの値が変更されました。
2つの関数の違いを具体的に説明すると、Calc1ではxそのもの(10)がyにコピーされています。
一方、Calc2ではxのアドレスがyに書き込まれています。こちらではxの値を書き換えることができるのがわかります。
参照渡しの重要性
たまに「参照渡しは時代遅れ」という言葉を聞きますが、C#界隈では参照渡しはかつてないブームになっています。
これは、C#のコンパイラがC++製からC#製のRoslynに変わったことが大きいです。パフォーマンスに対する要求が今まで以上に大きくなったため、スタックを上手く使ってピープアロケートを避けて遅くなる原因を取り除く試みがされています。
C#の参照渡しは「安全なポインタ」でもあるのです。
コメント