سؤال

لقد لاحظت شيئا غريبا حول Visual Studio.أولا حاول كتابة هذا (C#) في مكان ما في وظيفة:

class Foo  
{  
    public void Bar()  
    {  
        string s;
        int i = s.Length;
    }
}

الآن على الفور وسوف بمناسبة s في s.Length خطأ قائلا "Use of unassigned local variable 's'".من ناحية أخرى, جرب هذا الكود:

class Foo  
{  
    private string s;
    public void Bar()  
    {  
        int i = s.Length;
    }
}

فإنه سيتم تجميع ، ونؤكد s في private string s مع تحذير قائلا "Field 'Foo.s' is never assigned to, and will always have its default value null".

الآن, إذا كان مقابل هذا ذكي و يعرف هذا سوف يكون دائما null, لماذا هو ليس خطأ للحصول على طوله في الثانية مثلا ؟ بلدي الأصلي كان " ، فإنه يعطي خطأ في التحويل البرمجي إذا كان المترجم ببساطة لا يمكن إكمال عملها.منذ رمز تقنيا يعمل طالما أنك لم تتصل بار () ، هو فقط تحذير". إلا أن التفسير هو تبطله المثال الأول.هل يمكن أن لا تزال تعمل مدونة دون خطأ طالما أنك لم تتصل بار().حتى ما يعطي ؟ مجرد سهو ، أو أنا في عداد المفقودين شيئا ؟

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

المحلول

والمثال الأول (الخطأ) هو مثال للمترجم في <لأ href = "http://msdn.microsoft.com/en-us/library/aa691172٪28VS.71٪29.aspx" يختلط = " نوفولو noreferrer "> يتم تطبيق تتبع واضح للإحالة و ذلك فحسب إلى المتغيرات المحلية. بسبب الإطار المحدود، والمترجم له قبضة محكم على هذا الوضع. لاحظ أن s ليس باطلا، فمن غير معرف.

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

وهكذا حسب التصميم.

نصائح أخرى

على سبيل المثال الثاني رمز غير صالح قد لا تعمل بشكل صحيح.هنا عدة حالات في هذا البرنامج قد تنفيذ "بنجاح"

  • المترجم ليس 100% صحيح.فمن الممكن ل "s" إلى قيمة غير فارغة وفي سبيل ذلك يتم تعديل عن طريق التفكير.
  • البرنامج يمكن أن تنفذ دون خطأ إذا كان الأسلوب شريط أليس من أي وقت مضى يسمى
  • هذا البرنامج يمكن أن يكون اختبار البرنامج الذي اثار NullReferenceException لاختبار الأسباب

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

في العينة الأولى <م> ق هو متغير محلي ومترجم يمكن easialy الاختيار <م> ق لم يكن تعيين varible قبل انها تستخدم.

في ثانية واحدة، <م> ق هو متغير عمومي وانه من الممكن أن تمت تهيئة في مكان آخر في فئة.

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