Разница в производительности довольно мала и не окажет заметного влияния на ваш код. Если вы не разрабатываете какую-либо систему торговли акциями в реальном времени, я бы даже не стал беспокоиться об этом.
Что касается отключения кода в Production, я бы предпочел иметь дополнительную защиту контрактов кода вместо какой-то неясной ошибки. Ошибка в контракте кода скажет вам точно, где и почему был нарушен Контракт, в отличие от необходимости копаться в некотором глубоком стеке вызовов только потому, что некоторые неверные данные были переданы на 5 уровнях вверх по дереву стека вызовов.
@ svanryckeghem и @Stephen Cleary:
Если вы используете или планируете использовать Contract.Requires<TException>
и не включаете «Проверка контракта времени выполнения», вы получите ошибку времени выполнения из-за того, что программа перезаписи IL (ccrewrite.exe) должна быть связана с использованием контрактов кода. Затем вам нужно будет включить проверку выполнения контракта, чтобы заставить это работать.
ИМХО, использование Contract.Requires<TException>()
гораздо полезнее, чем Contract.Requires()
, поскольку вы можете контролировать тип создаваемого исключения.