C# ماذا == مشغل تفعل بالتفصيل ؟
-
03-07-2019 - |
سؤال
في c# ما يحدث تماما في الخلفية عند القيام بعملية المقارنة مع "==" المشغل على اثنين من الكائنات ؟ هل فقط مقارنة العناوين ؟ أو يفعل شيئا مثل يساوي() أو CompareTo() ?
PS:ماذا عن "==" المشغل في جافا ؟ لا تتصرف نفس الشيء ؟
المحلول
بقدر ما أعرف:
- فإنه يقارن أنواع قيمة من قيمة (المساواة)
- فإنه يقارن أنواع مرجع من المراجع (الهوية)
- إلا إذا كان == مشغل طاقتها ، ثم يدعو واحدة.
يساوي يتم تنفيذها في موضوع يمكن تجاوزها أيضا.تطبيق الافتراضي في الجسم يقوم إشارة المقارنة المرجعية أنواع.حتى افتراضي يساوي == تفعل الشيء نفسه.
أعتقد في جافا لا يمكنك الزائد == المشغل.ولكن بلدي جافا المعرفة هي قديمة جدا.
تحرير:
علما بأن ==
المشغل هو أسلوب ثابت.لا بد في وقت التحويل القاعدة على أنواع من المتغيرات أو الحقول. Equals
هو الظاهري الطريقة التي يتم العثور عليها في وقت التشغيل ، على أساس الفعلية وقت أنواع.
نصائح أخرى
لمشغلي المساواة ==! =
وشكل رفع من عامل موجود إذا كانت أنواع المعامل على حد سواء أنواع قيمة غير قيم الفارغة وإذا كان نوع النتيجة منطقي. شكل رفعت هي التي شيدت من خلال إضافة واحد؟ التعديل لكل نوع المعامل. ال يعتبر المشغل رفعت اثنين لاغية قيم المساواة، وقيمة فارغة غير متكافئة إلى أي قيمة غير فارغة. إذا كان كل من المعاملات وغير لاغية، ورفع مشغل بفك المعاملات و ينطبق المشغل الأساسي ل تنتج نتيجة منطقي.
اقتباس فقرة>وما يعنيه ذلك هو: لأن هناك عامل المساواة بين (ويقول):
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")
وماذا يفعل يعتمد على السياق.
http://en.csharp-online.net/ECMA -334: _14.9_Relational_and_type-testing_operators
وسلوك المشغل == يعتمد كيف أعلن المتغير الذي يتم تطبيقه على (وليس على فئة من الكائن، سأضيف على سبيل المثال).
لأنواع القيمة التي سوف مقارنة قيمهم.
لأنواع مرجع بإرجاع == ب الحقيقية إذا كان هو نفس موضوع ب، إلا إذا كان مثقلا المشغل ==. لا تجاوز كما قال آخرون، لا يمكن تجاوز المشغلين في ج # لأنهم ليسوا الظاهري.
و
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