4

こんにちは、出品方法について質問があります。

リストを定義しようとしています

List<periodrecord> pl=new List<periodrecord>(4);

次に、forループを介してリストにアイテムを追加したい

私がこれをしたとき:

for (i = 1; i < 100; i++)
        {
            try
            {
                periodrecord pr = new periodrecord();

                /*some random lines*/

                pl.Add(pr);


            }
            catch (Exception e)
            {  break; }
        }

私の質問は: 各ループで宣言された pr のアドレスは、リストによって格納されます。しかし、pr 変数自体がプログラムによって使用されなくなったため、これらの場所は空と見なされ、何らかの形で上書きされるのでしょうか? ありがとう。

答えを考えると、まだいくつかの疑問があります。私の完全なコードは次のとおりです。

   List<periodrecord> pl=new List<periodrecord>(4);
   for (i = 1; i < 100; i++)
        {
            try
            {
                periodrecord pr = new periodrecord();
                record2 = sr.ReadLine();

                SNorPartCode = record1.Split('&')[0];
                phototype = int.Parse(record1.Split('&')[1]);
                System.Globalization.CultureInfo provider = System.Globalization.CultureInfo.InvariantCulture;
                time = record1.Split('&')[2];
                pr.start = DateTime.Parse(time,provider);
                pr.SNorPartCode = SNorPartCode;
                pr.phototype = phototype;
                if (record2 != null)
                {
                    pr.end = DateTime.Parse(record2.Split('&')[2], provider);
                }
                else
                {
                    pr.end = DateTime.MaxValue;

                }
                pl.Add(pr);
                record1 = record2;

            }
            catch (Exception e)
            {  break; }
        }   

私が行を取ったとき: periodrecord pr = new periodrecord();

forループから出て、行

pr.start=...
pr.end=....

リスト内のすべての項目を変更しました。

4

2 に答える 2

16

各ループで宣言された pr のアドレスは、リストによって格納されます。

いいえ、そうはなりません。が呼び出された時点の変数のがリストに格納されます。その値は参照です - 作成した新しいオブジェクトへの参照です。prAdd

C# の変数の値は決してオブジェクトではないことを理解することが重要です。常に値型の値または参照のいずれかです。このことを理解して、変数、その値、参照、オブジェクトの違いを明確に理解し始めると、多くのこと (パラメーターの受け渡し、代入、ガベージ コレクションなど) がより明確になります。

たとえば、次のことを考慮してください。

Button x = new Button();
Button y = x;

ここにはオブジェクトが 1 つしかありません-Button最初の行で作成されたものです。2 つの変数(xおよびy) があり、2 行目以降は、代入のために両方とも同じ値 (そのオブジェクトへの参照) を持ちます。ただし、それらは依然として独立変数です ( に新しい値を代入してxも変化しませんy)。それがあなたの例にどのように適用されるか考えてみてください -メソッドにpl.Add(pr)渡すだけです。その後、リストに関する限り、変数はまったく無関係です。したがって、次のことができます。prAddpr

pl.Add(pr);
pr = null;

2行目はリストにまったく影響しません。

于 2013-08-02T06:11:08.763 に答える