لا شيء = string.empty (لماذا هذه متساوية؟)
سؤال
لماذا يقوم البيان الأول بإجراء تقييم إلى 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