Кодовые контракты и исключительная ситуация - PullRequest
2 голосов
/ 17 февраля 2011

Я пытаюсь понять преимущества Code Contracts.Я написал следующий код (из введения в PEX + Code Contract), чтобы выкопать его.

public static string TrimAfter(string value, string suffix)
        {
            // <pex>
            Contract.Requires(suffix != (string)null);
            Contract.Requires
                (value.IndexOf(suffix) >= 0 && value.Length >= value.IndexOf(suffix));
            Contract.Requires(value != (string)null);
            // </pex>

            int index = value.IndexOf(suffix);
            if (index < 0)
                return value;

            return value.Substring(0, index);
        }

Я вызвал этот метод с нулевыми аргументами, и он был скомпилирован.Так что мне не понятно, почему это лучше, чем бросать исключения.Ребята, не могли бы вы объяснить, есть ли у Code Contracts какие-либо дополнительные функции?:) Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 13 декабря 2011

В дополнение к другим сделанным пунктам контракты могут применяться к интерфейсам (вы не могли бы сделать это с обычными исключениями) и принудительно наследоваться (что-то еще, что вам будет очень трудно делать с обычными исключениями).1001 *

2 голосов
/ 17 февраля 2011
  1. В зависимости от вашей версии VS (Premium или Ultimate, если я правильно помню), вы можете получить проверку во время компиляции.Проблема с этим состоит в том, чтобы сделать статическую проверку счастливой.И я не уверен, стоит ли это усилий для большинства программ.Но, возможно, ограниченное подмножество, такое как нулевые проверки, может хорошо работать.
  2. Возможно автоматически сгенерировать документацию из него.
  3. Это более короткий код, повышающий вероятность его использования людьми.Главное для меня.Я ленивый, и если написание чеков становится легче, я с большей вероятностью добавлю дополнительные чеки.В частности, я обнаружил, что аргумент старого стиля null проверяет немного многословно.
  4. Вы можете указать исключение, если хотите, так что вы получите то же поведение, что и со старыми проверками.

С другой стороны, нетрудно разобрать IL, распознающий старый стандартный шаблон для проверок предварительных условий, и использовать его для создания документации.

1 голос
/ 17 февраля 2011

Я собираюсь угадать, но из документов:

Надстройка Visual Studio позволяет указать уровень анализа кода, который будет выполняться. Анализаторы могут подтвердить, что контракты правильно сформированы (проверка типов и разрешение имен) и могут создавать скомпилированную форму контрактов в формате промежуточного языка Microsoft (MSIL). Создание контрактов в Visual Studio позволяет вам использовать преимущества стандартного IntelliSense, предоставляемого инструментом.

Инструменты доступны здесь .

1 голос
/ 17 февраля 2011

Чтобы не дать ему скомпилироваться, вам нужна версия кода контрактов Premium со статической проверкой: http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx

...