比較值是否一樣

比較物件是否一樣

前幾天同事不知道要寫什麼功能,突然問我,怎麼比較值物件,我想都沒想就回答他Equals,但他回我說,那不行,我測試過了,不能用,明明就相同也給我跑出false。

當下我就回答他,那我不知道了,之後,review他寫的code,他用Icomparer加泛型寫了一個方法,詢問他才得知這方法主要用於比較string、double、int是否相同,雖然到現在還是搞不懂同事寫這方法的目的是什麼,不過讓我心中一直有個疑問的是Equals為何會明明就相同卻跑出false,因此做了個測試。

我很確定的在同一個class下,使用Equals絕對不會發生同事所說的靈異事件,那會發生應該就是在客戶端,我寫了一個數字跟字串的類別,並在客戶端建立實例,來比較類別方法輸出的整數與字串比較時是否會正常運作。

        static void Main(string[] args)
        {
            Inumber tel = new number();
            tel.SetNumber(028825252);

            Inumber homeTel = new number();
            homeTel.SetNumber(028825252);

            int telA = tel.GetNumber();
            int telB = homeTel.GetNumber();

            if (telA.Equals(telB))
                Console.WriteLine("電話一樣");

            Iname teacher = new name();
            teacher.SetName("Allen");

            Iname student = new name();
            student.SetName("Jerry");

            string teacherName = teacher.GetName();
            string me = student.GetName();

            if (teacherName.Equals(me))
                Console.WriteLine("相等");
            else
                Console.WriteLine("Name不一樣");

            Iname jerry = new name();
            jerry.SetName("jerry");

            Iname how = new name();
            how.SetName("jerry");

            if (jerry.Equals(how))
                Console.WriteLine("同一個物件");
            else
                Console.WriteLine("不同物件");

            Inumber org = new number();
            Inumber home = org;

            Console.WriteLine(org.Equals(home));

        }
    }

    interface Inumber
    {
        void SetNumber(int value);
        int GetNumber();
    }

    interface Iname
    {
        void SetName(string name);
        string GetName();
    }

    class number:Inumber
    {
        private int myNumber;

        public int Number
        {
            get { return myNumber; }
            set { myNumber = value; }
        }

        public void SetNumber(int value)
        {
            this.myNumber = value;
        }

        public int GetNumber()
        {
            return Number;
        }
    }

    class name : Iname
    {
        private string myName;

        public string Name
        {
            get { return myName; }
            set { myName = value; }
        }

        public void SetName(string name)
        {
            this.myName = name;
        }

        public string GetName()
        {
            return Name;
        }
    }

Output :

2012-04-28_234933

 

結論:

我被我同事唬了,但他也自己搞到自己了,可以用很簡單的方式去做,卻自己搞了一個複雜的函式出來,唯一會出現同事所說的情況只有在物件為不同的記憶體位置當中才會出現,但他又說,此函式主要比較string、double、int,看來上班日要好好跟他研究一下,到底是同事唬人,沒測試就說不行,還是另有特殊原因。

更新:

原來同事沒有測試,就認定Equals不行。

 

如文章有錯誤,煩請告知,新人發帖請多包涵

 

創用 CC 授權條款