C#におけるrefとoutの違い

3520 ワード

C#におけるrefとoutの違い
refとoutの2つのキーワードは似たような効果を提供し、Cのポインタ変数にも似ています.これらの違いは、1、ref型パラメータを使用する場合、入力されたパラメータを初期化する必要があります.outの場合、メソッドで初期化を完了する必要があります.次のようになります.
static void Main(string[] args)
        {
            int a = 5;
            int b =10;
            squareRef(ref a);
            squareOut(out b);
            Console.WriteLine("The a in the Main is: " + a);
            Console.WriteLine("The b in the Main is: " + b);

        }
        static void squareRef(ref int x)
        {
            x = x * x;  //x     a   
            Console.WriteLine("The x in the squareRef is: " + x);
        }
        static void squareOut(out int y)
        {
            y = 10; //     ,   out   ,y             b
            y = y * y;
            Console.WriteLine("The y in the squareOut is: " + y);
        }

2、refとoutを使用する場合、メソッドのパラメータと実行メソッドの両方にRefまたはOutキーを付けます.一致を満たす.
3、outは複数の値(注:複数の戻り値ではない)を返す必要がある場所で使用するのに適しており、refは呼び出される方法で呼び出し者の参照を変更する必要がある場合に使用されます.
        static void testOut(out int a, out int b, out string c, out bool d)
        {
            a = 1;
            b = 2;
            c = "       ";
            d = true;
        }
        public static void Main()
        {
            int a, b;
            string c;
            bool d;

            testOut(out a, out b, out c, out d);
            //      testOut(),      a,b,c,d    ,    out             

            Console.Write("{0},{1},{2},{3}", a, b, c, d.ToString());
            Console.Read();

        }
   

拡張:
注意:C#で、メソッドのパラメータ伝達には、値伝達(by value)、アドレス伝達(by reference)、出力パラメータ(by output)、配列パラメータの4種類があります.(by array).値伝達パラメータは追加の修飾子を必要とせず、アドレスパラメータは修飾子refを必要とし、出力パラメータは修飾子outを必要とし、配列パラメータは修飾子paramsを必要とする.値伝達パラメータはメソッド呼び出し中にパラメータの値を変更した場合、入力メソッドのパラメータはメソッド呼び出しが完了した後にそのために変更されるのではなく、元の入力時の値を保持する.アドレス参照数は正反対で、メソッド呼び出しプロセスがパラメータの値を変更した場合、メソッドに入力されたパラメータは呼び出しが完了した後も変更されます.実際には、名前から両者の意味が明らかになっています.値伝達パラメータは呼び出しパラメータのコピーを伝達し、アドレスパラメータは呼び出しパラメータのメモリアドレスを伝達し、このパラメータは方法の内外で同じ記憶位置を指しています.メソッドパラメータのrefメソッドパラメータキーワードは、メソッド参照をメソッドの同じ変数に渡します.制御が呼び出しメソッドに戻ると、メソッドでパラメータに加えた変更が変数に反映されます.refパラメータを使用するには、パラメータをrefパラメータとしてメソッドに明示的に渡す必要があります.refパラメータの値はrefパラメータに渡されます.refパラメータに渡されるパラメータは、最初に初期化する必要があります.この方法をoutパラメータと比較すると、後者のパラメータはoutパラメータに渡される前に明示的に初期化する必要はありません.属性は変数ではなくrefパラメータとして渡すことはできません.2つのメソッドの宣言がrefの使用のみで異なる場合、リロードが発生します.ただし、refとoutのみで異なるリロードは定義できません.outメソッドパラメータ上のoutメソッドパラメータキーワードは、メソッド参照をメソッドの同じ変数に渡す.制御が呼び出しメソッドに戻ると、メソッドでパラメータに加えた変更が変数に反映されます.メソッドが複数の値を返すことを望む場合、outメソッドを宣言することは非常に有用である.outパラメータを使用する方法では、値を返すことができます.1つの方法は、outパラメータを1つ以上持つことができる.outパラメータを使用するには、outパラメータとしてパラメータをメソッドに明示的に渡す必要があります.outパラメータの値はoutパラメータに渡されません.outパラメータとして渡される変数を初期化する必要はありません.ただし、メソッドが戻る前にoutパラメータに値を割り当てる必要があります.属性は変数ではなく、outパラメータとして渡すことはできません.ネット上ではrefが値だけを伝えたり、outがアドレスを伝えたりするなど、あまり正確ではないようです.以下は私が作ったインスタンスコードです.public int RefValue(int i,ref int j){int k=j;j=222;return i+k;        }               public int OutValue(int i, out int j)         {             j = 222;             return i + j;         }         private void cmdRef_Click(object sender, EventArgs e)         {             int m = 0;             MessageBox.Show(RefValue(1, ref m).ToString());             MessageBox.Show(m.ToString());         }         private void cmdOut_Click(object sender, EventArgs e)         {             int m;             MessageBox.Show(OutValue(1, out m).ToString());             MessageBox.Show(m.ToString());         }