4

次のコードの出力には驚きました。「a」は、新しく作成されたオブジェクトへの参照を保持する必要があると思います。結果が 2 でない理由を誰か説明できますか?

class Program
{
    static void Main(string[] args)
    {
        aclass a = new aclass();
        Process(a);
        Console.WriteLine(a.number);

        Console.ReadLine();
    }

    static void Process(aclass a)
    {
        aclass temp = new aclass();
        temp.number++;
        //Console.WriteLine(temp.number);

        a = temp;
        a.number++;
        //Console.WriteLine(a.number);
    }

}

class aclass
{
    public int number = 0;
}

編集:これはインタビューの質問です。長い間その概念を誤解していたことに今気づきました。引数 a は元の a とは異なりますが、同じアドレスを参照しています。

4

3 に答える 3

10

実際の元の参照を変更しているのではなく、パラメーターに保持されている参照を変更しているだけで、微妙に同じではありません。変更は呼び出し元に永続化されません。outまたはを使用して、この動作を変更できますref

refこの場合、参照も渡すので、特に使用したいと思います。

試す:

class Program
{
    static void Main(string[] args)
    {
        aclass a = new aclass();
        Process(ref a);
        Console.WriteLine(a.number);

        Console.ReadLine();
    }

    static void Process(ref aclass a)
    {
        aclass temp = new aclass();
        temp.number++;
        //Console.WriteLine(temp.number);

        a = temp;
        a.number++;
        //Console.WriteLine(a.number);
    }

}

でまったく新しい参照を割り当てていることを思い出してくださいa = temp。最初に渡した既存のクラスを更新したいだけの場合は、次のようにすることができます。

a.number = temp.number;
a.number++;

これにより、 の必要性がなくなりrefます。

詳細については、MSDN を参照してください。

参照型パラメータの受け渡し

ref キーワード

out キーワード

于 2013-10-01T10:36:53.843 に答える
0

この行aclass a = new aclass();は、メモリ内に変数 (データを保存できるスペース) を作成します。メモリ内のアドレスは で*(0x12DF)あり、valueその場所に格納されているのはオブジェクトであると考えてください。a

この行はof object NOT THE ADDRESSを functionにProcess(a)渡します。そのため、 で起こったことはof の locationとは何の関係もないため、location の内容はを呼び出す前と同じままになります。VALUEa ProcessProcess()contents*(0x12DF)*(0x12DF)Process()

*(0x12DF)= の内容

混乱を招くのではなく、お役に立てば幸いです!!

于 2013-10-01T11:02:17.233 に答える
0

それは基本的に

  • 参照型を値で渡す // Process(a);
  • 参照による参照型の受け渡し // Process(ref a);

この例では、参照型である Process(a) - 'a' が ref パラメータなしでメソッドに渡されます。このような場合、a を指す参照のコピーがメソッドに渡されます。

Process メソッド内で new 演算子を使用してメモリの新しい部分を割り当てると、変数 'a' が aclass の新しいオブジェクトを参照するようになります。したがって、その後の変更は元のオブジェクト「a」には影響しません。

MSDN を参照してください: http://msdn.microsoft.com/en-us/library/s6938f28.aspx

于 2013-10-01T11:15:07.613 に答える