【C#超入門】参照の値渡し|refを使ってコードを最適化する方法

C# ref 参照渡し

今回は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#の参照渡しは「安全なポインタ」でもあるのです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

都内の精密機器を作っている会社に勤務している14年目のエンジニアです。趣味は美味しいものを食べることとゴルフ。プログラムについて今まで学んだことをわかりやすく発信するサイトを目指しています。

コメント

コメントする

目次