سؤال

وأنا لا يمكن العثور على إجابة شافية. منذ C # 2.0 كنت قد تمكنت من إعلان

int? i = 125;

وكما اختصار ل

Nullable<int> i = Nullable<int>(123);

وأذكر القراءة في مكان ما VB.NET لم يسمح هذا الاختصار. لكن انخفاض ولمح، حاولت ذلك في VS 2008 اليوم، وأنه يعمل.

لا أحد يعرف ما إذا كان ما كان هذا الطريق منذ NET 2.0 أو كان هذا وأضاف في وقت لاحق؟

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

المحلول

وقدم System.Nullable في صافي 2.0 ويتوفر لVB <م> كنوع عام . لا يمكنك أن استخدم بناء الجملة قيم الفارغة. حتى في VS 2005 يمكنك القيام به:

Dim x as Nullable(of Integer)

وأنا لا أعرف إذا كان التكافؤ لاغيا والملاكمة يعمل لnullables في VB 2005، لكني أشك في أن الجواب هو نعم منذ قدم فريق صافي تغيير في CLR 2.0 لإنجاز الملاكمة مع nullables. أتصور VB تعزز هذا.

في عام 2008، يمكنك من الواضح أن مجرد القيام به:

Dim x as Integer?

نصائح أخرى

وكان يعمل في VB 2005 (DOTNET 2.0) ولكن من القبيح.

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

وبدلا من هذا:

dim oInt as object

dim i as integer

if oInt is nothing then 

    msgbox("int is null")
else

    i = cint(oInt)

end if

وكان لديك هذا.

Dim oInt as nullable(of integer)

dim i as integer

if oInt.HasValue = false then 

    msgbox("int is null")

else

   i = oInt.Value

end if

والمشكلة هنا هي أنه إذا كان المتغير هو باطل وكنت يحدث لاستدعاء الخاصية قيمة ذلك barfs يصل استثناء غير معالج.

وهكذا على سبيل المثال، بلدي واحد المفضل هو هذا.

AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, iif(oInt.HasValue, oInt.Value, DBNull.value))

هل ينتج خطأ وقت التشغيل الخاص بك عندما قيمة Nullable ومن المفترض فارغة !!!

وحتى هنا قيم الفارغة (من عدد صحيح) مقابل كود كائن

وقيم الفارغة (من عدد صحيح)

if oInt.HasValue then 
    AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt.Value)
else
    AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, dbnull.value)
end if

والكائن

AddParamToSQLCmd(sqlCmd, "@SomeID", SqlDbType.Int, 0, ParameterDirection.Input, oInt)

وIIRC، أدخلت أنواع nullable في .NET Framework 2.0 في مرحلة متأخرة جدا. تمكن فريق C # مترجم الالزام في المزيد من الدعم لغة لهم من فعل فريق VB.NET. فريق VB.NET أكثر أو أقل المحاصرين في VS2008. لهذا السبب يمكنك، على سبيل المثال، استخدم عامل == للمقارنة nullables في C # 2.0 بينما في VB.NET كان عليك أن طرح مع Nullable.Equals طريقة (). Grrr.

وأنا لا أعرف التاريخ، ولكن نعم انها كانت VS 2008 تعزيز.

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