Вопрос

Я использую анализ статического кода с FXCOP 1.36 и продолжаю получать Предупреждение CA1034: IndestTypesshouldnotBevisible.

Я бы понял, если бы родительский класс был объявлен внутренним или частным, но он общедоступен. Почему было бы плохо, чтобы 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 предоставляет вам предупреждение. Если хотите, вы можете игнорировать это. Лично я бы оставил свои вложенные типы частными. Если я ожидаю, что вызывающий абонент будет использовать этот тип, я перемесчу их в правильное пространство имен.

Другие советы

Это потому, что ваш делегат является типом, но он определяется в классе страницы. Я бы просто определил его в компании. Если бы вы писали API, это просто сделало бы его немного грязным, вот и все.

Кроме того, немного странно возвращать делегата, но я думаю, я не знаю, чего вы пытаетесь достичь.

Почему было бы плохо, чтобы Timerreset объявили публику?

Именно так Описание государства:

Вложенные типы полезны для инкапсуляции деталей частной реализации содержащегося типа. Для этой цели вложенные типы не должны быть внешне видны.

Поскольку вы обнажаете TimerResetDelegate публично с TimerReset, Я думаю, это не деталь реализации.

Не используйте внешне видимые вложенные типы для логической группировки или чтобы избежать столкновений имен; Вместо этого используйте пространства имен.

Что заставляет это выглядеть так, как будто вы используете вложенный тип для группировки. Как утверждает FXCOP, вместо этого используйте пространство имен.

Вложенные типы включают понятие доступности члена, которое некоторые программисты не понимают ясно.

С TimerResetDelegate это делегат, это на самом деле не относится.

Шаг TimerResetDelegate в собственный файл timeresetdelegate.cs и поместите его в свой Company.App.Thing Пространство имен. Тогда это больше не вложено.

Конечно, было бы еще лучше просто пойти с Обработчик события Вместо определения вашего собственного типа делегата.

ИМХО, это правило FXCOP, которое можно игнорировать.

Нет ничего плохого от уровня CLR с вложенным классом. Это всего лишь правило руководства, добавленное в FXCOP, потому что авторы чувствовали, что оно было менее полезным или более плохим дизайном, чем сделать класс без завязки.

По -видимому, ему не нравится идея вложенных классов, когда они могут быть использованы вне контекста вашего класса страницы.

Я лично согласен с этим в принципе, хотя я могу представить некоторые исключения, где это может быть желательно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top