كيفية معرفة ما إذا كان قد تمت تهيئة المتغير في C #؟

StackOverflow https://stackoverflow.com/questions/1195597

  •  19-09-2019
  •  | 
  •  

سؤال

أعلم أن هذا سؤال غبي وأعتقد أنه يجب أن يطلب منه من قبل. ومع ذلك، أنا غير قادر على العثور على إجابة على سؤالي.

هنا هو بعض رمز العينة (أي بالطبع لا يترجم) لتحديد مشكلتي:

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] مع القيمة أنواع. وبعد أنواع القيمة هي أساسا structS (على سبيل المثال DateTime)، بما فيها[2] ال أنواع بسيطة مثل int, ، و enumerations. أنواع القيمة لا تدعم 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top