1

aFooList挿入した 5 つのアイテムではなく、最後のアイテムの 5 つのコピーが含まれているのはなぜですか?

期待される出力:01234

実際の出力:44444

using System;
using System.Collections.Generic;

namespace myTestConsole {
    public class foo {
        public int bar;
    }

    class Program {
        static void Main(string[] args) {
            foo aFoo = new foo(); // Make a foo
            List<foo> aFooList = new List<foo>(); // Make a foo list

            for (int i = 0; i<5; i++) { 
                aFoo.bar = i;
                aFooList.Add(aFoo);
            }

            for (int i = 0; i<5; i++) {
                Console.Write(aFooList[i].bar);
            }
        }
    }
}
4

4 に答える 4

4

同じアイテムをaFoo, 5 回追加しました。新しいコピーを作成しない参照型オブジェクトの内容を変更すると、同じオブジェクトが変更されます。

于 2013-03-19T21:33:28.700 に答える
2
List<foo> aFooList = new List<foo>(); // Make a foo list

for (int i = 0; i<5; i++) { 
    foo aFoo = new foo(); // Make a foo
    aFoo.bar = i;
    aFooList.Add(aFoo);
}

aFoo がリストにある間、まだ変更中です。

于 2013-03-19T21:32:49.453 に答える
0

同じオブジェクトへの参照をリストに5回追加しました。そのたびに、の値を変更しますbaraFooList.Add(aFoo);リストにを追加するたびに効果を確認するには、後にこの行を追加してくださいfoo

Console.WriteLine(string.Join("", foos.Select(f => f.bar)));

価値があるのは、Linqを使用したワンライナー(読みやすくするために適切な間隔で配置されている)です。

var foos = Enumerable.Range(0, 5)
                     .Select(n => new foo {bar = n})
                     .ToList();

完全な例:

foo aFoo = new foo(); // Make a foo
List<foo> aFooList = new List<foo>(); // Make a foo list
Console.WriteLine("\nUsing aFooList");
for (int i = 0; i < 5; i++)
{
    aFoo.bar = i;
    aFooList.Add(aFoo);
    Console.WriteLine(string.Join("", aFooList.Select(f => f.bar)));
}

var foos = Enumerable.Range(0, 5).Select(n => new foo { bar = n }).ToList();
Console.WriteLine("\nUsing foos");
Console.WriteLine(string.Join("", foos.Select(f => f.bar)));

Console.ReadLine();

出力:

aFooListの使用
0
11
222
3333
44444

foosの使用
01234
于 2013-03-19T21:45:12.530 に答える
0

変数「aFoo」は、基本的にメモリ内の場所へのポインタです。別のインスタンス (malloc) を「新しく」作成しないと、メモリ内の同じ場所を変更し、同じポインターを 5 回追加します。

"new" キーワードは、プログラマーが C で malloc を行うように、C# で機能を満たします。新しいメモリ ロケーションを取得し、aFoo が古いメモリ ロケーションではなくそのロケーションを指すようにします。

MSDN から:

The new operator is used to create objects and invoke constructors

MSDN

于 2013-03-19T21:44:08.160 に答える