FXCOP -CA1034エラー - なぜですか?
-
19-09-2019 - |
質問
FXCOP 1.36で静的コード分析を実行していますが、取得し続けています 警告CA1034: :nestedtypesshouldnotbevisible。
親クラスが内部またはプライベートと宣言されているかどうかは理解できますが、それは公開されています。 TimerSetが公開されることが悪いのはなぜですか?
私は何かが足りないのですか、それともこれは無視できるものですか?
ご意見をお寄せいただきありがとうございます!
これがこの警告を引き起こすコードの抜粋です。
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.thingNamespaceですが、それは実際には問題ではありません。あなたがAPIを書いていたなら、それはちょうどそれを少し乱雑にするでしょう、それだけです。
また、そのような代表者を返すのは少し奇妙ですが、私はあなたが何を達成しようとしているのか本当に知らないと思います。
TimerSetが公開されることが悪いのはなぜですか?
まさに 説明状態:
ネストされたタイプは、含まれるタイプのプライベート実装の詳細をカプセル化するのに役立ちます。この目的のために使用されるネストされたタイプは、外部から見えるべきではありません。
あなたが公開しているので TimerResetDelegate
公に TimerReset
, 、実装の詳細ではないと思います。
論理グループ化に外部から表示されるネストされたタイプを使用したり、名前の衝突を避けたりしないでください。代わりに、名前空間を使用します。
これにより、グループ化にネストされたタイプを使用しているように見えます。 FXCOPが述べているように、代わりに名前空間を使用します。
ネストされたタイプには、メンバーのアクセシビリティの概念が含まれており、一部のプログラマーは明確に理解していません。
以来 TimerResetDelegate
代表者ですが、これは実際には当てはまりません。
動く TimerResetDelegate
それに自分のTimeresetDelegate.csファイルに、そしてそれをあなたに入れます Company.App.Thing
名前空間。それから、それはもうネストされていません。
もちろん、一緒に行く方がさらに良いでしょう EventHandler 独自のデリゲートタイプを定義する代わりに。
私見、これは無視できるFXCOPルールです。
ネストされたクラスを持っている場合、CLRレベルからは何も悪いことはありません。著者は、クラスを非ネストにするよりも使用が少ないか、設計が低いと感じたため、FXCOPに追加されたガイドラインルールです。
どうやら、ネストされたクラスがページクラスのコンテキストの外で使用される可能性がある場合、ネストされたクラスのアイデアが気に入らないようです。
私は個人的にそれに同意しますが、それが望ましいかもしれないいくつかの例外を想像することができます。