CA1034: Вложенные типы не должны быть видимы

Вот объяснение правила, что это я пытаюсь понять. Вот упрощенный код, на который жаловался Анализатор кода:

Public Class CustomerSpeed

    Public Enum ProfitTypeEnum As Integer
        NotSpecified = 0
        FlatAmount = 1
        PercentOfProfit = 2
    End Enum

    Private _ProfitTypeEnum As ProfitTypeEnum

    Public Sub New(ByVal profitType As ProfitTypeEnum)

        _ProfitTypeEnum = profitType

    End Sub

End Class

Если перечисление принадлежит только классу, почему это - плохая вещь сделать это содержавшим типом в классе? Кажется более опрятным мне...

Кто-либо знает то, что предназначено следующей строкой?:

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

Используя Пространства имен для группировки Класса и Перечисления не походит на полезный способ разрешить это предупреждение, так как я хотел бы, чтобы оба перечисление принадлежали тому же родительскому уровню как имя класса.

6
задан ChadD 4 May 2010 в 05:39
поделиться

3 ответа

В дополнение к проблемам удобства использования и обнаруживаемости, уже рассмотренным в других ответах, существует также потенциальная проблема удобства сопровождения. Что произойдет в тот день, когда вы обнаружите, что ваше перечисление также потенциально полезно в другом месте? Перемещение его из родительского класса было бы разрушающим изменением, копирование создало бы свои собственные проблемы с поддержкой, а требование к потребителям API использовать его с другим классом начинает становиться некрасивым. Почему бы не избежать этих потенциальных проблем, систематически избегая вложенных перечислений?

.
4
ответ дан 9 December 2019 в 22:30
поделиться

Думаю, это указывает, что вложенный тип можно спутать со статической переменной, потому что они оба появятся в intellisense (автозаполнение) после ".".

Даже если вы видите BCL (библиотеку базовых классов) .NET, все перечисления, даже если они используются только в одном классе, не вложены, причина в том, что когда вы хотите сравнить или создать экземпляр, имена классов + "." + имена перечислений будут сбивать с толку, как показано ниже, также Microsoft права в том, что это запутает людей.

- Пример

class RootClass
{
   enum NestedEnum
   {
      StaticItem = 0     
   }

   static string NestedString = "";
}


RootClass.NestedEnum <-- represents enum,
RootClass.NestedString <-- represents static variable

Один тип, а другой - переменный, большинство предупреждений MS Code Analyzer предназначены для лучшего дизайна, однако у него есть большое исключение для @George, если он вам не нравится, не используйте его, просто уходите вперед и отключите предупреждения. Вы, безусловно, можете использовать большие имена классов вместо пространств имен, это просто ваш выбор. Но хорошие навыки программирования связаны с тем, как другие воспринимают ваш код, а не с тем, что вам нравится !!!

И пространства имен существуют для организации, и, организовывая, мы печатаем меньше, вот и все, что касается выполнения большей работы с меньшими усилиями. Но если вам нравится печатать громкие имена, вам никто не мешает.

1
ответ дан 9 December 2019 в 22:30
поделиться

Перечисления обычно не помещаются в класс, который их использует, поэтому люди не привыкли указывать, где находится перечисление:

Dim speed As New CustomerSpeed(CustomerSpeed.ProfitTypeEnum.FlatAmount)

Размещение перечисления вне класс упрощает использование:

Dim speed As New CustomerSpeed(ProfitTypeEnum.FlatAmount)

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

6
ответ дан 9 December 2019 в 22:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: