لماذا FxCop رفع الخطأ "الأنواع الخاصة المتاح المجالات ينبغي التخلص منها" على فئة دون المتاح الحقول ؟

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

  •  10-07-2019
  •  | 
  •  

سؤال

لدي LINQ كائن مع وسيلة إضافية تضاف إلى ذلك.فئة لا يمكن التخلص منها خصائص أو أساليب ، ولكن التقدم هو رفع الخطأ "الأنواع الخاصة المتاح الحقول يجب أن تكون المتاح" و الرجوع إلى تلك الفئة.

لقد خفضت رمز هذا الآن و لا تزال تتلقى رسالة الخطأ:

partial class WikiPage
{
    public PagePermissionSet GetUserPermissions(Guid? userId) {
        using (WikiTomeDataContext context = new WikiTomeDataContext()) {
            var permissions =
                from wiki in context.Wikis
                from pageTag in context.VirtualWikiPageTags
                select new {};

            return null;
        }
    }
}

ومع ذلك ، إذا قمت بإزالة أحد من شروط التقدم توقف إعطاء الخطأ:

partial class WikiPage
{
    public PagePermissionSet GetUserPermissions(Guid? userId) {
        using (WikiTomeDataContext context = new WikiTomeDataContext()) {
            var permissions =
                from pageTag in context.VirtualWikiPageTags
                select new {};

            return null;
        }
    }
}

أو

partial class WikiPage
{
    public PagePermissionSet GetUserPermissions(Guid? userId) {
        using (WikiTomeDataContext context = new WikiTomeDataContext()) {
            var permissions =
                from wiki in context.Wikis
                select new {};

            return null;
        }
    }
}

PagePermissionSet لا يمكن التخلص منها.

هذا كاذبة إيجابية ؟ أو هو LINQ رمز بطريقة أو بأخرى توليد المجال المتاح في الصف ؟ إذا لم يكن إيجابية كاذبة, FxCop يوصي أنني تنفيذ واجهة IDisposable ، ولكن ماذا أفعل في التخلص الأسلوب ؟

تحرير:كامل FxCop الخطأ:

"تنفيذ IDisposable على WikiPage' لأنه يخلق من أعضاء التالية IDisposable أنواع:'WikiTomeDataContext'.إذا WikiPage' سابقا شحنها ، إضافة أعضاء جدد أن تنفيذ IDisposable أن هذا النوع يعتبر كسر تغيير القائمة المستهلكين."

تحرير 2:هذا هو تفكيكها رمز يثير الخطأ:

public PagePermissionSet GetUserPermissions(Guid? userId)
{
    using (WikiTomeDataContext context = new WikiTomeDataContext())
    {
        ParameterExpression CS$0$0001;
        ParameterExpression CS$0$0003;
        var permissions = context.Wikis.SelectMany(Expression.Lambda<Func<Wiki, IEnumerable<VirtualWikiPageTag>>>(Expression.Property(Expression.Constant(context), (MethodInfo) methodof(WikiTomeDataContext.get_VirtualWikiPageTags)), new ParameterExpression[] { CS$0$0001 = Expression.Parameter(typeof(Wiki), "wiki") }), Expression.Lambda(Expression.New((ConstructorInfo) methodof(<>f__AnonymousType8..ctor), new Expression[0], new MethodInfo[0]), new ParameterExpression[] { CS$0$0001 = Expression.Parameter(typeof(Wiki), "wiki"), CS$0$0003 = Expression.Parameter(typeof(VirtualWikiPageTag), "pageTag") }));
        return null;
    }
}

تحرير 3:هناك لا يبدو أن يكون الإغلاق الطبقة التي تحتوي على مرجع إلى DataContext.هنا هو تفكيكها كود:

[CompilerGenerated]
private sealed class <>c__DisplayClass1
{
    // Fields
    public WikiTomeDataContext context;

    // Methods
    public <>c__DisplayClass1();
}
هل كانت مفيدة؟

المحلول

وتخميني هو أن الأحكام From اثنين تولد الدعوة إلى SelectMany مع إغلاق يوم سياق البيانات الخاصة بك. على سبيل المثال إغلاق ديه حقل إلى datacontext الذي يسبب التحذير FxCop. هذا لا يستدعي القلق.

وهناك حالة واحدة فقط من datacontext الخاص بك، والتي يمكنك تنظيف عبر كتلة تستخدمه. لأن إغلاق لايوجد finalizer لا يوجد الأداء أو ضمنا توفيرا هنا في التحذير FxCop.

نصائح أخرى

لقد لاحظت أن هذا هو جزء من الدرجة.هل تم فحص آخر تنفيذ ملف الفئة ومعرفة ما إذا كان لديه IDisposable الأعضاء التي لا يتم التخلص منها ؟

لا أعتقد ولدت الإغلاق هو على خطأ هنا.الإغلاق يتم إنشاؤها مع بعض السمات التي يجب أن سبب التقدم إلى تجاهل تحذيرات من هذا القبيل.

تحرير

مزيد من التحقيقات من قبل المرجع أظهرت هذه المسألة مع IDisposable مجال رفع إلى الإغلاق.

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

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

إذا كنت إرجاع استعلام LINQ من طريقتك، والمستهلكين أعاد على النتائج باستخدام foreach.

عند انتهاء المستهلك حلقة foreach، فإنه يدعو داخليا التصرف على مصدر IEnumerable (في هذه الحالة، الاستعلام LINQ الخاص بك). وهذا التصرف في WikiTomeDataContext.

ومع ذلك، إذا جعلت المستهلك دعوة لطريقة العودة استعلام LINQ لكن أبدا كرر على النتائج، يبدو أن enumerable لن يتم التخلص منها (أي حتى جامع القمامة تنظيف الكائن). وهذا من شأنه أن يؤدي إلى الخاص WikiTomeDataContext لا يتم التخلص منها حتى جمع القمامة.

وطريقة واحدة قد تكون قادرة على الحصول على حل هذه المشكلة عن طريق الاتصال .ToArray على نتيجة استعلام LINQ، اتصل التصرف في السياق الخاص بك، ثم العودة للمجموعة.

والتعليمات البرمجية التي تعطي الخطأ يستخدم WikiDataContext.

ولديك اثنين من الأمثلة التي لا تعطي خطأ استخدام WikiTomeDataContext.

وربما هناك بعض الاختلاف بين هذين الذي تسبب في حدوث الخطأ.

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