سؤال

لدي وظيفة تأخذ، من بين أمور أخرى، معلمة تم الإعلان عنها كـ كثافة العمليات الخاصة.عندما أرغب في استدعاء ToString() على هذه المعلمة، يقوم ReSharper بإلغاء تفعيلها ووضع علامة عليها كمكالمة زائدة عن الحاجة.لذا، نظرًا لفضولي، قمت بإزالة ToString()، وما زال الكود قيد الإنشاء!

كيف يمكن لمترجم C# أن يسمح بذلك، وأين شارع هي سلسلة؟

str += privateCount + ...

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

المحلول

يتم تحميل عامل التشغيل + للسلسلة بشكل زائد لاستدعاء String.Concat لتمريره في الجانب الأيسر والأيمن من التعبير.هكذا:

string x = "123" + 45;

يتم تجميعها إلى:

String.Concat("123", 45);

نظرًا لأن String.Concat يستوعب كائنين، يتم وضع الجانب الأيمن (45) في مربع ثم يتم استدعاء ToString() عليه.

لاحظ أن هذا "التحميل الزائد" لا يتم عن طريق التحميل الزائد للمشغل في اللغة (ويُعرف أيضًا باسم أنها ليست طريقة تسمى op_Addition) ولكن يتم التعامل معها بواسطة المترجم.

نصائح أخرى

إنها ليست مجرد ممارسة سيئة، ولكنها أيضًا أقل أداءً:يجب وضع العدد الصحيح في صندوق لأن String.Concat تتوقع كائنًا بينما لا يتطلب int.ToString() وضع الملاكمة.

يقوم C# تلقائيًا بتحويل الكائنات إلى سلاسل نيابةً عنك.خذ بعين الاعتبار هذا السطر من التعليمات البرمجية:

aString = aString + 23;

هذا صحيح C#؛يتم تجميعه إلى استدعاء String.Concat()، والذي يأخذ كائنين كوسائط.يتم تحويل هذه الكائنات تلقائيًا إلى كائنات سلسلة نيابةً عنك.

ويحدث نفس الشيء عندما تكتب:

aString += 23;

مرة أخرى، يتم تجميع هذا إلى نفس الاستدعاء إلى String.Concat();لقد تمت كتابته بشكل مختلف.

هذه ممارسة سيئة، حيث يجب عليك التفكير مرتين إذا كان المتغير عبارة عن سلسلة أو int.ماذا لو كان المتغير يسمى myInt؟

myInt = myInt + 23;

هو أكثر قابلية للقراءة والفهم في هذا النموذج؟

myInt = mInt + "23";

او حتى:

myInt = string.Format("{0}{1}", myInt, 23);

نعلم من الكود أنها سلسلة وليست عددًا صحيحًا.

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