FXCOP- CA1034错误 - 为什么?
-
19-09-2019 - |
题
我正在使用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中添加的指南规则,因为作者认为它比使班级非巢穴不那么使用或差的设计。
显然,当可以在页面类的上下文之外使用嵌套类的想法,这显然不喜欢它们的想法。
我个人在原则上同意这一点,尽管我可以想象一些例外可能是理想的。