我正在使用FXCOP 1.36运行静态代码分析 警告CA1034: :NestedTypessHouldBevisHoundBevis。

我会明白,父母班级是否被宣布为内部或私人,但这是公开的。对于Timerreset宣布公开的情况为什么会很不好?

我是否缺少某些东西,还是可以忽略的东西?

感谢您的任何输入!

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

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向您发出警告的原因。如果需要,可以忽略它。就个人而言,我将嵌套类型作为私人。如果我期望呼叫者使用该类型,我将将其移至适当的名称空间。

其他提示

这是因为您的委托是一种类型,但在页面类中定义。我只会在公司中定义它。App.thing命名空间,但这确实不是问题。如果您写的是API,那将使它有些混乱,仅此而已。

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

对于Timerreset宣布公开的情况为什么会很不好?

完全像 描述状态:

嵌套类型可用于封装包含类型的私人实现详细信息。用于此目的,嵌套类型不应在外部可见。

因为您正在暴露 TimerResetDelegate 公开 TimerReset, ,我想这不是实现细节。

请勿使用外部可见的嵌套类型进行逻辑分组或避免名称碰撞;而是使用名称空间。

这使得您看起来您正在使用嵌套类型进行分组。如FXCOP所述,请改用名称空间。

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

自从 TimerResetDelegate 是代表,这并不适用。

移动 TimerResetDelegate 是自己的timeresetdelegate.cs文件,然后将其放入您的 Company.App.Thing 名称空间。然后,它不再嵌套了。

当然,最好还是 EventHandler 而不是定义自己的代表类型。

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

CLR级别的嵌套级别没有错。这只是FXCOP中添加的指南规则,因为作者认为它比使班级非巢穴不那么使用或差的设计。

显然,当可以在页面类的上下文之外使用嵌套类的想法,这显然不喜欢它们的想法。

我个人在原则上同意这一点,尽管我可以想象一些例外可能是理想的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top