C#Tips - (2005/07/10 (日) 15:30:13) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
#contents
----
*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
#contents
----
*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
表示オプション
横に並べて表示:
変化行の前後のみ表示: