Как запретить Code Contracts автоматически создавать проверки предварительных условий? - PullRequest
2 голосов
/ 28 ноября 2011

Я столкнулся со странным поведением с Microsoft Code Contracts, которое не понимаю и не знаю, как решить.

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

Например, это мой оригинальный код:

public override void WriteRaw(string data)
{
    this.writer.WriteRaw(data);
}

Этото, что я вижу, когда декомпилирую свою сборку с помощью Reflector:

public override void WriteRaw(string data)
{
    __ContractsRuntime.Requires(string.IsNullOrEmpty(data) == 0, null, "!string.IsNullOrEmpty(data)");
    this.writer.WriteRaw(data);
Label_0028:
    return;
}

Даже после исчерпывающего исследования и анализа моего кода, лучший диагноз, который я могу поставить, заключается в том, что это происходит только в классе, который наследует / реализуетреферат System.Xml.XmlWriter.Во всех остальных случаях контракты будут заключаться только в том случае, если я добавлю их вручную.

В 99% случаев я бы приветствовал автоматическую проверку аргументов по контрактам кода (при условии, что я могу контролировать это).Но рассматриваемый код является записывающим XML-модулем записи, который используется XslCompilerTransform для пропуска надлежащего XHTML.И если таблица стилей XSL содержит что-то вроде <xsl:value-of select="xyz" disable-output-escaping="yes"/>, где xyz не существует, из-за автоматически сгенерированного контракта преобразование заканчивается ненужным исключением, которое я не могу обойти, если полностью не отключу контракты.

Есть ли у кого-нибудь опыт с этим и может указать мне правильное направление?

Спасибо, Игорь

1 Ответ

4 голосов
/ 28 ноября 2011

Контракты применяются к абстрактному интерфейсу XmlWriter.Это можно увидеть, посмотрев справочную сборку контракта в каталоге установки контрактов кода (на моем компьютере он находится в C: \ Program Files (x86) \ Microsoft \ Contracts \ Contracts.NETFramework \ v4.0) в Reflector.Когда вы переопределяете виртуальный / абстрактный метод или метод интерфейса, к которым применены контракты, они автоматически вплетаются в ваш код.

Контракт для WriteRaw:

public virtual void WriteRaw(string data)
{
    Contract.Requires(!string.IsNullOrEmpty(data), null, "!string.IsNullOrEmpty(data)");
}

Насколько я знаю, его нельзя отключить, не отключив проверку контракта.

...