2

私のメソッドの1つは、パラメーターとしてを受け入れout int iます。この変数の値を取得して、ローカル変数に割り当てる必要があります。

問題を示す次の単純なコンソールアプリケーションについて考えてみます。

class Program
    {
        static void Main(string[] args)
        {
            Other o = new Other();
            int i = 5; 
            o.Demo(out i);
            Console.WriteLine(i);
            Console.ReadKey();
        }
    }

    class Other
    {
        public void Demo(out int i)
        {
            // i = 10; Uncomment this to fix it (although this would not be an option)
            int k = i;            
        }
    }

変数iをkに割り当てることができません(Demoメソッドで)。誰かが説明を持っていますか(そして回避策:))。

編集

上記は、私がやろうとしていることの単なる不自然な例です。ライブでは、問題はコードを書き直していることであり、この段階では、「アウト」を変更することはできません。他の多くのプロジェクトによって参照されるコンストラクターのパラメーター!これは私が詰め込まれていることを意味するかもしれないと思います

4

5 に答える 5

3

この理由は、次のように変更するとより明確になります。

Other o = new Other();
int i;
o.Demo(out i);
Console.WriteLine(i);

通話前にi「確実に割り当てられている」のではなく、通話に「確実に割り当てられている」ことに気付くでしょう。より一般的には、結果として、パラメータはメソッド本体へのエントリで「確実に割り当てられる」わけではありません。パラメータに値を割り当てる必要があります。out

  • あなたがそれを読もうとする前に(もしあれば)
  • 退出前(例外を除く)

にも値を渡したい場合は、ref代わりに を使用しoutます。

技術的 refに とoutは実装に関して同一であることに注意してください。明確な代入の特別な処理はコンパイラ機能であり、ダミー値で初期化する必要がないようにすることを目的としています。次に例を示します。

int i = 0; // why zero? this zero is useless and never used!
if(int.TryParse(s, out i)) {...}

より良い:

int i;
if(int.TryParse(s, out i)) {...}
于 2012-10-15T13:38:43.367 に答える
2

ポイントは、渡された変数に値を割り当てる必要outがあることです。out

あなたのコメントが示唆するように、これがオプションでないout場合は、これを使用しないでください。

値を割り当てるには、通常どおり値を渡します。

class Other
{
    public void Demo(int i)
    {
        int k = i;            
    }
}

outユースケースを明確にしたので、コンストラクターからリファクタリングする必要があると思います。まず、コンストラクターのオーバーロードを見てください。オーバーロードなしで使用できるオーバーロードを用意しout、呼び出しサイトをoutすべてクリアするまでパラメーター付きのサイトに変更し始めます。

于 2012-10-15T13:35:47.913 に答える
2

まあ、out変数がメソッドuninitializedに入ることを意味するので、使用する前に初期化する必要があります。

の意味outは、変数がプロシージャーによって設定されるということです。あなたのコードでは、それは本質的に同じです

int Demo()
{
    return ...;
}

上記の例のように値を返すことは、通常、outパラメーターを介して返すよりも優先されることに注意してください。

于 2012-10-15T13:38:15.957 に答える
2

ポイントoutは、値がメソッドから出てくることであり、入ってこないことです。C# コンパイラがこれを実行できない理由は、次のコンパイルを妨げるのとまったく同じ理由です -i初期化されていません

int i; int k = i;

このパラメーターを使用してこのメ​​ソッドに値を渡したい場合は、使用するref(値が入出力されるようする) か、完全に削除するout(値がこのメソッドにのみ渡されるようにする)必要があります。

于 2012-10-15T13:39:16.217 に答える
0

それがoutの要点です。関数が戻る前に値を割り当てる必要があります。この動作が気に入らない場合は、完全にスキップするか、代わりにrefキーワードを使用してください。

于 2012-10-15T13:39:39.820 に答える