سؤال

وأنا في حيرة قليلا عن القيم والمتغيرات فارغة في .NET. (يفضل VB)

هل هناك أي وسيلة للتحقق من "nullness" من أي متغير معين بغض النظر عما إذا كان كائن أو نوع قيمة؟ أو هل لي الاختيار لاغيا أن نتوقع دائما سواء كان ذلك فحص نوع قيمة (مثل System.Integer) أو كائن؟

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

وأ) لم تكن تعيين قيمة منذ أن أعلن

وب) تم تعيين قيمة فارغة من كائن البيانات (التي جاءت من قاعدة بيانات)

وج) وضعت يساوي قيمة المتغير آخر الذي يعتبر لاغيا

وضعت

ود) إلى متغير جلسة ASP.NET / التطبيقات التي تم أبدا تعيين أو منتهية الصلاحية.

هل هناك العامة لأفضل الممارسات عندما يتعلق الامر بالتعامل مع سيناريوهات فارغة في. NET؟

<القوي> UPDATE: عند أتحدث عن نوع قيمة يجري "لاغية"، ما يعني في الواقع هو نوع القيمة التي تم إما لم تطأ أو كان في مرحلة ما تعيين يساوي أو تحويل من لاغية موضوع.

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

المحلول

وأنواع القيمة العادية (القيم المنطقية، [إينتس]، يتوق، تطفو، مزدوجة، التعداد والبنيات) ليست قيم الفارغة.

والقيمة الافتراضية لجميع أنواع القيمة 0.

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

وعلاوة على ذلك، كما يشير آخرون، منذ صافي 2.0 هناك نوع عام جديد يسمى Nullable<T>. هناك بعض الإختزالات المترجم في C # مثل الباحث؟ يعني Nullable<int>، مضاعفة؟ يعني Nullable<double> الخ.

ويمكنك لف فقط Nullable<T> على أنواع قيمة غير قيم الفارغة، التي على ما يرام منذ المراجع لديها بالفعل القدرة على أن تكون لاغية.

int? x = null;

لعدد صحيح ؟، في حين يمكنك اختبار ضد لاغية، أنها أجمل أحيانا للاتصال x.HasValue().

في C # هناك أيضا قيم الفارغة ائتلافه مشغل ؟؟ عندما تريد تعيين قيم الفارغة إلى نوع قيمة غير قيم الفارغة. ولكن إذا لم يكن لديك المشغل، يمكنك الاتصال GetValueOrDefault ().

int y = x ?? 2; // y becomes 2 if x is null.
int z = x.GetValueOrDefault(2); // same as y

نصائح أخرى

وأنواع القيمة لا يمكن أن تكون فارغة. كما أنه ينتهك ما يعنيه أن يكون نوع القيمة. يمكنك لف أنواع القيمة كما قيم الفارغة (وT) والتي تعطيك مجموعة كبيرة من الأساليب، ويتحقق شيء القيام بعمل. ولكن لديك الكثير من النفقات العامة مع هذا المجمع. ربما يمكنك توضيح ما نحاول القيام به؟

لاكتمال بناء الجملة VB لأغلفة Nullable وهو:

Dim i as Nullable(Of Integer) = Nothing '.NET 2.0/3.0'
Dim j as Integer? = Nothing '.NET 3.5'

وتحرير: يتم preinitialized نوع القيمة دائما إلى قيمة افتراضية، 0 لnumerics، كاذبة عن القيم المنطقية وغيرها

هل هذا ما كنت بعد؟

if IsNothing(foo) OrElse IsDbNull(foo) Then
    ' Do Something Because foo Is Either Nothing or DBNull.Value
End If

في الحقيقة لست متأكدا لماذا كنت ترغب في هذا الهيكل. والمرة الوحيدة التي سوف تحقق لDBNULL.Value هو عندما أنا باستخدام القيم التي جاءت من قاعدة بيانات، وقبل أن تعيين قال القيمة من فئة البيانات المجرد إلى بعض فئة أخرى [أي خافت ب كسلسلة = dataReader (0)].

وبشكل عام، إذا كنت قلقا حول كائن بعد أن لم مثيل، أو التي تحتاج إلى أن يتم إعادة إنشاء مثيل، ثم مجرد الاختيار IsNothing لن يكون كافيا.

في صافي أن نوعان فقط من لاغية أنني على علم، فارغة (لا شيء في VB) وDBNULL. إذا كنت تستخدم System.Nullable، يمكنك استخدام نفس اغية التدقيق في بناء الجملة كما تفعل مع كائن. إذا إذا كان محاصر الكائن قيم الفارغة الخاصة بك. الصافية 2.0 CLR ذكي بما فيه الكفاية لمعرفة الطريقة الصحيحة للتعامل مع هذا.

والحالة الوحيدة لقد واجه كلا النوعين هي في مستوى البيانات من تطبيق حيث أنا يمكن الوصول إلى البيانات قاعدة البيانات مباشرة. على سبيل المثال، لقد واجهت DBNULL في DataTable و. للتحقق من كل من هذه الأنواع خالية في هذا situration، هل يمكن أن يكتب طريقة تمديد مثل (آسف، في C #):

static public bool IsNull(this object obj)
{
    return obj != null && obj != DbNull.Value;
}

...

if(dataTable[0]["MyColumn"].IsNull())
{
  //do something
}
لا يمكن أن يحتوي

والمتغيرات نوع القيمة باطل، ذلك لأن ما سيلة فارغة، لاغية يعني أن نقاط المراجع في أي مكان. أنا لا أعرف على VB.net لكن في ج # يمكنك لف أنواع قيمة أن تكون nullables استخدام، مثل "؟":

int? a = null;

وطالما كنت النامية الخيار صارمة على (أ) يجب أن لا تكون هذه القضية. فإن المترجم يصرخ عليك. إذا كنت قلقا حول التحقق من المعلمات، استخدم فقط

Public Sub MySub(ByVal param1 as MyObject, ByVal param2 as Integer)
    if param1 is nothing then
         Throw New ArgumentException("param1 cannot be null!")
    end if
    'param2 cannot be null
End Sub

ل(ب)، طبقة التفاعل قاعدة البيانات الخاصة بك يجب التعامل مع هذا. إذا كنت تستخدم LINQ، وهناك طرق للتعامل مع هذا. إذا كنت تستخدم مجموعات البيانات المكتوبة، هناك خاصية .IsMyVariableNull على التوالي التي يحصل الذي تم إنشاؤه تلقائيا.

ل(ج)، وكنت لا داعي للقلق حول أنواع قيمة، ولكن أنواع مرجع يمكن التحقق مع بسيطة هل لا شيء (أو لا تتبع أي شيء).

ل(د)، يمكنك تطبيق نفس المنطق بعد القراءة. اختبار متغير تلقي ضد لا شيء.

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

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