هل يمكنني تجاهل التحذير من التحليل الكفاءة بأمان: استبدال السلسلة == "" مع String.isnulloreper؟

StackOverflow https://stackoverflow.com/questions/1661024

  •  12-09-2019
  •  | 
  •  

سؤال

لدي رمز مشابه لهذا:

string s = CreateString();
if (s == "") foo(s);

إذا تساوي S ""، يجب استدعاء فو. إذا كانت السلسلة لاغية، مما لا ينبغي أن يحدث أبدا، فسيكون nullreeferenceException على ما يرام (كما هو الحال، بعد كل شيء، وضع استثنائي).

يخبرني البرمجيات اختبار S.isnullorembery. هذا من شأنه أن يغير الوظيفة بطريقة غير مرئية.

الأداء ليس مشكلة.

هل من الآمن لقمع تحذير CA1820 المرتبط؟

يحرر: نموذج التعليمات البرمجية المحدث والنص لتعكس حالتي بشكل أفضل.

يحرر: هذا هو الرمز الفعلي (الذي تم تغييره قليلا) (إنه في تطبيق IXMLSerialialialialialialialialialialializable):

public void ReadXml (XmlReader reader)
    // ...
    string img = reader.ReadElementString ("Image");
    if (img != "") {
        Image = Image.FromFile(img);
    }
    // ...
هل كانت مفيدة؟

المحلول

سوف تتصرف بشكل مختلف فيما يتعلق ب Nulls، لذلك يعتمد ذلك على ما تريد حدوثه؛ تذكر ذلك NullReferenceException سيكون على ما يرام، ولكن لا يوجد شيء في الكود المذكور من شأنه أن يرفع هذا الأمر، وبالتالي لماذا يمكن أن يسبب أخطاء غير متوقعة في المصب.

أبدا لست يملك, ، ولكن أنا دائما إغراء لإضافة:

static bool IsNullOrEmpty(this string value) {
    return string.IsNullOrEmpty(value);
}

حتى أتمكن من استخدام:

if (s.IsNullOrEmpty()) foo();

نصائح أخرى

المواصفات:

إذا تساوي S ""، يجب استدعاء فو. إذا كانت السلسلة فارغة، فلا يجب أن تحدث أبدا، فسيكون ذلك نالريفس.

فقط اختبار طول سلسلة كما ادن في قاعدة التصميم :

if (s.Length == 0) foo(s);

سؤالك :

هل من الآمن لقمع تحذير CA1820 المرتبط؟

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

يحتوي كل تحليل تحليل الكود على الوثائق التي يمكنك الوصول إليها عن طريق Highligting The Warnerning والضغط F1.. وبعد يمكنك أيضا النقر بزر الماوس الأيمن فوق العنصر للحصول على المساعدة.

في أي حال، إليك الوثائق التي تفسر هذا التحذير بشكل خاص.

وفقا لتلك الوثائق، فهي "آمنة لقمع تحذير من هذه القاعدة إذا كان الأداء ليس مشكلة".

سيكون من الأفضل كتابة الاختبار على النحو التالي:

if(s != null && s == "")

يمكنك بعد ذلك معالجة قيمة فارغة في بيان آخر إذا

أنت لا تتجاهل بالفعل التحذير، لقد نظرت إلى الرمز وقررت أن تحذير لا ينطبق. هذه حالة معقولة تماما بموجبها لقمع التحذير.

المضاربة النقية

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

إذا كان NULL على ما يرام، فستكون بخير في كلتا الحالتين.

نعم.

لكنني أتفق مع البرمجيات مع String.isnullorempty هو خيار آمن.

عدم التعامل مع استثناء بينما يمكنك التوردي الفكرة السيئة لذلك CA هو الصحيح في أنك تحتاج إلى علاج NULL فارغة أو معالجة الاستثناء. استثناء مرجعي فارغ ناتج عن استخدام قيمة الإرجاع هو شيء سيء للغاية. على الأقل مرة واحدة في debug.assert (s! = null) ومقارنة مع string.empty

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