سؤال

لماذا يقوم البيان الأول بإجراء تقييم إلى True؟ أعرف ما إذا كنت أستخدم "هو" بدلاً من "=" ، فلن يتم تقييمه إلى TRUE. إذا استبدلت String.Empty بـ "foo" ، فهذا لا يتم تقييمه إلى True. كل من String.Empty و "Foo" لديهما نفس النوع من السلسلة ، فلماذا يقوم المرء بتقييم True والآخر لا؟

    //this evaluates to true
    If Nothing = String.Empty Then

    End If

    //this evaluates to false
    If Nothing = "Foo" Then

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

المحلول

لا شيء في VB.NET هو القيمة الافتراضية لنوع ما. ال مواصفات اللغة يقول في القسم 2.4.7:

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

لذلك ، عند الاختبار ضد String.Empty ، لا يتم تحويل أي شيء إلى سلسلة ، والتي لها طول 0. يجب استخدام المشغل IS للاختبار مقابل لا شيء ، و empty.equals (لا شيء) سيعود أيضًا خطأ.

نصائح أخرى

إنها حالة خاصة من VB = و <> العاملين.

ال مواصفات اللغة الدول في القسم 11.14:

عند إجراء مقارنة بين السلسلة ، فإن مرجع فارغ يعادل السلسلة الحرفية ".


إذا كنت مهتمًا بمزيد من التفاصيل ، فقد كتبت مقارنة متعمقة vbNullString, String.Empty, "" و Nothing في VB.NET هنا:

جرب هذا:

Console.WriteLine("Is String.Empty equal to Nothing?: {0}", String.Empty.Equals(Nothing))

ال = المشغل لا يفرض أنواعًا متساوية ، في حين .Equals() طريقة كائن السلسلة تفعل ، كما تفعل Is المشغل أو العامل.

فيما يتعلق بهذا الموضوع ، إذا كنت تستخدم متغير سلسلة تم تهيئته باستخدام "لا شيء" ليتم تعيينه إلى "قيمة" الخاصية لـ SQLParameter يتم تجاهل المعلمة ، وليس مدرجًا في الأمر المرسلة إلى الخادم ، ويتم إلقاء خطأ معلمة مفقود . إذا قمت بتهيئة هذا المتغير باستخدام String.Empty كل شيء على ما يرام.

//This doesn't work
Dim myString as String = nothing
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString

//This works    
Dim myString as String = string.empty
mySqlCommand.Parameters.Add("@MyParameter", SqlDbType.Char).Value = myString
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top