سؤال

في مشروع التعليمات البرمجية المختلطة (VB و C#) ، تم تصحيح بعض الكود الأساسي البصري القديم مثل هذا:

If Request.Params("xxx") <> "" Then
   'do something

لقد اعتبرت هذا خطأ كطلب. يمكن أن يكون params null, ، في هذه الحالة ، كان البيان قد أصبح خطأ وهو ما لم يكن الفكرة.

لذلك فكرت. لقد اكتشفت للتو - مرة أخرى - أن VB's Nothing و C# null ليست نفس الأشياء و Nothing ليس هو نفسه null. في الواقع:

if(String.Empty == null)          // in C# this is always false (correct)
If String.Empty = Nothing Then    ' in VB this is always true (????)

كيف يكون هذا ممكن حتى؟ هل هذه مشكلة توافق متخلفة؟

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

المحلول

Nothing له معنى خاص في VB للسلاسل. لاختبار ما إذا كان مرجع السلسلة فارغًا ، فأنت بحاجة إلى:

If value Is Nothing

من وثائق مشغلات مقارنة VB:

لا تعامل المقارنات الرقمية شيئًا عن 0. مقارنات السلسلة لا تعامل شيئًا "(سلسلة فارغة).

أظن أن هذا هو التوافق المتخلف مع VB6 فقط - إنه ليس شيئًا سأكون سعيدًا به ، إذا كنت مطور VB.

مقارنة بين النموذج

If value = Nothing

تم تجميعها لمكالمة إلى Microsoft.VisualBasic.CompilerServices.Operators.CompareString الذي يعود 0 (أي على قدم المساواة) إذا كان أحد المعاملات فارغة والآخر فارغ.

نصائح أخرى

في VB6 ، كانت القيمة الافتراضية لمتغير السلسلة عبارة عن سلسلة فارغة. لن يكون مبرمج VB6 الذي يعتمد على مثل هذا السلوك "أسوأ" من مبرمج C الذي يعتمد على التهيئة الافتراضية-الصفر لمتغيرات INT ؛ تم تحديد كلا السلوكيات كجزء من اللغة.

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

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

انت تريد

If Not String.IsNullOrEmpty(Request.Params("xxx") Then
    ...
End If

أو

if (!String.IsNullOrEmpty(Request.Params("xxx")) {
    ...
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top