C# メソッドの値渡しと参照渡しのサンプル

C#のメソッドの値渡しと参照渡しのサンプルです。

目次

値渡し

値渡しは、メソッドを呼び出す時、値をコピーして渡します。
そのためメソッドの中で値が変化しても元の値には影響ありません。
メソッドで引数を渡すときのデフォルトは、値渡しです。

コード

19行目は、引数に変数aをセットしています。
9行目で変数の値が変わり10行目では2が表示されます。
20行目は、変数aの元の値は変わらないので1が表示されます。

using System;

namespace Project1
{
    class Sample1
    {
        public void GetCnt(int a)
        {
            a = a + a;
            Console.WriteLine(a); //2
        }
    }
    class Test1
    {
        static void Main()
        {
            int a = 1;
            Sample1 s1 = new Sample1();
            s1.GetCnt(a);
            Console.WriteLine(a); //1
        }
    }
}

参照渡し(refキーワード)

参照渡しは、メソッドを呼び出す時、アドレスをコピーして渡します。
そのためメソッドの中で値が変化すると元の値も変更されます。
参照渡し時は、refキーワードを追加します。
以下は、Microsoftのref (C# リファレンス)のリンクです。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/ref

コード

19行目は、引数に変数をセットしています。refキーワードもついています。
7行目も引数の前にrefキーワードがついています。
9行目で変数の値が変わり10行目では2が表示されます。
20行目は、17行目の変数の値が表示されます。元の値も変わっているので2が表示されます。

using System;

namespace Project1
{
    class Sample1
    {
        public void GetCnt(ref int a)
        {
            a = a + a;
            Console.WriteLine(a); //2
        }
    }
    class Test1
    {
        static void Main()
        {
            int a = 1;
            Sample1 s1 = new Sample1();
            s1.GetCnt(ref a);
            Console.WriteLine(a); //2
        }
    }
}

outキーワード

outキーワードは、戻り値を複数にできます。returnの戻り値は1つのみです。
以下は、Microsoftのout パラメーター修飾子 (C# リファレンス)のリンクです。https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/out-parameter-modifier

コード

19行目は、引数のr1とr2にoutキーワードがついています。またこの書き方だと変数r1とr2の宣言も行われていることになります。
7行目も引数の2つにoutキーワードがついています。
9,10行目は、returnがありませんが、outキーワードがついていた変数bとcの値は呼び出し元に返ります。
20,21行目は、それぞれ2,3が表示されます。

using System;

namespace Project1
{
    class Sample1
    {
        public void GetCnt(int a,out int b, out int c)
        {
            b = a + a;
            c = a + b;
        }
    }
    class Test1
    {
        static void Main()
        {
            int a = 1;
            Sample1 s1 = new Sample1();
            s1.GetCnt(a,out int r1,out int r2);
            Console.WriteLine(r1); //2
            Console.WriteLine(r2); //3
        }
    }
}

関連の記事

C# メソッドのサンプル
C# オーバーライドのサンプル
C# オーバーロードのサンプル

△上に戻る