株でお小遣いを稼ぐ@wiki

C#Tips

最終更新:

匿名ユーザー

- view
管理者のみ編集可

IEnumerator でのループ中に…

配列やコレクションから IEnumerator を取得してループしている最中に、その元の配列等の内容を変更してしまったら、ループの結果はどうなるのだろう?というわけで実験。
   SortedList objList = new SortedList();
   objList.Add(1, 1);
   objList.Add(2, 2);
   objList.Add(3, 3);
   objList.Add(4, 4);
   
   IEnumerator en = objList.GetEnumerator();
   if (en.MoveNext())  // 1
   {
       DictionaryEntry entry = (DictionaryEntry)en.Current;
       Console.WriteLine(entry.Value);
   }
   if (en.MoveNext())  // 2
   {
       DictionaryEntry entry = (DictionaryEntry)en.Current;
       Console.WriteLine(entry.Value);
   }
    
   //objList.Remove(3);  // ココで 3 を消したら?
   objList[3] = 6;     // 値を変更したら?
    
   // 内容を削除したり、値を変更した後で MoveNext() すると例外発生。
   if (en.MoveNext())  // 3
   {
       DictionaryEntry entry = (DictionaryEntry)en.Current;
       Console.WriteLine(entry.Value);
   }
   if (en.MoveNext())  // 4
   {
       DictionaryEntry entry = (DictionaryEntry)en.Current;
       Console.WriteLine(entry.Value);
   }

結果

正しい結果は得られなかった。
というか、配列に変更がかかった時点で IEnumerator.MoveNext() はできなくなる模様。

きっと SortedList だからだろう。ということで ArrayList でも実験・・・同じ結果に。

継承元のコンストラクタを呼んだとき…

あるクラスを継承したクラスのコンストラクタで、「: base()」とした時、継承元と継承先のクラスのどちらのコンストラクタが先実行されるのか?多分、もちろん 継承元のコンストラクタだと思うけど、一応確認。
   public class ClassBase
   {
       public ClassBase()
       {
           Console.WriteLine("ClassBase が初期化されました。");
       }
   }
   
   public class ClassEx : ClassBase
   {
       public ClassEx() : base()  // 継承元のコンストラクタを呼ぶ
       {
           Console.WriteLine("ClassEx が初期化されました。");
       }
   }
   
   class Class1
   {
       [STAThread]
       static void Main(string[] args)
       {
           ClassEx objClass = new ClassEx();
       }
   }

結果

ClassBase が初期化されました。
ClassEx が初期化されました。
Press any key to continue

現在、paintプラグインはご利用いただけません。
目安箱バナー