سؤال

زميلي في العمل هو جديد في C# و لم أكن أعرف عن تتجمع المشغل.حتى رأيته كتابة سطر من التعليمات البرمجية مثل هذا:

string foo = "" + str;

والفكرة هي أنه إذا str باطل ، هذا التعبير قد بإرجاع سلسلة فارغة.بالطبع يمكن أن تكون إعادة كتابة مثل هذا:

string foo = str ?? "";

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

تحرير:مجرد ملاحظة, أنا أقدر كفاءة التعليقات, ولكن هذا ليس حقا أن تستخدم في أي من الحالات حيث أن الأداء سيكون حاسما.وذلك في حين أن معلومات مثيرة للاهتمام ، ليس بالضرورة أن يكون ما أشعر به هو المهم.

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

المحلول

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

وفيما يتعلق بتصريحات أخرى:

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

وهناك أيضا فائدة الأداء ل   باستخدام مشغل خالية التحام،   لأنه لا يحتاج سلسلة تجري   (وبالتالي، لا سلسلة إضافية   يتم الآن إنشاء المثال   غير ضروري)

وليس صحيحا. C # مترجم يجمع "" + STRING2 لنفس الرمز 100٪ من STRING1 ؟؟ "". وعلاوة على ذلك C # مترجم يترجم مشغل + الدعوة إلى طريقة string.Concat الذي يتحقق بدوره الحجج مع وظيفة string.IsNullOrEmpty ولا تخصيص سلسلة جديدة في هذه القضية.

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

وأيضا أوصي استخدام   String.Empty على "" كما هو   ثابت ولا تتطلب   إنشاء سلسلة جديدة

و. NET الإطار يدعم سلسلة interning حتى "" ونقطة string.Empty إلى نفس الذاكرة المنطقة

نصائح أخرى

وأنا لا أعتقد أن واحدة من أي أكثر قابلية للقراءة من الآخر شخصيا. أنا أفضل هذا:

string foo = str ?? "";

وببساطة لأنني أحب ؟؟ المشغل.

إذا كنت مبتدئ العلامة التجارية، وأعتقد أن هذا سيكون أسهل قليلا لفهم:

string foo = str == null ? "" : str;

أو

string foo = "";
if (str != null) foo = str;

ومع ذلك، تحتاج كيندا أن تسأل نفسك: "كيف بسيط هل تريد حقا أن تحصل عليه؟"

وبينما كنت تفضل السطر الثاني من منظور تقني، السطر الأول هو في الواقع أكثر قابلية للقراءة بالنسبة لي ...

والسطر الثاني تبدو أكثر قابلية للقراءة بالنسبة لي، فإنه يوضح القصد من التعبير الجانب الأيمن.

وأود أن تفضل المثال الثاني إلى الأول لأنها أكثر استباقية ضد str كونها لاغية وأكثر تعبيرا. <ديل> أيضا أوصي استخدام String.Empty على "" كما هو ثابت ولا يتطلب إنشاء String الجديدة (ونعم هذا هو تصيد الأخطاء المدقع ولكن المهم أن نلاحظ).

أود أن استخدام تتجمع المشغل أو foo = str == null ? "" : str; لسببين:

  1. المثال الأول لا تملك نفس السلوك في المجعد-هدفين اللغات (خاصة جافا و جافا سكريبت) ، حيث إلحاق مرجع فارغة إلى سلسلة فارغة النتائج في سلسلة تحتوي على النص null.ونتيجة لذلك ، فإن المثال الأول يتطلب الكثير من الجهد العقلي لضمان أنه سوف يؤدي إلى السلوك الصحيح في اللغة تأليف.حتى بالنظر إلى القرائن الأخرى هو C# (مثل صغيرة نوع string), أي شيء يتطلب المطور إلى إبطاء والتفكير "ما هو القصد من هذا القانون" النتائج في فقدان الإنتاجية.فإنه يمكن أيضا إدخال الخلل عند الانتقال من لغة إلى لغة.

  2. المثال الثاني أكثر وضوحا عن القصد من قانون العقوبات ، كما هو موضح في السؤال الأصلي هو:

    when str is null set foo to an empty string

    بدلا من المثال الأول ، والتي يمكن قراءتها مثل:

    set foo to an empty string with str appended (which may have the side effect of setting foo to an empty string when str is null)

كما المبرمجين ربما يجب أن تحاول التعبير عن القصد الكود بدلا من الاعتماد على الآثار الجانبية من العمليات الأخرى أن تعطينا النتائج التي نريد.

وهنا مقالة عن string.empty مقابل ""

http://blogs.msdn.com/brada /archive/2003/04/22/49997.aspx

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