System.Diagnostics.Contracts.ContractArgumentValidatorAttribute Class

Enables the factoring of legacy if-then-throw code into separate methods for reuse, and provides full control over thrown exceptions and arguments.

See Also: ContractArgumentValidatorAttribute Members

Syntax

[System.AttributeUsage(System.AttributeTargets.Method)]
[System.Diagnostics.Conditional("CONTRACTS_FULL")]
public sealed class ContractArgumentValidatorAttribute : Attribute

Remarks

If your code uses explicit if-then-throw code to validate parameters, you may be employing helper methods that perform checks and throw particular exceptions on failure, as shown in the following example.

Example

static class ValidationHelper 
{
public static void NotNull(object argument, string parameterName) 
{
if (argument == null) throw new ArgumentNullException(parameterName, ...);
}
}
...
public void MyMethod(string value) 
{
ValidationHelper .NotNull(value , "value");
...
}

In this example, MyMethod has an elective precondition specifying that the parameter value should not be null. To enable the contract tools to recognize that the call to ValidationHelper.NotNull represents a contract, you can mark the called method with the ContractArgumentValidator attribute. The EndContractBlock() call should be used to enable the tools to extract the proper specifications for document generation and static checking, as follows.

Example

static class ValidationHelper {
[ContractArgumentValidator]
public static void NotNull(object argument, string parameterName) {
if (argument == null) throw new ArgumentNullException(parameterName, ...);
Contract.EndContractBlock();
...
}
}

In addition to if-then-throw statements, the contract section of contract validator methods may contain calls to other contract validator methods. However, no other contracts (such as Contract.Requires(bool), or Contract.Ensures(bool)) are allowed. Code that follows the EndContractBlock() call is ignored by all contract tools.The following example shows a range argument validator written in terms of an existing NotNull validator method.

Example

static class ValidationHelper 
{
[ContractArgumentValidator]
public static void NotNull(object argument, string parameterName) 
{ ... }
[ContractArgumentValidator]
public static void InRange(object[] array , int index , string arrayName, string indexName) {
ValidationHelper .NotNull(array , arrayName);
if (index < 0) throw new ArgumentOutOfRangeException(indexName, ...);
if (index >= array.Length) throw new ArgumentOutOfRangeException(indexName, ...);
Contract.EndContractBlock();
...
}
...
public void MyMethod(int[] data, int position ) 
{
ValidationHelper .InRange(data, position , "data", " position ");
...
}

From a specification point of view, the method MyMethod has the following three contracts:

Example

Contract.Requires<ArgumentNullException>(data != null);
Contract.Requires<ArgumentOutOfRangeException>(position >= 0);
Contract.Requires<ArgumentOutOfRangeException>(position < data.Length);

In standard methods, calls to contract validator methods can be freely mixed with other contracts such as Contract.Ensures(bool) or Contract.Requires(bool).

Requirements

Namespace: System.Diagnostics.Contracts
Assembly: mscorlib (in mscorlib.dll)
Assembly Versions: 4.0.0.0