1

次のコードがあります。

public void Start()
    {
        List<StructCustomer> listCustomer = new List<StructCustomer>();

        listCustomer.Add(
            new StructCustomer { ID = 0, name = "Any Default Name", birthday = DateTime.Now });


        DoSomethingWithStructList(listCustomer);
        StructCustomer customer = listCustomer.First();
        Console.WriteLine("ID = {0}, Name = {1}", customer.ID, customer.name); // Writes ID = 0, Name = "Any Default Name"

    }

public void DoSomethingWithStructList(List<StructCustomer> listStructs)
        {
            StructCustomer test = listStructs.First();
            test.ID = 2;
            test.name = "Edited by method";
            Console.WriteLine("ID = {0}, Name = {1}", test.ID, test.name); // Writes "ID = 2, Name = Edited by method"
        }

 public struct StructCustomer
        {
            public int ID { get; set; }
            public string name { get; set; }
            public DateTime birthday { get; set; }
        }

お気づきのように、変数 List は Customer の List への参照です。リストの StructCustomer 変数で値を編集する必要はありませんか?

構造体は値であり、参照型ではないことは知っていますが、リストでボックス化しています!

4

4 に答える 4

1

さて、これを行うと:

StructCustomer test = listStructs.First();
test.ID = 2;
test.name = "Edited by method";
Console.WriteLine("ID = {0}, Name = {1}", test.ID, test.name);

実際には、listStructs の最初の構造体のコピーを作成しているため、実際の値ではなく、コピーの値を変更します。代わりにこれを試してみてください - 動作するはずです:

listStructs.First().ID = 2;
listStructs.First().name = "Edited by method";

それで、それです;)OBS:このアプローチはCPU使用率から推奨されていませんが、回避策です=)

于 2013-09-02T01:30:27.607 に答える
1

構造体は値型であるため、例のようにリストから取得すると、取得するのはその値のコピーです。次に、これを変更します。これは、リストに含まれているオリジナルの内容を変更しません。

リスト内の要素を変更する場合は、次のようにします。

listStructs[0].ID = 2;
listStrings[0].name = "Edited by method";
于 2013-09-02T01:20:50.943 に答える
0

List には値の型が含まれているため、項目を要求すると値が返されます。List を作成してみると、同じ動作が見られます。

その結果、リスト内のリスト項目に直接割り当てを行う必要があります。foreach ループでリストを反復処理することにより、意味的に、実行しようとしているものに近い動作を行うことができます。

于 2013-09-02T01:32:19.673 に答える