Contract.Assert
次のようなコードを含むコードを見たことがあります。
Contract.Assert(t != null);
使用Contract.Assert
すると本番コードに悪影響がありますか?
Contract.Assert
次のようなコードを含むコードを見たことがあります。
Contract.Assert(t != null);
使用Contract.Assert
すると本番コードに悪影響がありますか?
の実行時の利点に加えて、コントラクトが定義されていないレガシー コードを呼び出すときに(マニュアルContract.Assert
セクション 2.5 ページ 11)を使用する代替手段を検討することもできます。また、静的な警告レベルを高く (例: 静的チェック レベルまたは- レベル 3+ -オン)。Contract.Assume
more warnings
all warnings
Show 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