• 0
احمد سمير عبدالله

ما معنى ان كائن يساوى كائن

سؤال

ما معنى ان كائن (opject) يساوى كائن (opject)
 
مثال :-
car1 c1 = new car1();
car2 c2 = new car2();
c2=c1;
 
الان ما معنى ان c2=c1
 
لم اجد اجابة شافية لهذا السؤال!!!
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

1 إجابات على هذا السؤال .

  • 0

وعليكم السلام ورحمة الله

اخي الكريم، جملة المساواة تتم دائما بين متغييرين من نفس النوع، لكن يجب التمييز بين حالتين:

c1 = c2 تعني أنه تم نقل مؤشر الكائن c1 ليؤشر على موقع الكائن c2 بالذاكرة.

ملاحظة: عند تعريف كائن (car1) يتم حجز مساحة لعنوانه فقط ضمن Stack والتي هي ذاكرة محدودة وسريعة الوصول بالنسبة للمعالج، وجميع البيانات المعرفة ضمن هذا الكائن يتم تخزينها ضمن الذاكرة الشاسعة Heap، بالتالي تبقى مساحة الـ Stack خفيفة، والعلاقة بين Stack و Heap هي المؤشر نفسه Pointer. لذلك تسمى الأنواع المشتقة من الأصناف ب Reference Type

أما عند تعريف المتغيرات الأساسية Primitive Data Types مثل int, double, char, bool، يتم حجزها مع قيمتها مباشرة ضمن ال Stack، لذلك تعرف ب Value Type

بالتالي يجب التفريق بين عملية المساواة بين Value Type او Reference Type.

Value Type، يتم نسخ القيمة من المتغير الثاني إلى المتغير الأول مع احتفاظ كل منهم بعنوانه الخاص، وأي تعديل لاحق على احدى المتغيريين لا يؤثر على قيم المتغير الأخر.

Reference Type، يتم نسخ عنوان الكائن الثاني إلى الكائن الأول بالتالي تصبح المصادر (البيانات ضمن Heap) مشتركة بين الكائنين وأي تعديل على بيانات كائن ستؤثر مباشرة على بيانات الكائن الاخر.

 

بالنسبة للمساواة بغرض التحقق (true, false)

Value Type، إذا كانت قيمة المتغير الأول تساوي قيمة المتغير الثاني فإن ناتج الجملة True او فإنها بالتأكيد False (مثال 5==5)

Reference Type، إذا كان عنوان المتغير الأول يساوي عنوان المتغير الثاني (وهذا لن يحدث أبداً) بالتالي فنتيجة التحقق دائما False

للتغلب على هذه المشكلة ننظر للمثال التالي:

    public class Car
    {
        public string Model { get; set; }
        public string Color { get; set; }
        public Car(string model, string color)
        {
            Model = model;
            Color = color;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Car car1 = new Car("Toyota", "White");
            Car car2 = new Car("Toyota", "White");

            bool isEqual = (car1 == car2);
            Console.WriteLine(isEqual);
            // False
        }
    }

نلاحظ ان نتيجة التحقق كانت False، مع أن قيم الكائنين نفسها، والسبب كما ذكرت أن التحقق يتم على العنوان بالذاكرة وليس القيم.

لجعل التحقق يتم عن طريق القيم، يجب تعريف دوال Operators، او عمل Override للميثود Equals

    public class Car
    {
        public string Model { get; set; }
        public string Color { get; set; }
        public Car(string model, string color)
        {
            Model = model;
            Color = color;
        }
        public override bool Equals(object obj)
        {
            Car tempCar = (Car)obj;
            return (tempCar.Model == this.Model && tempCar.Color == this.Color);
        }
        public static bool operator == (Car car1, Car car2)
        {
            return (car1.Model == car2.Model && car1.Color == car2.Color);
        }
        public static bool operator !=(Car car1, Car car2)
        {
            return (car1.Model != car2.Model || car1.Color != car2.Color);
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Car car1 = new Car("Toyota", "White");
            Car car2 = new Car("Toyota", "White");

            bool isEqual = (car1 == car2);
            Console.WriteLine(isEqual);
            // True
        }
    }

لاحظ ان نتيجة المساواة اصبح True، لان التحقق اصبح حسب الشروط المعرفة.

اخيرا: أترك لك تمرين صغير، جرب نفس التجربة السابقة على كائن Struct وليس Class

 

بالتوفيق،،،

طارق جهاد

تم تعديل بواسطه Eng.Tareq Jehad
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .