Что сделать при использовании Контракта. Утверждайте (верный), и метод должен возвратить что-то?

У меня есть немного кода со следующей логикой:

//pseudo-code
foreach (element in elementList) {
    if (element is whatever)
        return element;
    }
}

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

//pseudo-code
foreach (element in elementList) {
    if (element is whatever)
        return element;
    }
}

Contract.Assert(false, "Invalid state!");

Проблема состоит в том, что, поскольку этот метод должен возвратить что-то, и компилятор не понимает, что утверждение повредит выполнение программы. Перед использованием Контрактов, в подобных ситуациях, я раньше выдавал Исключение, которое решило проблему. Как Вы обработали бы это с Контрактом. Утверждать ()? Возврат пустого указателя или значения по умолчанию (element_type) после Контракта. Утверждайте () вызов, зная, что это никогда не будут называть и закрытие компилятора? Или есть ли какой-либо другой более изящный способ сделать это?

Спасибо

5
задан devoured elysium 3 August 2010 в 15:47
поделиться

1 ответ

Вы можете использовать

var result = null;
foreach (element in elementList) {
    if (element is whatever)
        result = element;
        break;
    }
}

Contract.Assert(result != null, "Invalid state!");
return result;

Он вводит разрыв, но выглядит чище вокруг возврата.

Еще чище было бы

return elementList.Where( e => e is whatever).First();

Edit, как отметил @devoured, вышеупомянутый вариант будет бить по всему списку

чище без where

return elementList.First( e => e is whatever);

end edit

Это просто взорвется, если ничего не найдено.

Но если вам действительно нужен assert, это может быть

var results = elementList.Where( e => e is whatever);
Contract.Assert(results.Count() == 1, "Boo");
return results.First();

но это тоже будет итерация всего списка.

2
ответ дан 15 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: