// struct の配列とリストでは、要素の内部の状態を変えるようなメソッドを呼んだときの挙動が異なるので要注意 // 勘違いから思わぬバグの元になることも static void StructArrayTest() { // class の場合はどっちも結果は同じなので、違いを特に意識しなくても大丈夫 var classArray = new ClassCounter[] { new ClassCounter() }; classArray[0].Increment(); Console.WriteLine($"{nameof(StructArrayTest)} - {nameof(classArray)}: {classArray[0].Number}"); // 結果は 1 var classList = new List <ClassCounter>() { new ClassCounter() }; classList[0].Increment(); Console.WriteLine($"{nameof(StructArrayTest)} - {nameof(classList)}: {classList[0].Number}"); // 結果は 1 // struct の場合は、配列とリストでインデクサ経由で要素の内部の状態を変えるようなメソッドを呼んだときの挙動が異なる var structArray = new StructCounter[] { new StructCounter() }; structArray[0].Increment(); Console.WriteLine($"{nameof(StructArrayTest)} - {nameof(structArray)}: {structArray[0].Number}"); // 結果は 1 - structArray のインデクサを通じて、内部のアイテムに直にアクセスできる var structList = new List <StructCounter>() { new StructCounter() }; structList[0].Increment(); Console.WriteLine($"{nameof(StructArrayTest)} - {nameof(structList)}: {structList[0].Number}"); // 結果は 0 - structList のインデクサは、内部のアイテムのコピーを返す }
public override bool Equals(object obj) { if (obj is StructCounter) { StructCounter c = (StructCounter)obj; return(this == c); } else { return(false); } }
static void StructTest() { StructCounter s1 = new StructCounter(); s1++; Console.WriteLine("s1:" + s1.SCount); StructCounter s2 = s1; s1++; Console.WriteLine("s1:" + s1.SCount); Console.WriteLine("s2:" + s2.SCount); Console.WriteLine(s1 == s2); Console.WriteLine(s1 != s2); Console.WriteLine(s1.Equals(s2)); Console.WriteLine(s1.GetHashCode()); Console.ReadLine(); return; }