Как я могу безопасно бросить систему.Возражаете против 'bool' в C#?



я извлекаю bool значение из коллекции (не универсальной, гетерогенной).



The as оператор может использоваться только со ссылочными типами, поэтому невозможно использовать as чтобы попробовать безопасное приведение к bool:



// This does not work: "The as operator must be used with a reference type ('bool' is a value type)"
object rawValue = map.GetValue(key);
bool value = rawValue as bool;


есть что-то подобное, что можно сделать, чтобы безопасно привести объект к типу значения без возможности InvalidCastException если по какой-либо причине значение не является логическим?

671   7  

7 ответов:

есть два варианта... с немного удивительной производительностью:

  • избыточные проверки:

    if (rawValue is bool)
    {
        bool x = (bool) rawValue;
        ...
    }
    
  • используя тип с нулевым значением:

    bool? x = rawValue as bool?;
    if (x != null)
    {
        ... // use x.Value
    }
    

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

в C# 7, Вы можете использовать сопоставление с образцом для этого:

if (rawValue is bool value)
{
    // Use value here
}

обратите внимание, что вы в конечном итоге с value в рамках (но не обязательно назначенный) после if заявление.

такой:

if (rawValue is bool) {
    bool value = (bool)rawValue;
    //Do something
} else {
    //It's not a bool
}

В отличие от ссылочных типов, нет быстрого способа попытаться привести к типу значения без двух приведений. (Или блок catch, что было бы хуже)

bool value;
if(rawValue is bool)
  value = (bool)rawValue;
else {
  // something is not right...

вы можете бросить его в bool? с as ключевое слово и проверьте HasValue собственность.

вы не определили, что вы хотите, чтобы произошло, если rawValue не конвертируется в bool. Общие варианты-вернуть false, null или создать исключение. Существует также возможность преобразования строкового представления rawValue в bool, например Yes/No, True/False, 1/0 и т. д.

Я бы использовал bool.Попробуйте сделать преобразование. Это будет успешно, если rawValue является bool или его строковое значение "True"или " False".

bool result;
if (!bool.TryParse(rawValue as string, out result))
{
    // you need to decide what to do in this case
}

при условии, что вам на самом деле не нужно держать ссылку на rawValue, вот один-лайнер с помощью GetValueOrDefault() метод Nullable<T> структура:

bool value = (map.GetValue(key) as bool?).GetValueOrDefault();

вы также можете указать значение по умолчанию с помощью метода перегрузки GetValueOrDefault(T).

вы также можете попробовать конвертировать.ToBoolean(rowValue);

Comments

    Ничего не найдено.