سؤال

في c# ما يحدث تماما في الخلفية عند القيام بعملية المقارنة مع "==" المشغل على اثنين من الكائنات ؟ هل فقط مقارنة العناوين ؟ أو يفعل شيئا مثل يساوي() أو CompareTo() ?

PS:ماذا عن "==" المشغل في جافا ؟ لا تتصرف نفس الشيء ؟

هل كانت مفيدة؟

المحلول

بقدر ما أعرف:

  • فإنه يقارن أنواع قيمة من قيمة (المساواة)
  • فإنه يقارن أنواع مرجع من المراجع (الهوية)
  • إلا إذا كان == مشغل طاقتها ، ثم يدعو واحدة.

يساوي يتم تنفيذها في موضوع يمكن تجاوزها أيضا.تطبيق الافتراضي في الجسم يقوم إشارة المقارنة المرجعية أنواع.حتى افتراضي يساوي == تفعل الشيء نفسه.

أعتقد في جافا لا يمكنك الزائد == المشغل.ولكن بلدي جافا المعرفة هي قديمة جدا.

تحرير: علما بأن == المشغل هو أسلوب ثابت.لا بد في وقت التحويل القاعدة على أنواع من المتغيرات أو الحقول. Equals هو الظاهري الطريقة التي يتم العثور عليها في وقت التشغيل ، على أساس الفعلية وقت أنواع.

نصائح أخرى

وامتدادا إلى الجواب ستيفان الممتازة - استثناء آخر هو إذا تنطوي المعاملات Nullable<T> - في هذه الحالة "رفعت" تنطبق مشغلي (14.2.7 في ECMA 334v4):

<اقتباس فقرة>   

لمشغلي المساواة   ==! =

     

وشكل رفع من عامل موجود إذا كانت أنواع المعامل على حد سواء   أنواع قيمة غير قيم الفارغة وإذا كان   نوع النتيجة منطقي. شكل رفعت   هي التي شيدت من خلال إضافة واحد؟   التعديل لكل نوع المعامل. ال   يعتبر المشغل رفعت اثنين لاغية   قيم المساواة، وقيمة فارغة غير متكافئة   إلى أي قيمة غير فارغة. إذا كان كل من   المعاملات وغير لاغية، ورفع   مشغل بفك المعاملات و   ينطبق المشغل الأساسي ل   تنتج نتيجة منطقي.

وما يعنيه ذلك هو: لأن هناك عامل المساواة بين (ويقول):

int i = ..., j = ...;
bool eq = i == j;

وهكذا هناك عامل ضمني من النموذج (على الرغم من عمله على نحو مختلف):

int? i = ..., j = ...;
bool eq;
if(i.HasValue) {
    if(j.HasValue) { // both have values; compare
       eq = i.GetValueOrDefault() == j.GetValueOrDefault();
    } else { // one null; always false
       eq = false;
    }
} else { // true if both null, else false
    eq = !j.HasValue;
}

من MSDN :

<اقتباس فقرة>   

لأنواع قيمة محددة مسبقا، و   مشغل المساواة (==) يعود صحيحا إذا   قيم المعاملات لها على قدم المساواة،   كاذبة خلاف ذلك. لأنواع المرجعية   بخلاف سلسلة، يعود == صحيح إذا   المعاملات وهما تشير إلى نفسها   موضوع. لنوع السلسلة، ==   يقارن قيم السلاسل.

ولا ... المشغل == لا تتصرف دائما نفس الشيء في جافا وفي ج #.

وعلى سبيل المثال مع سلاسل. جافا == لا تقارن المراجع من الكائنات سلسلة ... (إذا كنت تستخدم أنواع primitve، == في جافا يقارن القيم). هذا هو السبب

// returns FALSE in JAVA
(new String("test") == "test") 

ولن يعود صحيح في جافا ...

في C # في المقابل، فإن المشغل == لا تتصرف مختلفة على الاوتار. على سبيل المثال، فإنه سيعود صحيح في الحالة التالية:

// returns TRUE in C#
(new String("test".ToCharArray()) == "test") 

وسلوك المشغل == يعتمد كيف أعلن المتغير الذي يتم تطبيقه على (وليس على فئة من الكائن، سأضيف على سبيل المثال).

لأنواع القيمة التي سوف مقارنة قيمهم.

لأنواع مرجع بإرجاع == ب الحقيقية إذا كان هو نفس موضوع ب، إلا إذا كان مثقلا المشغل ==. لا تجاوز كما قال آخرون، لا يمكن تجاوز المشغلين في ج # لأنهم ليسوا الظاهري.

و object obj_a, obj_b; string str_a, str_b;

        str_a = "ABC";
        str_b = new string("ABC".ToCharArray());
        obj_a = str_a;
        obj_b = str_b;

        Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded
        Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals
        Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded
        Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed.
        Console.ReadKey();

و

والناتج من هذا البرنامج هو

str_a == str_b = True
str_a.Equals(str_b) = True
obj_a == obj_b = False
obj_a.Equals(obj_b) = True

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top