using System;
namespace P6_7
{
    struct A
    {
        public int count;
    }
    class B
    {
        public int number;
    }
    class C
    {
        public int integer = 0;
        public override bool Equals(object obj)
        {
            C c = obj as C;
            if (c != null)
                return this.integer == c.integer;
            else
                return false;
        }
        public override int GetHashCode()
        {
            return 2 ^ integer;
        }
    }

    class Program
    {
        static void Main()
        {
            A a1, a2;
            a1.count = 10;
            a2 = a1;

            //Console.Write(a1==a2);ûжṹġ==
            Console.Write(a1.Equals(a2));                       		//True
            Console.WriteLine(object.ReferenceEquals(a1, a2));  	//False

            B b1 = new B();
            B b2 = new B();

            b1.number = 10;
            b2.number = 10;
            Console.Write(b1 == b2);                           		//False
            Console.Write(b1.Equals(b2));                       		//False
            Console.WriteLine(object.ReferenceEquals(b1, b2));  	//False

            b2 = b1;
            Console.Write(b1 == b2);                            		//True
            Console.Write(b1.Equals(b2));                      		//True
            Console.WriteLine(object.ReferenceEquals(b1, b2));  	//True

            C c1 = new C();
            C c2 = new C();

            c1.integer = 10;
            c2.integer = 10;
            Console.Write(c1 == c2);                            		//False
            Console.Write(c1.Equals(c2));                       		//True
            Console.WriteLine(object.ReferenceEquals(c1, c2));  	//False

            c2 = c1;
            Console.Write(c1 == c2);                            		//True
            Console.Write(c1.Equals(c2));                       		//True
            Console.WriteLine(object.ReferenceEquals(c1, c2));  	//True

            Console.ReadLine();
        } 
     }
}
