示例#1
0
        static void Main(string[] args)
        {
            /*
             * Understanding class and object
             * Different value and object
             * Review System.Object
             * Review Equals method
             */
            Test t1 = new Test();
            Test t2 = new Test();

            // why?
            bool resultEquals          = object.Equals(t1, t2);          // false
            bool resultReferenceEquals = object.ReferenceEquals(t1, t2); // false

            string writeformat = "{0}, {1}";

            Console.WriteLine(writeformat, "object.Equals(t1, t2)", resultEquals);
            Console.WriteLine(writeformat, "object.ReferenceEquals(t1, t2)", resultReferenceEquals);

            t1.Id = 1;
            t2.Id = 1;

            resultEquals          = object.Equals(t1.Id, t2.Id);          // true
            resultReferenceEquals = object.ReferenceEquals(t1.Id, t2.Id); // false, why???

            Console.WriteLine(writeformat, "object.Equals(t1.Id, t2.Id)", resultEquals);
            Console.WriteLine(writeformat, "object.ReferenceEquals(t1.Id, t2.Id)", resultReferenceEquals);

            t1.Name = "Test";
            t2.Name = "Test";

            resultEquals          = object.Equals(t1.Name, t2.Name);          // true
            resultReferenceEquals = object.ReferenceEquals(t1.Name, t2.Name); // true, why???

            Console.WriteLine(writeformat, "object.Equals(t1.Name, t2.Name)", resultEquals);
            Console.WriteLine(writeformat, "object.ReferenceEquals(t1.Name, t2.Name)", resultReferenceEquals);

            // Diffenrent "value" and "object"
            // Let's check out!

            // value - struct - stack
            // object - class - heap
            // string type - class

            #region Equals
            Test2 test2_1 = new Test2()
            {
                Id = 1
            };
            Type  t       = test2_1.GetType(); // Name: "Test2", Namesapce: "OOP_Review_2017_1"
            Test2 test2_2 = new Test2()
            {
                Id = 1
            };
            Test2 test2_3 = test2_1;

            bool result  = test2_1.Equals(test2_2); // true, why? override Equals method.
            bool result2 = test2_1.Equals(test2_3); // true

            test2_2.Id = 2;
            bool result3 = test2_1.Equals(test2_2);

            // 비교는 이렇게 하는게 더 쉽지 않나요?
            // 반박: 그런데 이건 int 비교니까 하나 마나인듯...
            if (test2_1.Id == test2_2.Id)
            {
            }
            // Test2 type의 object가 같은가?
            // 이걸 왜 비교하죠? class type도 built-in type과 동일하게 인지하고 싶으니까
            if (test2_1 == test2_2)
            {
            }
            else
            {
            }

            #endregion

            #region 원하는 주제
            // 0. Delegate
            // 1. Lambda
            Action action = () => { };
            // 2. Closure
            // 3. yield???
            #endregion
        }