كيفية معرفة ما إذا كان قد تمت تهيئة المتغير في C #؟
سؤال
أعلم أن هذا سؤال غبي وأعتقد أنه يجب أن يطلب منه من قبل. ومع ذلك، أنا غير قادر على العثور على إجابة على سؤالي.
هنا هو بعض رمز العينة (أي بالطبع لا يترجم) لتحديد مشكلتي:
class test
{
int[] val1;
string val2;
static bool somefunction(test x, test y)
{
dosomestuff()
test result;
while(result is nothing)
{
if(somecondition){result=new test(something);}
}
}
}
المشكلة التي لدي في السطر التالي:
while(result is nothing)
هذا هو بناء الجملة من VB، والتي بالطبع ليست ما يقبل برنامج التحويل البرمجي C #. هل يمكن لشخص ما أن يقول لي كيف لحل المشكلة؟
المحلول
بناء الجملة الذي تبحث عنه هو:
while (result == null)
يجب عليك أيضا ضبط result = null;
لتبدأ أيضا
نصائح أخرى
TL؛ DR:
if (Object.Equals(
myVariable
, default(
MyVariableType
)))
- يحل محل
myVariable
وMyVariableType
.
هناك حلول أخرى.- يحل محل
if (myVariable == null)
إرادة لا يعمل[1] مع القيمة أنواع. وبعد أنواع القيمة هي أساسا struct
S (على سبيل المثال DateTime
)، بما فيها[2] ال أنواع بسيطة مثل int
, ، و enum
erations. أنواع القيمة لا تدعم null
القيمة (جوهرية).
الاستثناء والإصلاح لهذا هو nullable. أنواع: أساسا هذه الإضافة null
إلى القيم المحتملة لنوع الهيكل. هم هيكليا نفس الشيء مثل Maybe<T>
قد تعرف من لغات أخرى[3]. وبعد أنت تنشئها مع ValueType?
(على سبيل المثال int?
) وهو السكر النحوي ل Nullable<ValueType>
.
بدلا من ذلك، بدلا من استخدام نوع Nullable، يمكنك مقارنة المتغير الخاص بك إلى القيمة الافتراضية للنوع:
if (Object.Equals(myVariable, default(MyVariableType)))
(سيعمل ذلك على حد سواء للأنواع المرجعية (الكائنات) وأنواع القيمة.)
لاحظ أن عليك أن تحل محل MyVariableType
يدويا - لسوء الحظ يمكنك ليس فعل
if (Object.Equals(myVariable, default(myVariable.GetType())))
لان default()
يقبل فقط اسم النوع مباشرة. (أفترض أنه يقيم في وقت الترجمة.)
بنيات شيء صغير
وضع ببساطة، والمويدات هي الفئات خفضت. تخيل الطبقات التي لا تدعم الميراث أو النهادة، ولديك الإصدار النهائي: الهيكل. يتم تعريف الهياكل بنفس طريقة الطبقات (باستثناء
struct
الكلمة الرئيسية)، وبصرف النظر عن القيود الموضحة للتو، يمكن أن يكون لدى الهياكل نفس الأعضاء الأثرياء، بما في ذلك الحقول والأساليب والخصائص والمشغلين.
استشهد من: http://www.albahari.com/valuevsreftypes.aspx. ]
الطبقات هي أنواع المراجع: يحتوي متغير فئة (أو أكثر تحديدا، ومنطقة ذاكرةها) فقط بمؤشر إلى منطقة ذاكرة أخرى، حيث يتم تخزين بيانات مثيل الكائنات الفعلية.
نوع القيمة المتغيرات تحتوي مباشرة على البيانات. قد يؤدي هذا إلى استحقاقات السرعة بسبب محلية ذاكرة التخزين المؤقت وإنقاذ البحث. ولكن قد يكون أيضا ضارا بالأداء في حالة المزيد من الهياكل المعقدة.
الحواشي:
1] لا يلقي حتى خطأ. myVariable == null
سوف دائما فقط تسفر false
, ، لان خاصتك myVariable
سيتم تهيئة مع غيرnull
إفتراضي القيمة (صفر (ما يعادل) أو هيكل الأصفار و null
س). هذه القيمة الافتراضية متاحة مع default(Type)
.
2] من النطاق من الناحية الفنية (الكل أنواع مدمجة إلا string
و object
) نكون الهياكل. ملاحظة جانبية: الأنواع المدمجة هي اسماء مستعارة لأنواع من نظام مساحة الاسم.
3] على سبيل المثال في haskell. وبعد في ج # Maybe<T>
ليست مدمجة، ولكن يمكن تنفيذها. أنه يوفر Nothing
كإصدار أكثر صراحة / توثيق ذاتي من null
سواء بالنسبة للفصول والوليد.
4] لا يوجد [4]. وبعد لا حقا، يمكنك الذهاب والتحقق.
while (result == null)
while (result ==null )
إذا كان هذا هو ما تقصد
على الرغم من أن لديك إجابة سعداء، فهناك شيء خلفه قد تجد مثيرا للاهتمام أو مفيدا.
هناك فرق بين C # و VB.NET. في vb.net يمكنك الكتابة:
Dim b as Boolean
وفي C # يمكنك الكتابة:
bool b;
هم مختلفون بمهارة. في vb.net، b
تم إعطاء القيمة FALSE (بمعنى آخر، وقد تم بالفعل تهيئة). في C #، b
ليس لديه قيمة (غير مهيأة). يذهب C # إلى الكثير من الجهد للتأكد من أنه لا يمكنك فحص قيمة المتغير الذي لم تتم تهيئته مطلقا.
لذلك لا تختبر ما إذا كان المتغير يتم تهيئته. في vb.net لا يوجد شيء مثل متغير غير مهم. في C # من المستحيل الحصول على قيمة متغير غير مهم من أجل قارنه بأي شيء.
أنت تختبر ما إذا كان قد تم تهيئة المتغير ل null
أو Nothing
.
while(result == null)
أي ما يعادل لا شيء في C # هو فارغة.
while (result == null)