С# Каков наилучший способ создания перечисления, который используется несколькими классами?

У меня есть перечисление, которое используется несколькими классами. Каков наилучший способ реализовать это?

Ответ 1

  • Поместите перечисления в пространство имен (или создайте для них новое пространство имен) или
  • Поместите их в класс (static?), если это имеет смысл.

Я бы сохранил их в своем собственном файле для легкого доступа и хорошей организации в любом случае.

Обычно я не ставил их в класс, если они каким-то образом "не принадлежат". Как и у вас есть класс Car с перечислением для типов автомобилей, а также класс Road и Bridge, который может устанавливать ограничения на типы автомобилей. Car.CarType кажется логической организацией для этого...

Ответ 2

Обычно я просто бросаю их в пространство имен. Это то, что Microsoft написали .NET framework, так что я тоже делаю, для согласованности вы понимаете:)

Ответ 3

Поместите его в свой собственный файл и просто объявите его:

public enum Foo {a, b, c, d}

Разумеется, рассмотрите пространство имен.

Ответ 4

Поддержка комментариев XML, особенно если другие будут использовать его

 /// <summary>
/// Defines the types of cars we support
/// </summary>
public enum CarType
{
    /// <summary>
    /// VW - the peoples car
    /// </summary>
    Volkswagen,

Ваше имя перечисления должно быть множественным (согласно инструкциям FxCop)

public enum CarTypes

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

    Volkswagen = 1,

    /// <summary>
    /// They own lambo... can't be all that bad
    /// </summary>
    Audi = 2,

    /// <summary>
    /// Good, cheap, reliable
    /// </summary>
    Toyota = 4,

Ответ 5

Здесь приведен пример наличия двух перечислений в разных пространствах имен:

using TotallyDifferentNameSpace.Enums;

namespace EnumEx
{
    class Program
    {
        static void Main(string[] args)
        {
            CarType car = CarType.Audi;
            PetrolType pType = PetrolType.Diesel;
        }
    }

    public enum CarType
    {
        Volkswagen,
        Audi,
        Toyota,
        Ford,
        Porsche,
        Lada
    }
}

namespace TotallyDifferentNameSpace.Enums
{
    public enum PetrolType
    {
        Gasoline,
        Diesel
    }
}

Ответ 6

Вы можете поместить enum в новый код с расширением .cs, чтобы intellisense работал, убедитесь, что его часть вашего проекта/решения и, конечно же, должна быть общедоступным enum, так что у вас есть область решений для него. Если intellisense является проблемой, убедитесь, что вы создали свое решение один раз, у меня была эта проблема один раз, и только перестройка решила его. Пространство имен - хороший вариант, если вы хотите правильно упорядочить свой код и кодируете большой проект. Рамка .NET была большой. поэтому он имеет перечисления в пространствах имен только для лучшего понимания и организации кода.

Ответ 7

Я знаю, что мое предложение противоречит соглашениям .NET Naming, но я лично префикс перечислений с "E" и флажками enum с "F" (подобно тому, как мы префикс Interfaces с "I" ). Я действительно не понимаю, почему это не конвенция. Enums/Flags - особый случай, как интерфейсы, которые никогда не изменят свой тип. Он не только дает понять, что это такое, но очень легко вводить intellisense, поскольку префикс будет фильтровать большинство других типов/переменных/и т.д., И вы не будете сталкиваться с этими именованиями.

И это также решит другую проблему, где для примеров в WPF они используют статические классы, такие как перечисления (например, FontWeights), которые имеют предварительно определенные экземпляры типов, но вы не знаете, не ищете ли вы их. Если они просто префикс их "E", все, что вам нужно сделать, это набрать символ, чтобы найти эти специальные статические классы.

Ответ 8

Мой совет - не использовать Enums вообще. Вместо этого используйте синглтоны.

Как

    public class A : ISomeInterface
    {
        public static readonly A Instance = new A();
        private A()
        {
        }

    }

    public class B : ISomeInterface
    {
        public static readonly B Instance = new A();
        private B()
        {
        }
    }

В большинстве случаев это работает лучше и лучше распространяется позже.

С наилучшими пожеланиями

Матец