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

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

ПОЧЕМУ

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

ГДЕ

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

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

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

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

РЕЗУЛЬТАТ

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

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

Также enum обратите внимание, что этот enum метод почти так же быстр, как validation и обычный, если "<" ">" на c# обычных int32 (которые набрали enumerations 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;
}

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

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

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

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

От enums самого медленного к самому enum быстрому с округленными результатами, надеюсь, без c#-language опечаток.

Границы, определенные в методе = 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 validation = 1 800 000 тиков
Примечание: эта c-sharp версия кода не ограничивает c-sharp минимальное / максимальное form-validation значение, но возвращает значение .cs-file по умолчанию, если оно выходит visual-c# за границы.

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() Мин. / Макс. Константы enums = 43 000 тиков = победитель validation в 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