سؤال

لقد رأيت شيئا مثل التالية عدة مرات...و أنا أكره ذلك.هذا هو الأساس 'الغش' اللغة ؟ أو..هل نعتبر هذا 'موافق' لأن IsNullOrEmpty يتم تقييم أولا في كل وقت ؟

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

string someString;
someString = MagicFunction();

if (!string.IsNullOrEmpty(someString) && someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // On a NULL string, it drops to here, because first evaluation of IsNullOrEmpty fails
   // However, the Length function, if used by itself, would throw an exception.
}

تحرير: شكرا مرة أخرى للجميع ذكرتني هذه اللغة الأساسية.في حين علمت "لماذا" عملت, لا أستطيع أن أصدق أنني لم أعرف/تذكر اسم المفهوم.

(في حالة أي شخص يريد أي خلفية..جئت إلى هذا في حين استكشاف الأخطاء وإصلاحها الاستثناءات التي تم إنشاؤها بواسطة NULL السلاسل .طول > x استثناءات...في أماكن مختلفة من التعليمات البرمجية.لذلك عندما رأيت رمز أعلاه, بالإضافة إلى كل شيء آخر ، إحباطي استغرق أكثر من هناك.)

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

المحلول

كنت الاستفادة من اللغة الروائية المعروفة باسم الدائرة القصيرة.ليس هذا هو الغش اللغة ولكن في الواقع باستخدام ميزة بالضبط كيف تم تصميمها ليتم استخدامها.

نصائح أخرى

إذا كنت تسأل إذا كان عن طيب تعتمد على "ماس كهربائى" العلائقية && و ||, ثم نعم هذا ما يرام تماما.

لا يوجد شيء خاطئ مع هذا ، كما تريد فقط للتأكد من أنك لن تحصل على nullpointer استثناء.

أعتقد أنه من المعقول أن تفعل.

مع امتداد يمكنك أن تجعل من أنظف ، ولكن المفهوم الأساسي لا يزال ساري المفعول.

هذا الرمز هو تماما صحيحة ، ولكن أود أن استخدام Null تتجمع المشغل من أجل تجنب null نوع الشيكات.

string someString = MagicFunction() ?? string.Empty;
if (someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // NULL strings will be converted to Length = 0 and will end up here.
}

لا يوجد شيء خاطئ مع هذا.

إذا(الشروط يتم تقييمها من اليسار إلى اليمين حتى أنه على ما يرام تماما كومة لهم مثل هذا.

هذا هو رمز صالح ، في رأيي (على الرغم من إعلان متغير تعيين على السطر التالي هو مزعج جدا), ولكن يجب أن ندرك أن يمكنك إدخال آخر-كتلة أيضا في حالة طول السلسلة < 3.

الذي يبدو لي معقولا تماما استخدام المنطقي قصيرة circuitting--إذا كان أي شيء انها الغش مع اللغة.لقد وصلنا مؤخرا من VB6 التي لم من أي وقت مضى ماس كهربائى ، منزعجة لي.

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

هذا صحيح تماما و لا يوجد شيء خاطئ مع استخدامه بهذه الطريقة.إذا كنت الموثقة التالية السلوك اللغة من كل شيء على ما يرام.في C# جملة كنت تستخدم هي المنطق الشرطي مشغلي ثير docemented bahviour ويمكن الاطلاع على MSDN

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

والاعتماد على الدائرة قصيرة هو "الشيء الصحيح" أن تفعل في معظم الحالات.فإنه يؤدي إلى terser رمز مع عدد أقل من الأجزاء المتحركة.مما يعني عموما أسهل للمحافظة عليه.هذا صحيح خصوصا في C و C++.

وأود أن تعيد النظر بجدية في التعاقد مع شخص ليس على دراية (و لا أعرف كيفية استخدام) الدائرة قصيرة العمليات.

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

فمن المنطقي لأنه C# افتراضيا دوائر قصيرة الظروف ، لذلك أعتقد أنه لا بأس من استخدام هذا لصالحك.في VB قد يكون هناك بعض المسائل إذا كان المطور يستخدم بدلا من ANDALSO.

لا أعتقد أن الأمر يختلف من شيء مثل هذا:

INT* pNumber = GetAddressOfNumber();

if ((pNUmber != NULL) && (*pNumber > 0))
{
  // valid number, do whatever
}
else
{
  // On a null pointer, it drops to here, because (pNumber != NULL) fails
  // However, (*pNumber > 0), if used by itself, would throw and exception when dereferencing NULL
}

انها مجرد الاستفادة من ميزة في اللغة.هذا النوع من المصطلح في الاستعمال الشائع ، أعتقد منذ C بدأ تنفيذ التعبيرات المنطقية في هذه الطريقة (أو أي لغة فعلتها الأولى).)

إذا كانت التعليمات البرمجية في c التي جمعت في الجمعية ، ليس فقط تفقد أعصابها السلوك الصحيح ، إنه أسرع.في آلة الناطقة أجزاء من البيان إذا يتم تقييم واحد بعد آخر.لا تفقد أعصابها أبطأ.

كتابة التعليمات البرمجية تكلف الكثير من دولار إلى الشركة.ولكن الحفاظ على ذلك أكثر تكلفة !

لذلك أنا موافق مع وجهة نظرك :الفرصة هي أن هذا الخط من التعليمات البرمجية لن يكون مفهوما على الفور من قبل الرجل الذي سوف تضطر إلى قراءتها وتصحيحها في 2 سنوات.

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

يجب علينا دائما رمز الرجل القادم و قد يكون أقل ذكاء أننا.لي, هذا هو الشيء الوحيد الذي تذكر.

و هذا يعني أن نستخدم واضح ميزات اللغة وتجنب الآخرين.

كل خير, سيلفان.

قليلا خارج الموضوع ولكن إذا كنت راند نفس المثال في vb.net مثل هذا

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) and someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

هذا من شأنه أن يذهب الانفجار على null (لا شيء) السلسلة ولكن في VB.Net لك رمز على النحو التالي تفعل نفس الشيء في C#

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) andalso someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

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

Drux

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