2

アプリケーションは 24 を出力していますが、ref キーワードがないとオブジェクトのコピーのみが渡され、元のオブジェクトに変更が加えられていないことがわかっている場合、18 を出力すべきではありません。myclass というクラスとオブジェクト me を作成しました。age は、クラス myclass のパブリック変数です。me.age を 18 に設定し、メソッド show で 24 に変更しました。

class Program
{        
    static void Main(string[] args)
    {
        myclass me = new myclass();
        me.age = 18;
        show(me);
        Console.WriteLine(me.age);
        Console.ReadLine();
    }

    public static void show( myclass you)
    {
        you.age = 24;        
    }
}

class myclass
{
    public int age;
}
4

5 に答える 5

2

これを C++ クラスと混同している可能性があります。C# では、クラスは参照型です。つまり、クラス型の変数がある場合、その変数はオブジェクト自体を保持するのではなく、オブジェクトへの参照のみを保持します (ポインターと考えることができます)。したがって、オブジェクトをメソッドに渡すときは、実際にはそのオブジェクトへの参照を渡します。これは、観察している動作が正しいことを意味します。

C# は、(Java などとは異なり)の代わりに使用して作成する値型もサポートしています。に変更すると、期待どおりの動作が得られます。structclassmyclasssrtuct

于 2013-05-24T01:12:58.113 に答える
2

正しいものを印刷しています。

myclassはオブジェクトであり、デフォルトの動作は C# でオブジェクトの参照を渡すことなので、何も指定しない場合は参照を渡します。

ただし、構造体はデフォルトでは参照ではないため、宣言するstruct myclassと、必要な動作が得られます。

于 2013-05-23T23:42:21.833 に答える
1

値型と参照型を混同しています。

public void addTwo(int a)
{
    a += 2;
}

...

int a = 5;
addTwo(a);
Console.WriteLine(a); // will give "5";

public void addTwo(ref int a)
{
    a += 2;
}

...

int a = 5;
addTwo(ref a);
Console.WriteLine(a); // will give "7";

class参照型の場合 (の代わりにとして定義されているstructものはすべて、渡しているのはオブジェクトへの参照であり、コピーではありません。したがって、実際にはオブジェクトを変更しています。

于 2013-05-23T23:41:15.110 に答える
0

関数にオブジェクトを送信しています。

アトミック型または構造体ではないため、参照によって送信されます (これが C# のしくみです)。関数内のこのオブジェクトで変更したものは、同じであるため、元のオブジェクトでも変更されます。

パラメーターの受け渡しの詳細: http://msdn.microsoft.com/en-us/library/0f66670z(v=vs.71).aspx

于 2013-05-23T23:41:04.730 に答える