4

FxCop 1.36 で静的コード分析を実行していますが、警告 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);
                }
            }
        }
    }
}
4

5 に答える 5

5

一般的に言えば、ネストされた型は「発見」するのがより困難です。

たとえば、ネストされた型を使用するには、次のように記述する必要があります

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

上記は有効な C# コードですが、通常の型の使用法とは異なります。

ネストされた型は通常、内部で使用する型を定義したい場合に使用され、上記のようなコードは避けます。これが、FxCop が警告を発している理由です。必要に応じて、それを無視できます。個人的には、入れ子になった型を非公開にしておきます。呼び出し元がその型を利用することが予想される場合は、それらを適切な名前空間に移動します。

于 2009-07-22T20:59:05.050 に答える
3

TimerReset を public と宣言するのはなぜ悪いのでしょうか?

説明が述べているとおり:

ネストされた型は、包含型のプライベート実装の詳細をカプセル化するのに役立ちます。この目的で使用されるネストされた型は、外部から見えないようにする必要があります。

TimerResetDelegateで公開しているTimerResetので、実装の詳細ではないと思います。

論理的なグループ化や名前の競合を避けるために、外部から見えるネストされた型を使用しないでください。代わりに、名前空間を使用してください。

グループ化にネストされた型を使用しているように見えます。FxCop が述べているように、代わりに名前空間を使用してください。

ネストされた型には、一部のプログラマーが明確に理解していないメンバーのアクセシビリティの概念が含まれています。

デリゲートであるためTimerResetDelegate、これは実際には当てはまりません。

TimerResetDelegate独自の TimeResetDelegate.cs ファイルに移動し、Company.App.Thing名前空間に配置します。その後、ネストされなくなりました。

もちろん、独自のデリゲート型を定義するのではなく、EventHandlerをそのまま使用する方がよいでしょう。

于 2009-07-22T21:03:49.220 に答える
2

これは、デリゲートが型であるためですが、Page クラス内で定義されています。Company.App.Thing 名前空間で定義するだけですが、実際には問題ありません。もしあなたが API を書いていたとしても、それは少し厄介になるだけです。

また、デリゲートをそのように返すのは少し奇妙ですが、あなたが何を達成しようとしているのかよくわからないと思います。

于 2009-07-22T20:45:45.170 に答える
2

私見、これは無視できる FxCop ルールです。

ネストされたクラスを持つ CLR レベルから問題はありません。これは、FxCop に追加された単なるガイドライン ルールです。作成者は、クラスをネストしないようにするよりも使いにくく、設計が貧弱だと感じたためです。

于 2009-07-22T20:46:16.183 に答える
-2

Page クラスのコンテキスト外で使用される可能性がある場合、ネストされたクラスのアイデアが気に入らないようです。

私は個人的には原則としてそれに同意しますが、それが望ましいかもしれないいくつかの例外を想像することができます.

于 2009-07-22T20:46:39.753 に答える