RSS

 

RSS


プログラミングの話。

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 登録されてない");
                }
            }
        }
    }
}



  • コメント (0)
  • トラックバック (0)
トラックバックURL :
http://www.iwai-masaka.jp/tb.cgi/56057