تقييم الموضوع :
  • 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]



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

في الجزء الاول من درسنا السابق قمنا بكتابة الكود التالي :


كود :
[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]
لو كنت تظن ان المتغير y يحتوي على نسخة من car يمكنك التعديل عليها فأنت مخطا ، إذ ان المتغير x و y يشيرون لنفس المتغير ، وبالتالي فأي تعديل في احدهما سيتسبب في تعديل للآخر ، يمكنك التأكد من ذلك من خلال كود مثل التالي :


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

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

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

[/COLOR]
النتيجة ستكون 2 ، لإن التعديل في y نتج عنه تعديل مباشرة في x .

لكن ماذا لو كنا نرغب في عمل نسخة جديدة من المتغير ؟
في هذه الحالة نستخدم مبدأ Clone بالشكل التالي :


كود :
[color=#2b91af][FONT=Tahoma]Car[/FONT][/color][FONT=Tahoma] doCopy([color=#2b91af]Car[/color] c1)[/FONT]
[FONT=Tahoma]{[/FONT]
[FONT=Tahoma][color=#2b91af]Car[/color] newCar = [color=#0000ff]new[/color] [color=#2b91af]Car[/color]();[/FONT]
[FONT=Tahoma]newCar.carNumber=c1.carNumber;[/FONT]
[color=#008000][FONT=Tahoma]// [/FONT][/color]
[color=#008000][FONT=Tahoma]//[/FONT][/color]
[FONT=Tahoma][color=#0000ff]return[/color] newCar;[/FONT]
[FONT=Tahoma]}[/FONT]
في كثير من العناصر الاساسية تجد الدالة Clone موجودة بصورة افتراضية ، اي كلاس مشتق من الواجهة ICloneaple ستجد هذه الدالة جاهزة للاستخدام مباشرة، لو كنت انت من تقوم ببرمجة الكلاس وقمت باشتقاقه من الفئة السابقة فستجد الدالة Clone موجودة لتقوم ببرمجتها بحيث يكون الكلاس بك على المعايير القياسية ، حيث يستطيع اي مستخدم لفئتك من عمل Clone لها مباشرة .

والله الموفق ...
والسلام عليكم ورحمة الله وبركاته ...
}}}
تم الشكر بواسطة:


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

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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم