4

私はこのような方法を作りました

class PersonCollection
{
  [Contracts.CanReturnNull]  //dont know if something like this exists?
  IPerson GetPerson(Guid personId)
  {
       if (this.persons.Contains(personId))
            return this.persons[personId];
       else
            return null;
  }
}

ここで、呼び出し元のコードで null 値を適切に処理する必要があります。このメソッドによって返される null 値を処理できるようにする必要があるすべての呼び出し元の契約を表現する方法はありますか?

PersonCollection pc = new PersonCollection();
IPerson p = pc.GetPerson(anyId);
p.Name = "Hugo";  // here I want to have a curly line

私が望むのは、 p が潜在的な問題としてマークされることです。

編集 コードを変更し、呼び出しコードと予想される動作を追加しました。また、メソッド GetPerson におそらく存在しない属性を追加しました

4

2 に答える 2

2

コードコントラクトはそのような機能を提供しませんし、C#も提供しません

コードコントラクトは、呼び出されたメソッドの開始時に特定の制約に従うことのみを呼び出し元に要求します。これらは、いわゆる前提条件です。事後条件は呼び出し先の責任であり、呼び出されたメソッドの終了時にプログラムの状態がどうなるかを定義します。

契約による設計は、これらの責任を定義する方法であり、呼び出されたメソッドによって引き起こされる特定の条件をどのように処理するかを呼び出し元に指示するものではありません。

于 2011-06-08T13:56:03.297 に答える
1

(コメントを読んだ後)あなたが望むと思われることは、デフォルトで起こります:

呼び出し元のコードでコード コントラクトを有効にすると、検証者は の戻り値GetPerson()が null になる可能性があると見なします。そう:

IPerson GetPerson(Guid personId)
{
   // no pre/post conditions
}

void PrintPerson(IPerson p)
{
   Contract.Requires(p != null);
   ...
}

void Foo()
{
     var p = GetPerson(id);
     PrintPerson(p);    // a warning here: can not verify p != null
}

そして、質問とはまったく関係ありませんが、persons が(のような)Dictionary である場合、これは通常より効率的です。

IPerson GetPerson(Guid personId)
{
   Person p = null;

   this.persons.TryGetValue(personId, out p);
   return p;
}
于 2011-06-08T21:42:57.343 に答える