プログラミングの話。
C#でHashtableクラスを使っていた気づいた。
ハッシュのキーとしてclassのオブジェクトを使った場合とstructのオブジェクトを使った場合に、相違点がある。(※1)
記事末尾のコード内
ClassXYとStructXYのはclassであるかstructであるかのところが違い、あとの記述はいっしょ。
だが、mainを実行してみると
//////////////////////////
class_aとclass_bは違う
struct_aとstruct_bは同じ
class_b 登録されてない
struct_b 登録されてる
//////////////////////////
Equalsの返す値が違う!!!
ひいては、そのEqualsを使用しているHashtableでの動きがが違う!!!
****************
アバウトに例えるならば、
A君の持ってる少年ジャンプ10号は
B君の持ってる少年ジャンプ10号と同じですか?
2冊存在するという意味では違う本だけど。
内容的という意味では同じ本なのだった。
※1
C#では classは参照型 structは値型 という違いがもともとある。
(この話はC++にはない話)
###コード###############
namespace Program
{
class ClassXY
{
int m_x;
int m_y;
public ClassXY(int x, int y)
{
m_x = x;
m_y = y;
}
}
struct StructXY
{
int m_x;
int m_y;
public StructXY(int x, int y)
{
m_x = x;
m_y = y;
}
}
class Program
{
static void Main(string[] args)
{
ClassXY class_a = new ClassXY(3, 5);
ClassXY class_b = new ClassXY(3, 5);
StructXY struct_a = new StructXY(3, 5);
StructXY struct_b = new StructXY(3, 5);
// Eaualsに関して
if (class_a.Equals(class_b))
{
Debug.WriteLine("class_aとclass_bは同じ");
}
else
{
Debug.WriteLine("class_aとclass_bは違う");
}
if (struct_a.Equals(struct_b))
{
Debug.WriteLine("struct_aとstruct_bは同じ");
}
else
{
Debug.WriteLine("struct_aとstruct_bは違う");
}
// ひいてはHashtableで
{
Hashtable m_hashtable = new Hashtable();
m_hashtable[class_a] = "class_aによる";
if (m_hashtable.ContainsKey(class_b))
{
Debug.WriteLine("class_b 登録されてる");
}
else
{
Debug.WriteLine("class_b 登録されてない");
}
}
{
Hashtable m_hashtable = new Hashtable();
m_hashtable[struct_a] = "struct_aによる";
if (m_hashtable.ContainsKey(struct_b))
{
Debug.WriteLine("struct_b 登録されてる");
}
else
{
Debug.WriteLine("struct_b 登録されてない");
}
}
}
}
}