لماذا لدي لتعيين قيمة إلى int في C # عندما افتراضات إلى 0؟

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

سؤال

وهذا يعمل:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

ولكن هذا يعطي خطأ مترجم ( "استخدام المتغير المحلي غير المعينة 'ا'"):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

وبقدر ما استطيع ان اقول يحدث هذا لأنه في المثال الأول، من الناحية الفنية، والمترجم لا يعرف أن 'ا' لم يتم تعيين. في المثال الأخير، 'ا' ويعرف محليا، وبالتالي من السهل أن تتبع.

ولكن لماذا المثال الأخير لا تعمل؟

ولا صحيحة الافتراضي إلى 0؟ هل هذا شيء يفرض مترجم ل "أفضل الممارسات". أم أن هناك سبب آخر؟

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

المحلول

في المثال الأول هو الحقل . الحقول الافتراضية تلقائيا إلى 0 / خطأ / فارغة. في المثال الثاني فهو <م> متغير . المتغيرات <م> لا تخلفت، ويجب أن يكون "مهمة محددة" قبل استخدامها.

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

نصائح أخرى

<اقتباس فقرة>   

ولا صحيحة الافتراضي إلى 0؟

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

عند إنشاء مثيل مثيل جديد من فئة كافة الذاكرة هو "ركزت" يتم تعيين [إينتس] ليتم تعيين 0 سلاسل فارغة التي يحتاجها الكائن الخ وذلك لتجنب الكثير من البق ذاكرة غريبة والخارقة التي كانت ممكن في C (++). للأسف هذا أيضا تكلفة معالجة صغيرة، لذلك عند إنشاء متغير محلي تفترض اللغة هو أنك لن تعيين قيمة نفسك قريبا جدا ولا يكلف نفسه عناء التصفير ذلك لتقليل العدد الإجمالي للتعليمات المطلوبة. للتعويض عن مخاطر استخدام الذاكرة ضبطه هذا يدخل الشيكات مترجم إلى التأكد من أنه تم تعيين قيمة قبل أن تسمح لك لاستخدام متغير.

وهذا يمكن أن يكون بسبب متغير أعلن في مستوى الفئة لا يمكن تعيين قيمة في نفس النطاق (عدا عندما يعلن)

ومنها مثلا

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

وحين

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}

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

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