C#でのキーワードrefおよびout

ref

ref:MSDNは、次のように定義されています。「refキーワードは、参照によって渡される値を示します。」は、参照によってパラメーターを渡すことです。refはReferenceの略語でもあります。

refを使用しないでください

using System;

namespace Test_Code
{
   class A
    {
       public void Method( int a)
       {
            a += 1;
       }

        public static void Main()
        {
            int c = 10;
            A B = new A();
            B.Method(c);
            Console.WriteLine(c);
        }
    }
}
//输出10

refキーワードを使用する

using System;

namespace Test_Code
{
    class A
    {
        public void Method(ref int a)
        {
            a += 1;
        }

        public static void Main()
        {
            int c = 10;
            A B = new A();
            B.Method(ref c);
            Console.WriteLine(c);
        }
    }
}
//输出11

总结

refキーワードを使用しない場合、関数が受け取る値は10であり、メソッド(int a)メソッドでは、ローカル変数aが累積された後、メソッドの実行後に破棄されます。cの値はまだ10です。
refキーワードを使用して、cの値を受け取った関数Method(ref int a)は、実行された関数のアドレスa + = 66です。この場合はc + = 66に対応します。アドレス値cを直接変更します。
したがって、値型パラメーターを渡す方法、つまり同じキーの変数直接操作を参照してください。

でる

outの定義:パラメーター修飾子として、値ではなく参照によってメソッドに引数を渡すことができます。パラメーター修飾子としての「out」を使用すると、値ではなく参照によってメソッドにパラメーターを渡すことができます。
インターフェースとデリゲートのジェネリック型パラメーター宣言では、型パラメーターが共変であることを指定します。/インターフェースとデリゲートのジェネリック型パラメーター宣言では、型パラメーターが共変であることを指定します。今日のコンテキストでは、参照としてパラメーターを渡すことの最初の定義についてのみ説明します。

int number;
 
Method(number);
 
void Method(int a)
{
    a = 66;
}
 
Console.WriteLine(number);
//输出:0
 
 
 
int number;
 
Method(out number);
 
void Method(out int a)
{
    a = 66;
}
 
Console.WriteLine(number);
//输出:66

总结

上記のoutの使用法のパフォーマンスから判断すると、outとrefの両方で、実際にはパラメーターを参照によって渡すことができます。

refとoutの違い:

refを使用してパラメーターを渡す場合、refで変更されたパラメーターには値が必要ですが、outは、割り当てられていない変数をパラメーターとして使用して渡すことができます。

using System;

namespace Test_Code
{
    class RefAndOut
    {
        public static void OutDouble(out int out_int)
        {
            out_int = 2;
            Console.WriteLine(out_int);
        }
        public static void RefDouble(ref int ref_int)
        {
            ref_int *= 2;
            Console.WriteLine(ref_int);
            Console.ReadKey();
        }
        public static void NormalDouble(int IntPar)
        {
            IntPar = 1;
            IntPar *= 2;
            Console.WriteLine( IntPar);
            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            int out_int;
            int ref_int;
            int normalInt;
            OutDouble(out out_int);
            RefDouble(ref ref_int);//错误:使用了未赋值的变量refInt
            NormalDouble(normalInt);//错误:使用了未赋值的变量normalInt
        }
    }

}

このコードには、2つの場所でエラーがあります。つまり、refが使用されている場合と、修飾子が使用されていない場合、値を持つパラメーターを渡す必要があります。ご覧のとおり、refとoutの違いはほとんど1つだけです。つまり、outは割り当てられていない変数を使用できます。

結論として:

キーワード「ref」と「out」の唯一の違いは、キーワード「out」は、渡されるパラメータ値を初期化するために呼び出し元のコードを必要としないことです。では、キーワード「ref」はいつ使用されますか?呼び出し元のメソッドがパラメーター値を初期化したことを確認する必要がある場合は、キーワード「ref」を使用する必要があります。上記の例では、「out」を使用できるのはメソッドによるものです。呼び出される渡される変数の値には依存しません。

おすすめ

転載: blog.csdn.net/qq_40513792/article/details/115168287