код пропускает контракт.Требуется

#c# #code-contracts #invariants

#c# #код-контракты #инварианты

Вопрос:

Я пытаюсь написать этот метод, используя контракты c #…но при отладке он полностью игнорирует Contract.requires и CheckRep() Я использую это неправильно??

     public Poly Add(Poly q)
    {
        CheckRep();
        Contract.Requires(q != null, "You need to provide a valid non-null Poly.");

        Poly la, sm;

        if (deg > q.deg)
        {
            la = this; sm = q;
        }
        else
        {
            la = q; sm = this;
        }

        int newdeg = la.deg;

        if (deg == q.deg)
        {
            for (int k = deg; k > 0; k--)
            {
                if (trms[k]   q.trms[k] != 0)
                {
                    break;
                }
                else
                {
                    newdeg--;
                }
            }
        }

        Poly r = new Poly(newdeg);

        int i;

        for (i = 0; i <= sm.deg amp;amp; i <= newdeg; i  )
        {
            r.trms[i] = sm.trms[i]   la.trms[i];
        }
        for (int j = i; j <= newdeg; j  )
        {
            r.trms[j] = la.trms[j];
        }

        return r;
    }
  

Ответ №1:

Это должно быть:

   public Poly Add(Poly q)
    {
        Contract.Requires(q != null, "You need to provide a valid non-null Poly.");
        CheckRep();
  

Из MSDN:

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

  2. Этот контракт доступен для клиентов; поэтому он должен ссылаться только на элементы, которые по крайней мере так же видны, как и заключающий метод.

  3. Используйте этот метод вместо контракта.Требуется (логический, строковый) метод, когда вы хотите создать исключение, если предварительное условие не выполняется.

Вы также должны активировать проверку во время выполнения. Щелкните правой кнопкой мыши на вашем проекте-> свойства. Нажмите «Code Contracts» в меню слева. Проверьте «Выполнить проверку контактов во время выполнения»

Комментарии:

1. Сейчас это работает, однако мой контракт выдает ContractException….is это потому q , что равно нулю? как еще я могу проверить q ?

2. @DoctorOreo Что вы имеете в виду? При нарушении выдается контракт ContractException

3. Это просто говорит о необработанном ContractException .. хорошо, может быть, так и должно быть.

4. @DoctorOreo Он не обрабатывается, если вы его не поймаете

5. Но также вы не должны перехватывать ContractException s.