はかせのラボ

私の頭の中を書いていく雑記ブログです

C# 参照渡し

あいさつ

どうも、はかせです。
今回はC#の参照渡しについて
忘れていることがあったのでそのまとめです。

参照渡しとは?

名前の通り変数の参照を渡すことです。
基本的にC#のメソッド引数は値渡しとなっており、
渡された値をどれだけ弄ろうと呼び出し元の変数には一切影響がありません。

ですが、変数の更新をメソッドに任したい場面もあるかと思います。
そういった時に使うのが参照渡しになります。

やり方

やり方自体はとても簡単で
refキーワードをつけるだけです。

public void Hoge(ref int hoge){....}

int hoge = 10;
Hoge(ref hoge);

注意点としてはメソッドの引数には
事前に宣言した変更可能な変数を渡す必要があります。
理由は参照渡しはその変数の参照を渡しているからです。
(C++のポインタとかがイメージ近いかも)

なので事前に宣言された変数でないと参照自体がない、
また変更不可だと渡されても値を弄れないということで
エラーになります。

実際に使ってみる

比較ということで
通常の値渡しと参照渡しそれぞれ実行した後での
変数の中身を表示しています。

namespace ConsoleApp2
{
    public static class Tekitou
    {
        public static void Hogee(int hoge)
        {
            hoge += 10;
        }
        public static void Hoge(ref int hoge)
        {
            hoge += 10;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int hoge = 10;
            Console.WriteLine(hoge);
            Tekitou.Hogee(hoge);
            Console.WriteLine(hoge);
            Tekitou.Hoge(ref hoge);
            Console.WriteLine(hoge);
        }
    }
}

実行結果です。
f:id:hakase0274:20190728233834p:plain
最初の二つは同じですが、
最後の参照渡し後の中身が変わっています。

参照渡しの種類

一応コラム的な感じで。
今回はrefキーワードを使いましたが
実は参照渡しのキーワードは三種類あります。
ref・・・読み書き可能
in・・・読み取り専用
out・・・書き込み専用

それぞれ目的に応じて最小限の権限で使えるよう
使うキーワードは考えましょう。

あとがき

今回はC#の参照渡しについてでした。
最近ずっとC++ばっかやってきて
ポインタとかでパワープレイを続けてきた影響か
C#のこういうところが煩わしく感じてしまいますね・・・

ただこういうのがあるからこそ
プログラマーが余計なことを気にせず
ガリガリコード書けるんでしょうね。
(C++でそんなことしたらメモリが死にますからね)

それでは今回はこの辺でノシ