Вот объяснение правила, что это я пытаюсь понять. Вот упрощенный код, на который жаловался Анализатор кода:
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
Если перечисление принадлежит только классу, почему это - плохая вещь сделать это содержавшим типом в классе? Кажется более опрятным мне...
Кто-либо знает то, что предназначено следующей строкой?:
Вложенные типы включают понятие членской доступности, которую некоторые программисты не понимают ясно
Используя Пространства имен для группировки Класса и Перечисления не походит на полезный способ разрешить это предупреждение, так как я хотел бы, чтобы оба перечисление принадлежали тому же родительскому уровню как имя класса.
В дополнение к проблемам удобства использования и обнаруживаемости, уже рассмотренным в других ответах, существует также потенциальная проблема удобства сопровождения. Что произойдет в тот день, когда вы обнаружите, что ваше перечисление также потенциально полезно в другом месте? Перемещение его из родительского класса было бы разрушающим изменением, копирование создало бы свои собственные проблемы с поддержкой, а требование к потребителям API использовать его с другим классом начинает становиться некрасивым. Почему бы не избежать этих потенциальных проблем, систематически избегая вложенных перечислений?
.Думаю, это указывает, что вложенный тип можно спутать со статической переменной, потому что они оба появятся в 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, если он вам не нравится, не используйте его, просто уходите вперед и отключите предупреждения. Вы, безусловно, можете использовать большие имена классов вместо пространств имен, это просто ваш выбор. Но хорошие навыки программирования связаны с тем, как другие воспринимают ваш код, а не с тем, что вам нравится !!!
И пространства имен существуют для организации, и, организовывая, мы печатаем меньше, вот и все, что касается выполнения большей работы с меньшими усилиями. Но если вам нравится печатать громкие имена, вам никто не мешает.
Перечисления обычно не помещаются в класс, который их использует, поэтому люди не привыкли указывать, где находится перечисление:
Dim speed As New CustomerSpeed(CustomerSpeed.ProfitTypeEnum.FlatAmount)
Размещение перечисления вне класс упрощает использование:
Dim speed As New CustomerSpeed(ProfitTypeEnum.FlatAmount)
Перечисление по-прежнему содержится в том же пространстве имен, что и класс. Как указано в объяснении анализа, вы должны использовать пространства имен для группировки общедоступных членов, а не вкладывать их друг в друга.