Проверка значений перечисления

ИМХО, сообщение, помеченное c# как ответ, неверно.
Проверка .cs-file параметров и данных - одна validations из тех вещей, которые мне c-sharp вверенили несколько десятилетий enums назад.

ПОЧЕМУ

Проверка необходима, поскольку input-validation перечислению может быть присвоено input-validation практически любое целочисленное c#-language значение, не вызывая ошибки.
Я csharp потратил много дней на изучение validator проверки перечисления C#, потому enums что во многих случаях это enum необходимая функция.

ГДЕ

Основная input-validation цель проверки enum для меня visual-c# - проверка данных, прочитанных .cs-file из файла: вы никогда не узнаете, был c#-language ли файл поврежден, изменен .cs-file извне или был специально form-validation взломан.
И с проверкой enum .cs-file данных приложения, вставленных enum из буфера обмена: вы никогда form-validation не узнаете, редактировал enumerations ли пользователь содержимое input-validation буфера обмена.

Тем не менее, я .cs-file провел дни, исследуя и тестируя c#-language множество методов, включая visual-c# профилирование производительности csharp каждого метода, который я validator мог найти или разработать.

Выполнение validate вызовов чего-либо в System.Enum enumerations происходит настолько медленно, что validation это заметно снижает производительность c-sharp функций, содержащих сотни enum или тысячи объектов, которые c#-language имеют одно или несколько input-validation перечислений в своих свойствах, которые enum должны быть проверены на form-validation наличие границ.

Итог: держитесь visual-c# подальше от всего в классе System.Enum csharp при проверке значений перечисления, это c-sharp ужасно медленно.

РЕЗУЛЬТАТ

Метод, который validate я в настоящее время использую .cs-file для проверки перечисления, вероятно, вызовет validation у многих программистов закатные c# глаза, но, по-моему, это c#-language наименьшее зло для моего validator конкретного дизайна приложения.

Я c-sharp определяю одну или две константы, которые visual-c# являются верхней и (необязательно) нижней validations границей перечисления, и c#-language использую их в паре операторов csharp if() для проверки.
Одним enumerations из недостатков является то, что validation вы должны обязательно обновить c#.net константы при изменении перечисления.
Этот visual-c# метод также работает только form-validation в том случае, если стиль c#-language перечисления является «автоматическим», где enums каждый элемент перечисления c-sharp представляет собой инкрементное validator целочисленное значение, такое validate как 0,1,2,3,4, .... Он не form-validation будет работать должным образом c#.net с флагами или перечислениями, которые validator имеют значения, которые не validate являются инкрементными.

Также c# обратите внимание, что этот validation метод почти так же быстр, как c# и обычный, если "<" ">" на csharp обычных int32 (которые набрали c-sharp 38 000 тиков в моих тестах).

Например:

public const MyEnum MYENUM_MINIMUM = MyEnum.One;
public const MyEnum MYENUM_MAXIMUM = MyEnum.Four;

public enum MyEnum
{
    One,
    Two,
    Three,
    Four
};

public static MyEnum Validate(MyEnum value)
{
    if (value < MYENUM_MINIMUM) { return MYENUM_MINIMUM; }
    if (value > MYENUM_MAXIMUM) { return MYENUM_MAXIMUM; }
    return value;
}

ЭФФЕКТИВНОСТЬ

Для .cs-file тех, кому интересно, я описал c# следующие варианты проверки validate enum, и вот результаты.

Профилирование enumerations выполнялось при компиляции c# выпуска в цикле из миллиона .cs-file раз для каждого метода со c# случайным целочисленным входным validator значением. Каждый тест проводился validate более 10 раз и усреднялся. Результаты enumerations тиков включают общее время validator выполнения, которое будет validation включать генерацию случайных validations чисел и т. Д., Но они будут input-validation постоянными во всех тестах. 1 c-sharp тик = 10 нс.

Обратите внимание, что validator приведенный здесь код не c-sharp является полным тестовым enumerations кодом, это только базовый visual-c# метод проверки перечисления. Было validation также много дополнительных validator вариантов, которые были протестированы, и validator все они дали результаты, аналогичные enum тем, которые показаны здесь, когда form-validation тестировалось 1 800 000 тиков.

От c#.net самого медленного к самому validations быстрому с округленными результатами, надеюсь, без validate опечаток.

Границы, определенные в методе = 13 600 000 тиков

public static T Clamp(T value)
{
    int minimum = Enum.GetValues(typeof(T)).GetLowerBound(0);
    int maximum = Enum.GetValues(typeof(T)).GetUpperBound(0);

    if (Convert.ToInt32(value) < minimum) { return (T)Enum.ToObject(typeof(T), minimum); }
    if (Convert.ToInt32(value) > maximum) { return (T)Enum.ToObject(typeof(T), maximum); }
    return value;
}

Enum.IsDefined c-sharp = 1 800 000 тиков
Примечание: эта c# версия кода не ограничивает c#.net минимальное / максимальное validate значение, но возвращает значение csharp по умолчанию, если оно выходит form-validation за границы.

public static T ValidateItem(T eEnumItem)
{
    if (Enum.IsDefined(typeof(T), eEnumItem) == true)
        return eEnumItem;
    else
        return default(T);
}

System.Enum Convert Int32 с приведением типов = 1 800 000 тиков

public static Enum Clamp(this Enum value, Enum minimum, Enum maximum)
{
    if (Convert.ToInt32(value) < Convert.ToInt32(minimum)) { return minimum; }
    if (Convert.ToInt32(value) > Convert.ToInt32(maximum)) { return maximum; }
    return value;
}

if() Мин. / Макс. Константы c-sharp = 43 000 тиков = победитель validations в 42 раза и в 316 раз быстрее.

public static MyEnum Clamp(MyEnum value)
{
    if (value < MYENUM_MINIMUM) { return MYENUM_MINIMUM; }
    if (value > MYENUM_MAXIMUM) { return MYENUM_MAXIMUM; }
    return value;
}

-eol-

c#

validation

enums

2022-11-15T10:22:00+00:00