0

次のコードがあります。

   static void Main(string[] args)
    {
        myclass c = new myclass();

        c.test1 = 1;

        myclass c2 = TestPassByValByRef(c);

        Console.WriteLine("c.Test1: {0}", c.test1);
        Console.WriteLine("c2.Test1: {0}", c2.test1);
        Console.ReadLine();
    }

    private static myclass TestPassByValByRef(myclass c)
    {
        Console.WriteLine("Before NowPassByRef c.Test1: {0}", c.test1);
        NowPassByRef(ref c);
        Console.WriteLine("After NowPassByRef c.Test1: {0}", c.test1);

        return c;
    }

    private static void NowPassByRef(ref myclass c)
    {
        c = new myclass();
        c.test1 = 10;
        c.test2 = 25;
    }

c2 は変更された値を保持しますが、c は保持しません。私の質問はこれです:cで はどうなりTestPassByValByRefますか?

4

4 に答える 4

2

を呼び出すTestPassByValByRefと、オブジェクトへの 2 つの参照があります。Mainの参照と へのパラメータの参照ですTestPassByValByRefstructこれは、C# で参照型 ( ではないもの) を「値渡し」で渡すと、実際にはオブジェクト自体ではなく、参照が値渡しされるためです。したがって、参照がコピーされ、元のオブジェクトへの 2 つの参照が存在します。

の呼び出し後、NowPassByRefTestPassByValByRef参照のコピーは の新しいインスタンスへの参照によって上書きされましたmyclassが、オブジェクト内にまだ参照が存在するMainため、ガベージ コレクションの対象にはなりません。

したがって、「何が起こるか」に対する短い答えは「何もない」です。

于 2012-06-20T14:45:37.903 に答える
0

最初のケースでは、オブジェクトにareferenceを渡します。

したがって、最初のケースで makeを実行すると、のコピーnew再初期化されるため、元のオブジェクトとの関係が失われます。reference

reference 2番目のケースでは、それ自体を渡すため、それを再初期化するとnew、それが指すメモリの場所も変更されます。

于 2012-06-20T14:43:51.663 に答える
0
static void Main(string[] args)
{
    myclass c = new myclass();

    c.test1 = 1;

    myclass c2 = TestPassByValByRef(c);

    Console.WriteLine("c.Test1: {0}", c.test1);
    Console.WriteLine("c2.Test1: {0}", c2.test1);
    Console.ReadLine();
}

mainには 2 つの参照が含まれており、どちらも type のオブジェクトを参照できますmyclasscの前TestPassByValByRefc2初期化され、そのメソッドの戻り値によって初期化されます。

private static myclass TestPassByValByRef(myclass c)
{
    Console.WriteLine("Before NowPassByRef c.Test1: {0}", c.test1);
    NowPassByRef(ref c);
    Console.WriteLine("After NowPassByRef c.Test1: {0}", c.test1);

    return c;
}

TestPassByValByRefと呼ばれる単一の参照が含まれていますc。最初は、パラメーターとして渡された参照のコピーが含まれています (そのパラメーターは値で渡されたため)。この参照は参照によって渡されNowPassByRef、返されます。

private static void NowPassByRef(ref myclass c)
{
    c = new myclass();
    c.test1 = 10;
    c.test2 = 25;
}

NowPassByRefc呼び出しメソッドと参照を共有します。戻る前に、すぐに新しい値に再割り当てします。


何が起こると思っていましたか?

于 2012-06-20T14:49:36.150 に答える
0

次のコードでは、渡された を指していないc = new myclass();新しいメモリ参照を作成します。object cこのため、作成した最初のオブジェクトに変更が反映されていません。

private static void NowPassByRef(ref myclass c)
    {
        c = new myclass();  // it will create new memory reference
        c.test1 = 10;
        c.test2 = 25;
    }

したがって、 c が変更されず、次のように出力されます。

Before NowPassByRef c.Test1: 1
After NowPassByRef c.Test1: 10
c.Test1: 1
c2.Test1: 10

しばらくの間c = new myclass();、メソッドで をコメントするだけで、 への変更が反映されますobject c。参照ポインタなどについての疑問が解消されます。

private static void NowPassByRef(ref myclass c)
        {
            //c = new myclass();  // it will create new memory reference
            c.test1 = 10;
            c.test2 = 25;
        }

出力は次のようになります。

Before NowPassByRef c.Test1: 1
After NowPassByRef c.Test1: 10
c.Test1: 10
c2.Test1: 10

私はこれだと思います -C#は値/参照で渡しますか?質問の説明情報である必要があり、 C# でのパラメーターの受け渡し に関する John Skeet の記事を確認してください。

于 2012-06-20T14:48:00.520 に答える