سؤال

هل يستخدم أي شخص هنا VB.NET ولديه تفضيل قوي للاستخدام أو ضده IsNothing في مقابل Is Nothing (على سبيل المثال، If IsNothing(anObject) أو If anObject Is Nothing...)؟إذا كان الأمر كذلك لماذا؟

يحرر:إذا كنت تعتقد أن كلاهما مقبول على حد سواء، فهل تعتقد أنه من الأفضل اختيار أحدهما والالتزام به، أم أنه من المقبول مزجهما؟

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

المحلول

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

السبب الذي يجعلني أميل إلى الميل نحو استخدام "لا شيء" هو عندما ألغيه يصبح "ليس لا شيء" بدلاً من "ليس لا شيء (كائن)" والذي أشعر شخصيًا أنه يبدو أكثر قابلية للقراءة.

نصائح أخرى

أجد أن باتريك ستيل أجاب على هذا السؤال بشكل أفضل على مدونته: تجنب IsNothing()

لم أنسخ أيًا من إجابته هنا لضمان حصول باتريك ستيل على الفضل في منصبه.لكنني أعتقد أنك إذا كنت تحاول أن تقرر ما إذا كنت تريد استخدام Is Nothing أو IsNothing، فيجب عليك قراءة منشوره.أعتقد أنك ستوافق على أن Is Nothing هو الخيار الأفضل.

تحرير - تعليق VoteCoffe هنا

محتويات المقالة الجزئية:بعد مراجعة المزيد من التعليمات البرمجية، اكتشفت سببًا آخر يجب عليك تجنبه:يقبل أنواع القيمة!من الواضح، بما أن IsNothing() هي دالة تقبل "الكائن"، فيمكنك تمرير أي شيء تريده إليها.إذا كان نوعًا من القيمة، فسيقوم .NET بتجميعه في كائن وتمريره إلى IsNothing - والذي سيعيد دائمًا خطأ على القيمة المعبأة!سوف يقوم برنامج التحويل البرمجي VB.NET بالتحقق من بناء جملة النمط "ليس لا شيء" ولن يتم تجميعه إذا حاولت القيام بـ "لا شيء" على نوع القيمة.لكن الدالة IsNothing() تجمع دون شكاوى.-PSteele – VoteCoffee

يجب عليك تجنب استخدام تماما IsNothing()

هنا 4 أسباب من المقال IsNothing() VS لا شيء

  1. الاكثر اهمية، IsNothing(object) لقد تم تمرير كل شيء إليه ككائن، حتى أنواع القيمة!نظرًا لأن أنواع القيمة لا يمكن أن تكون Nothing, ، إنه شيك ضائع تمامًا.
    خذ المثال التالي:

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If
    

    سيتم تجميع هذا وتشغيله بشكل جيد، في حين أن هذا:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If
    

    لن يتم التجميع، وبدلاً من ذلك سيثير المترجم الخطأ:

    لا يقبل عامل التشغيل "Is" المعاملات من النوع "Integer".
    يجب أن تكون المعاملات مرجعية أو أنواعًا فارغة.

  2. IsNothing(object) هو في الواقع جزء من جزء من Microsoft.VisualBasic.dll.
    وهذا أمر غير مرغوب فيه لأن لديك تبعية غير ضرورية على مكتبة VisualBasic.

  3. إنه بطيء - أبطأ بنسبة 33.76% في الواقع (أكثر من 1000000000 تكرار)!

  4. ربما تفضيل شخصي، ولكن IsNothing() يقرأ مثل أ حالة يودا.عندما تنظر إلى متغير فإنك تتحقق من حالته، حيث يكون موضوعًا للتحقيق.

    أي.يفعل هو - هي تفعل س؟--- لا يكون xخاصية هو - هي?

    لذلك أعتقد If a IsNot Nothing يقرأ أفضل من If Not IsNothing(a)

أنا أتفق مع "لا شيء".كما هو مذكور أعلاه، من السهل نفي "ليس لا شيء".

أجد هذا أسهل في القراءة ...

If printDialog IsNot Nothing Then
    'blah
End If

من هذا...

If Not obj Is Nothing Then
    'blah
End If

VB مليء بأشياء مثل تلك التي تحاول جعلها "مثل اللغة الإنجليزية" ومريحة للأشخاص الذين اعتادوا على اللغات التي تستخدم () و{} كثيرًا.على سبيل المثال، في الجانب "like english"...يحتوي VB على "ليس كذلك"الكلمة الرئيسية...ولا، أنا لا أمزح.وعلى الجانب الآخر، كما تعلم بالفعل في معظم الأوقات، يمكنك استخدام () مع استدعاءات الوظائف إذا كنت تريد ذلك، ولكن ليس عليك ذلك.

أفضّل IsNothing()... لكني أستخدم C وC#، لذا فهذا هو الأمر المريح.وأعتقد أنه أكثر قابلية للقراءة.لكن اذهب مع ما يشعرك براحة أكبر.

أنا أميل نحو البديل "لا شيء"، لأنه يبدو أكثر OO.

بالتأكيد فيجوال بيسك ليس كذلك حصلت على الكلمة الأساسية ليست.

أميل أيضًا إلى استخدام إصدار Is Nothing جزئيًا من استخدامه بقدر ما أفعل في SQL.

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

يتطلب "ليس لا شيء" كائنًا تم تعيينه للقيمة "لا شيء".يمكن لـ IsNothing() أن تأخذ أي متغير لم تتم تهيئته، بما في ذلك النوع الرقمي.يعد هذا مفيدًا على سبيل المثال عند اختبار ما إذا تم تمرير معلمة اختيارية.

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