اذهب إلى المحتوى

السؤال

Recommended Posts

  • 2
نشر (معدل)

Equal

مقارنة نوعين من البيانات مع بعضهما، وترجع true في حال تساوت القيم. مثال:

    class Program
    {
        static void Main(string[] args)
        {
            int x = 5;
            int y = 5;
            bool isEqual = x.Equals(y);
            Console.WriteLine(isEqual);
        }
    }

بالطبع النتيجة ستكون True. لان قيمة x تساوي قيمة y.

لكن لو فرضنا نوع بيانات معقد مثل Student Class (اي ليس int, double, string, ...)، وأردنا التحقق من المساواة كما في المثال التالي:

using System;

namespace School
{
    class Student
    {
        public string ID { get; set; }
        public string Name { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Student student1 = new Student();
            student1.ID = "2007";
            student1.Name = "Ahmad";

            Student student2 = new Student();
            student2.ID = "2007";
            student2.Name = "Ahmad";

            bool isEqual = student1.Equals(student2);
            Console.WriteLine(isEqual);
        }
    }
}

عند التشغيل نلاحظ أن النتيجة False، رغم ان بيانات الطالب الأول هي نفسها بيانات الطالب الثاني! الإجابة طبعا تكمن بأن المقارنة لا تتم على قيم البيانات (الإسم والرقم) وإنما على مؤشر هذا الطالب في الذاكرة (Pointer Reference in Stack Memory)، ولكي نغير من هذا السلوك الافتراضي، يجب علينا تغيير سلوك الدالة Equal التابعة للنوع Student، كما يلي:

    class Student
    {
        public string ID { get; set; }
        public string Name { get; set; }

        public override bool Equals(object obj)
        {
            Student student2 = (Student)obj;
            return (this.ID == student2.ID) && (this.Name == student2.Name);
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
    }

الأن اصبحت عملية التحقق من المساواة تتم على مستوى القيم. بالتالي النتيجة True.

 

GetType

في المثال السابق قمنا بإنشاء نوع بيانات جديد هو Student، وكان اسم مشروعنا School، كما هو واضح من namespace، لذلك فإن الإسم الكامل لهذا النوع هو

School.Student

الأن لو فرضنا لدي مشروع أخر، وليكن اسمه University، ويوجد نوع بيانات اسمه Student ايضا ضمن هذا المشروع، ولكن يحوي على بيانات مختلفة، كما يلي:

using System;

namespace University
{
    class Student
    {
        public string ID { get; set; }
        public string Name { get; set; }
        public string Faculty { get; set; }
        public double GPA { get; set; }
        public string PhoneNumber { get; set; }
    }
}

الآن كيف يتم تمييز Student التابع ل School عن Student التابع ل University: الإجابة هي بالإسم الكامل للنوع:

School.Student student1 = new School.Student();
University.Student student2 = new University.Student();

بالتالي هناك حالات معينة أكون بحاجة معرفة نوع البيانات المستخدم، على سبيل المثال:

    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            if(student.GetType() == typeof(School.Student))
                Console.WriteLine("This is a high school student");
            else if(student.GetType() == typeof(University.Student))
                Console.WriteLine("This is a university student");
            else
                Console.WriteLine("Unknown student!");
        }
    }

الامر ينطبق حتى لو كان School.Student يطابق بالشكل تماما ل University.Student، اي يبقى كل منهما مختلف عن الآخر.

بالتوفيق،،،

تم التعديل في بواسطة طارق جهاد

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...