• 1

ممكن لو سمحتو اريد شرح لدالة equal و دالة Get type في لغة سي شارب مع الاكواد

ممكن لو سمحتو اريد شرح لدالة equal و دالة  Get type في لغة سي شارب مع الاكواد

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 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، اي يبقى كل منهما مختلف عن الآخر.

بالتوفيق،،،

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

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


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