Есть ли лучший способ проверить правильность значений? - PullRequest
0 голосов
/ 11 декабря 2010

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

Вот что я делаю сейчас, и я 'Я уверен, что должен быть лучший способ.

public void SetValue(int value)
{
    if(value != 1 || 
        value != 4 || 
        value != 8 || 
        value != 16 || 
        value != 32 || 
        value != 64, || 
        value != 128)
    {
        property_value = 1;
    }
    else
    {
        property_value = value;
    }
}

Ответы [ 7 ]

5 голосов
/ 11 декабря 2010

Вместо int используйте Enum с этими значениями.

Я уверен, что каждое значение имеет конкретное значение - выставьте их как члены enum.

Это может не устранить все проблемы (поскольку Enum является просто оберткой над целочисленным типом и все же может получить присвоенное значение, которого нет в перечислении), но должно позаботиться о большинстве проблем, так долго поскольку вы согласны только с передачей значений из самого перечисления.

В любом случае, вы можете просто проверить переданное значение по отношению к перечислению и выдать исключение, если оно не является действительным членом.

4 голосов
/ 11 декабря 2010

Используйте перечисление вместо этих числовых значений, таких как:

enum Numbers { Name1 = 1, Name2 = 4 ... }

и затем вы можете легко проверить, является ли значение одним из элементов перечисления:

Enum.IsDefined(typeof(Numbers), value );
2 голосов
/ 11 декабря 2010

Я думаю, вы должны рассмотреть возможность использования enum:

public enum MyEnum
{
    These,
    Are,
    Valid,
    Values
}


public void SetValue(MyEnum _value)
{
   // Only MyEnum values allowed here!
}
2 голосов
/ 11 декабря 2010

Для вашего примера вы можете просто сделать:

property_value = 1;

, поскольку ваше условие if всегда будет истинным.

Если вы хотите ограничить его рядом возможностей, вы можете:

Объявить перечисление:

public enum Value
{
    Default = 1,
    Option1 = 4,
    ...
}

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

int[] validValues = new int[] { 1, 4, 8, 16, 32, 64, 128 };
property_value = validValues.Contains(value) ? value : 1;

Хотя я бы предпочел выдать исключение при неверном вводе.

1 голос
/ 11 декабря 2010

Вы можете использовать enum и проверить, используя Enum.IsDefined(value). Но тогда вам придется подумать о (значащем) имени для всех возможных значений.

1 голос
/ 11 декабря 2010
if(((value & (value − 1)) == 0) && value != 2 && value <= 128)
  property_value = 1;
else
  property_value = value;

(value & (value − 1)) - быстрый способ проверить, является ли value степенью двойки.

Например: value = 4:

(4(10) & (3(10)) =
100(2) & 011(2) =
000(2) = 0

value =5

(5(10) & (4(10)) =
101(2) & 100(2) =
100(2) =
4
0 голосов
/ 11 декабря 2010

Я думаю, что нам не хватает намерения функции здесь.

Это выглядит как проверка битовой маски для меня. Если это так, он пропускает 2 из примера кода. Также обратите внимание, что он не сбрасывает значение, если оно не является одним из этих конкретных битов: он сохраняет его. Если это равно значению, равному определенному биту (и только этому биту), он приводит его к 1.

Я думаю, что образец, предоставленный Ли, лучше всего работает в этом случае; все просто и точно. Кроме того, если проверка расширена для учета 16 бит (или даже 32), она легко перехватит их все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...