سؤال

أنا أشغل تحليل رمز ثابت مع FXCOP 1.36 وأظل الحصول على تحذير CA1034.: nestedtypesshouldnotbevisibe.

وأود أن أفهم ما إذا تم الإعلان عن فئة الوالدين داخل داخلي أو خاص، لكنه عام. لماذا سيكون سيئا لتمويل التيمتريت.

هل أنا أفتقد شيئا ما، أم أن هذا شيء يمكن تجاهله؟

شكرا لأي إدخال!

إليك مقتطفات من التعليمات البرمجية التي تسبب هذا التحذير:

namespace Company.App.Thing
{
    public partial class Page : XtraPage
    {
        public delegate void TimerResetDelegate(object sender, EventArgs e);
        private TimerResetDelegate _timerReset;

        public Page()
        {
            InitializeComponent();
        }

        public TimerResetDelegate TimerReset
        {
            set
            {
                if (null != (_timerReset = value))
                {
                    checkBox.Click += new EventHandler(_timerReset);
                    textField.Click += new EventHandler(_timerReset);
                    textField.KeyDown += new KeyEventHandler(_timerReset);
                    TimeField.Click += new EventHandler(_timerReset);
                    TimeField.KeyDown += new KeyEventHandler(_timerReset);
                }
            }
        }
    }
}
هل كانت مفيدة؟

المحلول

بشكل عام، تصدق الأنواع المتداخلة "اكتشاف".

على سبيل المثال لاستخدام نوع المتغير الخاص بك، سأضطر إلى كتابة التالية

Page.TimerResetDelegate timer = new Page.TimerResetDelegate();

على الرغم من أعلى رمز C # صحيح، فإنه لا يقرأ مثل استخدام النوع المعتاد.

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

نصائح أخرى

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

أيضا، من الغريب بعض الشيء إرجاع المندوب من هذا القبيل، لكنني أعتقد أنني لا أعرف حقا ما تحاول إنجازه.

لماذا سيكون سيئا لتمويل التيمتريت.

بالضبط كما الوصف الدول:

الأنواع المتداخلة مفيدة لتغليف تفاصيل التنفيذ الخاص للنوع المحتوي. تستخدم لهذا الغرض، لا ينبغي أن تكون الأنواع المتداخلة مرئية خارجيا.

منذ أن تعرض TimerResetDelegate علنا مع TimerReset, أعتقد أنه ليس تفاصيل التنفيذ.

لا تستخدم أنواع متداخلة مرئية من الخارج للتجميع المنطقي أو لتجنب تصادم الاسم؛ بدلا من ذلك، استخدم مساحات الأسماء.

مما يجعلها تبدو وكأنها تستخدم نوع متداخل للتجميع. كدول FXCOP، استخدم مساحة الاسم بدلا من ذلك.

تتضمن الأنواع المتداخلة فكرة إمكانية الوصول الأعضاء، والتي لا يفهمها بعض المبرمجين بوضوح.

حيث TimerResetDelegate هو مندوب، هذا لا ينطبق حقا.

نقل TimerResetDelegate إلى ملف TimerEsetDelegate.cs الخاص به، ووضعه في حياتك Company.App.Thing مساحة الاسم. ثم، لم يعد متداخلا.

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

IMHO، هذه قاعدة FXCOP التي يمكن تجاهلها.

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

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

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

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