-2

これは私のクラス宣言です:

    List<Carton> Cartons = new List<Carton>();
    public class Carton
    {
        public string CartonLabel;
        public string PN;
        public List<string> Serials;            
    }

これは、Carton.Serials に割り当てるために最後に使用する一般的なリストです。

    List<string> Serials = new List<string>();

私が行うと Carton.Serials が空になる理由:Serials.Clear()

    if (Serials.Count > 0)
                        {
                            Carton CartonItem = new Carton();
                            CartonItem.CartonLabel = CartonData;
                            CartonItem.PN = PNData;
                            CartonItem.Serials = Serials;
                            Cartons.Add(CartonItem);
                            Serials.Clear();
                        }
4

5 に答える 5

7

に割り当てSerialsますCartonItem.Serials。それはコピーを作成しません。それはまだ同じリストであり、両方の変数が同じインスタンスを指しています。

コピーを作成したい場合は、以下を呼び出すことができますToList():

CartonItem.Serials = Serials.ToList();

using System.Linq;*.cs ファイルの先頭に必ず追加してください。

于 2013-05-03T15:14:53.433 に答える
1

同じインスタンスを指すClear()ジェネリックからすべてのアイテムを削除するためです。List<T>

于 2013-05-03T15:14:34.520 に答える
1

それは実に正しい。clear()リストから項目を削除するClear() MSDN は言う。コレクションの要素から他のオブジェクトへの参照も解放されます。

Count は 0 に設定され、コレクションの要素から他のオブジェクトへの参照も解放されます。容量は変わらず。List の容量をリセットするには、TrimExcess メソッドを呼び出すか、Capacity プロパティを直接設定します。容量を減らすと、メモリが再割り当てされ、リスト内のすべての要素がコピーされます。空のリストをトリミングすると、リストの容量がデフォルトの容量に設定されます。このメソッドは O(n) 操作です。ここで、n はカウントです。

于 2013-05-03T15:15:03.800 に答える
1

CartonItem.Serials = Serials; と言うときだからです。同じオブジェクトを共有しています。

値を永続化する場合は、Serials を反復処理し、各値を CartonItem.Serials に追加します

于 2013-05-03T15:16:51.813 に答える
0

CartonItem.Serialsへの参照Serialです ! したがって、一方をクリアすると、もう一方も同じインスタンスであるため(別のものではない)、クリアするようです。ところで、参照型と値型の違いは、C# で最も基本的なことの 1 つです...

于 2013-05-03T15:14:58.137 に答える