FxCop - CA1034错误 - 为什么?

时间:2009-07-22 20:43:11

标签: c# static-analysis fxcop

我正在使用FxCop 1.36运行静态代码分析,并且我不断获得warning CA1034:NestedTypesShouldNotBeVisible。

我会理解父类是被声明为内部还是私有,但它是公共的。为什么将TimerReset声明为public是不好的?

我错过了什么,或者这是否可以忽略?

感谢您的任何意见!

以下是导致此警告的代码的摘录:

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);
                }
            }
        }
    }
}

5 个答案:

答案 0 :(得分:4)

一般来说,嵌套类型更难以“发现”。

E.g。要使用嵌套类型,我必须编写以下内容

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

尽管上面是有效的C#代码,但它不像通常的类型用法那样读取。

当您想要定义要在内部使用的类型时,通常会使用嵌套类型,您可以避免使用上面的代码。这就是为什么FxCop会给你警告的原因。如果你愿意,你可以忽略它。就个人而言,我会将我的嵌套类型保密。如果我希望调用者使用该类型,我会将它们移动到适当的命名空间。

答案 1 :(得分:2)

这是因为您的委托是一个类型,但它是在Page类中定义的。我只想在Company.App.Thing命名空间中定义它,但它确实不是问题。如果你正在编写一个API,它会让它变得有点混乱,就是这样。

另外,像这样返回代表有点奇怪,但我想我真的不知道你想要完成什么。

答案 2 :(得分:2)

  

为什么TimerReset被公开为什么不好?

正好是description states

  

嵌套类型对于封装包含类型的私有实现细节很有用。用于此目的,嵌套类型不应在外部可见。

由于您公开TimerResetDelegate公开TimerReset,我想这不是实施细节。

  

不要使用外部可见的嵌套类型进行逻辑分组或避免名称冲突;相反,使用名称空间。

这使得您看起来像是使用嵌套类型进行分组。正如FxCop所述,改为使用命名空间。

  

嵌套类型包括成员可访问性的概念,一些程序员不清楚这一概念。

由于TimerResetDelegate是委托,因此不适用。

TimerResetDelegate移动到它自己的TimeResetDelegate.cs文件中,并将其放在Company.App.Thing命名空间中。然后,它不再嵌套。

当然,最好只使用EventHandler而不是定义自己的委托类型。

答案 3 :(得分:1)

恕我直言,这是一个可以忽略的FxCop规则。

具有嵌套类的CLR级别没有任何问题。它只是添加到FxCop的准则规则,因为作者认为它比使用非嵌套类更不可用或设计更差。

答案 4 :(得分:-1)

当它们可能在您的Page类的上下文之外使用时,它显然不喜欢嵌套类的想法。

我个人原则上同意这一点,尽管我可以想象一些可能需要的例外情况。