0

Contract.Assert次のようなコードを含むコードを見たことがあります。

Contract.Assert(t != null);

使用Contract.Assertすると本番コードに悪影響がありますか?

4

3 に答える 3

1

の実行時の利点に加えて、コントラクトが定義されていないレガシー コードを呼び出すときに(マニュアルContract.Assertセクション 2.5 ページ 11)を使用する代替手段を検討することもできます。また、静的な警告レベルを高く (例: 静的チェック レベルまたは- レベル 3+ -オン)。Contract.Assumemore warningsall warningsShow Assumptions

Contract.Assumeと同じ実行時の利点Contract.Assertが得られますが、従来のアセンブリのために証明できない静的チェックも抑制されます。

たとえば、以下のコードでは、静的チェックを有効にし、警告をレベル 3 に設定するwarning : CodeContracts: requires unproven: someString != nullと、MethodDoesNotAllowNull

 var aString = Legacy.MethodWithNoContract();
 MethodDoesNotAllowNull(aString); 

  private void MethodDoesNotAllowNull(string someString)
  {
     Contract.Requires(someString != null);
  }

レガシ アセンブリ コードの場合:

  public static string MethodWithNoContract()
  {
     return "I'm not really null :)";
  }

Assume警告を抑制します (ただし、デバッグ ビルドではランタイム アサートの利点が得られます)。

 var aString = LegacyAssembly.LegacyMethodWithNoContract();
 Contract.Assume(aString != null);
 MethodDoesNotAllowNull(aString);

このようにして、デバッグ ビルドのempirical実行時の利点を引き続き得ることができます。Contract.Assert

于 2013-08-28T11:20:26.553 に答える