-2

次のようなユーザー定義のクラスがあります。

class Foo
    {
        public int dummy;

        public Foo(int dummy)
        {
            this.dummy = dummy;
        }
    }

そして、このようなものを持っています:

ArrayList dummyfoo = new ArrayList();

Foo a = new Foo(1);
dummyfoo.add(a);

foreach (Foo x in dummyfoo)
    x.dummy++;

a.dummyはいくらですか?

a.dummyが2になるようにArrayListを作成するにはどうすればよいですか。つまり、ArrayListには基本的にオブジェクトへのポインターが含まれ、コピーは含まれません。

4

4 に答える 4

2

コピーではなく、すでに参照が含まれています。これを行うとき:

Foo a = new Foo(1);
dummyfoo.Add(a);

コピーではなく、への参照aが渡されます。

したがって、dummy最初は1になり、増分後に2になります。

とにかく、ジェネリックを使用する方が良いでしょう:

List<Foo> dummyfoo = new List<Foo>();

Foo a = new Foo(1);
dummyfoo.Add(a);

foreach (Foo x in dummyfoo)
    x.dummy++;
于 2012-05-21T14:53:52.460 に答える
2

配列/コレクション(正確には、任意の.NETクラス/参照型)がデフォルトで参照によって渡されるため、すでに2になっています。

実際、参照変数は値によって渡されますが、参照によって渡されたかのように動作します。

なぜ->

  Consider var arr = new ArrayList();

上記のステートメントは、最初にArrayListオブジェクトを作成し、参照がarrに割り当てられます。(クラスは参照型であるため、これはどのクラスでも同様です)。

さて、お電話の際は、

example ->    DummyMethod(arr) , 

参照は値によって渡されます。つまり、パラメーターがメソッド内の別のオブジェクトに割り当てられている場合でも、元の変数は変更されません。
ただし、可変ポイント(参照)は同じオブジェクトを参照するため、基になるポイントオブジェクトに対して実行された操作は、呼び出されたメソッドの外部に反映されます。
あなたの例では、それぞれに対して行われた変更は、arrayListに反映されます。

この動作を回避したい場合は、オブジェクトのコピー/クローンを作成する必要があります。

例:

それ以外の

foreach (Foo x in dummyfoo)
        x.dummy++;

使用する

foreach (Foo x in (ArrayList)dummyfoo.Clone())
        x.dummy++;
于 2012-05-21T15:11:01.807 に答える
1

Fooクラスとして宣言しました。クラスは参照型です。すでにこのように動作します。試してみる:

class Program
{
    static void Main(string[] args)
    {
        ArrayList dummyfoo = new ArrayList();

        Foo a = new Foo(1);
        dummyfoo.Add(a);

        foreach (Foo x in dummyfoo)
            x.dummy++;

        Console.WriteLine(a.dummy); //Prints 2!
    }
}

class Foo
{
    public int dummy;

    public Foo(int dummy)
    {
        this.dummy = dummy;
    }
}

余談List<T>ですが、非推奨のArrayListタイプよりもジェネリックが優先されます。

于 2012-05-21T14:56:44.427 に答える
1

それはすでに2です:これはそれを検証するideoneのあなたのコードです..

値型(つまりstructs)とは異なり、参照(つまりclass)オブジェクトは参照によって渡されます。

PS GenericsはC#2.0以降で使用できるため、型の安全性を向上させるためList<Foo>に、の代わりに使用することを検討してください。ArrayList

于 2012-05-21T14:57:19.073 に答える