我正在使用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);
}
}
}
}
}
答案 0 :(得分:4)
一般来说,嵌套类型更难以“发现”。
E.g。要使用嵌套类型,我必须编写以下内容
Page.TimerResetDelegate timer = new Page.TimerResetDelegate();
尽管上面是有效的C#代码,但它不像通常的类型用法那样读取。
当您想要定义要在内部使用的类型时,通常会使用嵌套类型,您可以避免使用上面的代码。这就是为什么FxCop会给你警告的原因。如果你愿意,你可以忽略它。就个人而言,我会将我的嵌套类型保密。如果我希望调用者使用该类型,我会将它们移动到适当的命名空间。
答案 1 :(得分:2)
这是因为您的委托是一个类型,但它是在Page类中定义的。我只想在Company.App.Thing命名空间中定义它,但它确实不是问题。如果你正在编写一个API,它会让它变得有点混乱,就是这样。
另外,像这样返回代表有点奇怪,但我想我真的不知道你想要完成什么。
答案 2 :(得分:2)
为什么TimerReset被公开为什么不好?
嵌套类型对于封装包含类型的私有实现细节很有用。用于此目的,嵌套类型不应在外部可见。
由于您公开TimerResetDelegate
公开TimerReset
,我想这不是实施细节。
不要使用外部可见的嵌套类型进行逻辑分组或避免名称冲突;相反,使用名称空间。
这使得您看起来像是使用嵌套类型进行分组。正如FxCop所述,改为使用命名空间。
嵌套类型包括成员可访问性的概念,一些程序员不清楚这一概念。
由于TimerResetDelegate
是委托,因此不适用。
将TimerResetDelegate
移动到它自己的TimeResetDelegate.cs文件中,并将其放在Company.App.Thing
命名空间中。然后,它不再嵌套。
当然,最好只使用EventHandler而不是定义自己的委托类型。
答案 3 :(得分:1)
恕我直言,这是一个可以忽略的FxCop规则。
具有嵌套类的CLR级别没有任何问题。它只是添加到FxCop的准则规则,因为作者认为它比使用非嵌套类更不可用或设计更差。
答案 4 :(得分:-1)
当它们可能在您的Page类的上下文之外使用时,它显然不喜欢嵌套类的想法。
我个人原则上同意这一点,尽管我可以想象一些可能需要的例外情况。