تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Tips and tricks - رقم 2 - المعامل Equals والمعامل Clone
#1
كاتب الموضوع : أحمد جمال


بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .

يستخدم اغلب المبرمجين المعامل = أو المعامل == في C# للمقارنة ، ابسط امثلة ذلك :


كود :
[FONT=Tahoma]if (x==y)[/FONT]
[FONT=Tahoma]{[/FONT]

[FONT=Tahoma]}[/FONT]


أو VB.net :


كود :
[FONT=Tahoma]if x=y Then[/FONT]

[FONT=Tahoma]End if[/FONT]


تكون القيمة المحصلة True في حالة التساوي فيما تكون False في حالة عدم التساوي ، ونقصد بالتساوي هنا التساوي الكامل مثلاً : 5=5 او 7=7 أو "Ahmed"="Ahmed" ، ولكن هذا ينطبق فقط على الانواع البسيطة .

** الأنواع البسيطة هي الانوع مثل Int , Long , String وغيرها ...

سنواصل شرحنا مع المثال التالي ايضاً - سأشرح من خلال C# وينطبق نفس الامر على VB.net :


كود :
[FONT=Tahoma][color=#0000ff]string[/color] a = [color=#0000ff]new[/color] [color=#0000ff]string[/color]([color=#0000ff]new[/color] [color=#0000ff]char[/color][] { [color=#a31515]'h'[/color], [color=#a31515]'e'[/color], [color=#a31515]'l'[/color], [color=#a31515]'l'[/color], [color=#a31515]'o'[/color] });[/FONT]
[FONT=Tahoma][color=#0000ff]string[/color] b = [color=#0000ff]new[/color] [color=#0000ff]string[/color]([color=#0000ff]new[/color] [color=#0000ff]char[/color][] { [color=#a31515]'h'[/color], [color=#a31515]'e'[/color], [color=#a31515]'l'[/color], [color=#a31515]'l'[/color], [color=#a31515]'o'[/color] });[/FONT]
[FONT=Tahoma][color=#2b91af]Console[/color].WriteLine(a == b);[/FONT]


في هذه الحالة ستظل النتيجة True ايضاً ، ولكن ماذا لو اكملنا الكود بالأسطر التالية :

كود :
[FONT=Tahoma][color=#0000ff]object[/color] c = a;[/FONT]
[FONT=Tahoma][color=blue]object[/color] d = b;[/FONT]

[FONT=Tahoma]Console.WriteLine (c==d);[/FONT]


السطر السابق سيخيب ظنك للاسف ، لإن الناتج سيكون False ، الحل في هذه الحالة باستخدام المعامل Equals :


كود :
[FONT=Tahoma]Console.WriteLine (c.Equals(d));[/FONT]


استخدام آخر للمعامل Equals للمقارنة بين ال Structs مثلاً ، لنفترض المثال التالي :


كود :
[FONT=Tahoma]struct car[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma]public int carNumber;[/FONT]
[FONT=Tahoma]};[/FONT]


والآن ، لو قمنا بتعريف المتغيرات التالية :



كود :
[FONT=Tahoma]Car x = new Car();[/FONT]

[FONT=Tahoma]x.carNumber=1[/FONT]
[FONT=Tahoma]Car y=x;[/FONT]

[FONT=Tahoma]Console.WriteLine (x==y);[/FONT]


ما هو الناتج الذي تتوقعه ، المفترض ان تكون الرسالة المطبوعة هي True ؟؟؟ للاسف هي حتى ليست False لإن هذا سيعطيك خطأ .

الحل الصحيح هو باستخدام المعامل Equals بالطريقة التالية :


كود :
[FONT=Tahoma][color=#2b91af]Console[/color].WriteLine (x.Equals(y));[/FONT]


في حالة تعريف Classes ، يمكن استخدام == ايضاً بالشكل التالي :

كود :
[COLOR=#2b91af]
[FONT=Tahoma]Console[/FONT][/COLOR][FONT=Tahoma].WriteLine (Class1==Class2);[/FONT]

أو Equals كما في المثال السابق ، هل تعرف لماذا يكون الناتج دائماً True ؟


الاجابة المنطقية لهذا الموضوع هي أنك ستخبرني ان الكائنان يشيران لنفس المكان في الذاكرة لذا كان الناتج True بالشكل التالي :


وهذا صحيح ، لنفترض المثال التالي :


كود :
[FONT=Tahoma][color=#2b91af]Car[/color] x = [color=#0000ff]new[/color] [color=#2b91af]Car[/color]();[/FONT]
[FONT=Tahoma][color=#2b91af]Car[/color] y = [color=#0000ff]new[/color] [color=#2b91af]Car[/color]();[/FONT]

[FONT=Tahoma]x.carNumber=1;[/FONT]
[FONT=Tahoma]y.carNumber = 1;[/FONT]

[FONT=Tahoma][color=#2b91af]Console[/color].WriteLine (x==y);[/FONT]
[FONT=Tahoma][color=#2b91af]Console[/color].ReadKey();[/FONT]


ستكون النتيجة هي False ... برغم ان الخصائص الداخلية لهما واحدة ، الحل بكتابة دالة بالشكل التالي :


كود :
[FONT=Tahoma][color=#0000ff]bool[/color] isthesame([color=#2b91af]Car[/color] c1,[color=#2b91af]Car[/color] c2)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma][color=#0000ff]if[/color] (c1.carNumber==c2.carNumber)[/FONT]
[FONT=Tahoma][color=#0000ff]return[/color] [color=#0000ff]true[/color];[/FONT]
[FONT=Tahoma][color=#0000ff]return[/color] [color=#0000ff]false[/color];[/FONT]
[FONT=Tahoma]}[/FONT]



سنواصل ...
}}}
تم الشكر بواسطة:


الردود في هذا الموضوع
Tips and tricks - رقم 2 - المعامل Equals والمعامل Clone - بواسطة Raggi Tech - 01-10-12, 07:42 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  Tips for clean code #3 Sajad 3 2,925 25-11-17, 12:35 AM
آخر رد: قاسم
  Tips for clean code #2 Sajad 1 2,448 21-11-17, 05:42 PM
آخر رد: قاسم
  Tips for clean code #1 Sajad 2 2,670 06-11-17, 03:07 AM
آخر رد: قاسم
  Tips and tricks - مقدمة RaggiTech 1 2,482 14-10-12, 03:06 PM
آخر رد: RaggiTech
  Tips and Tricks : الفرق بين const و static readonly RaggiTech 0 3,546 14-10-12, 03:05 PM
آخر رد: RaggiTech
  Tips and tricks - رقم 1 - StringBuilder RaggiTech 0 2,485 01-10-12, 07:39 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: