لماذا أحصل على تحليل التعليمات البرمجية CA1062 على معلمة خارج في هذا الرمز؟

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

سؤال

لدي رمز بسيط للغاية (تم تبسيطه من الكود الأصلي - لذلك أعلم أنه ليس رمزًا ذكيًا للغاية) أنه عندما أقوم بتجميع Visual Studio 2010 مع تحليل التعليمات البرمجية يمنحني تحذيرًا CA1062: التحقق من صحة الأساليب العامة.

public class Foo
{
    protected static void Bar(out int[] x)
    {
        x = new int[1];
        for (int i = 0; i != 1; ++i)
            x[i] = 1;
    }
}

التحذير أحصل عليه:

CA1062: Microsoft.design: في الطريقة المرئية خارجيًا "foo.bar (out int []) '، التحقق من صحة المتغير المحلي (*x)' ، والتي تم إعادة تعيينها من المعلمة 'x' ، قبل استخدامه.

لا أفهم لماذا أحصل على هذا التحذير وكيف يمكنني حله دون قمعه؟ يستطيع new إرجاع null؟ هل هذا خطأ Visual Studio 2010؟

تحديث

لقد قررت أن أفتح تقرير خطأ عن Microsoft Connect.

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

المحلول

لقد استنسخت هذا في Visual Studio 2010 Premium مع الكود تمامًا كما هو موضح مع Microsoft جميع القواعد تمكين في إعدادات التحليل.

يبدو أن هذا خطأ (انظر أسفل هنا: http://msdn.microsoft.com/en-us/library/ms182182.aspx). يشكو من أنك لا تتحقق من ذلك x ليس فارغًا قبل استخدامه ، لكنه قيد التشغيل out المعلمة لذلك لا توجد قيمة إدخال للتحقق!

نصائح أخرى

من الأسهل إظهاره من وصف:

public class Program
{
    protected static int[] testIntArray;

    protected static void Bar(out int[] x)
    {
        x = new int[100];
        for (int i = 0; i != 100; ++i)
        {
            Thread.Sleep(5);
            x[i] = 1; // NullReferenceException
        }
    }

    protected static void Work()
    {
        Bar(out testIntArray);
    }

    static void Main(string[] args)
    {
        var t1 = new Thread(Work);
        t1.Start();

        while (t1.ThreadState == ThreadState.Running)
        {
            testIntArray = null;
        }
    }
}

والطريقة الصحيحة هي:

    protected static void Bar(out int[] x)
    {
        var y = new int[100];

        for (int i = 0; i != 100; ++i)
        {
            Thread.Sleep(5);
            y[i] = 1;
        }

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