01-10-12, 07:42 PM
كاتب الموضوع : أحمد جمال
بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .
يستخدم اغلب المبرمجين المعامل = أو المعامل == في 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]
سنواصل ...