ContractArgumentValidatorAttribute ContractArgumentValidatorAttribute ContractArgumentValidatorAttribute ContractArgumentValidatorAttribute Class

Definizione

Consente di eseguire il factoring del codice if-then-throw legacy in metodi separati da riutilizzare e fornisce il controllo completo sulle eccezioni e sugli argomenti generati.Enables the factoring of legacy if-then-throw code into separate methods for reuse, and provides full control over thrown exceptions and arguments.

public ref class ContractArgumentValidatorAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false)]
[System.Diagnostics.Conditional("CONTRACTS_FULL")]
public sealed class ContractArgumentValidatorAttribute : Attribute
type ContractArgumentValidatorAttribute = class
    inherit Attribute
Public NotInheritable Class ContractArgumentValidatorAttribute
Inherits Attribute
Ereditarietà
ContractArgumentValidatorAttributeContractArgumentValidatorAttributeContractArgumentValidatorAttributeContractArgumentValidatorAttribute
Attributi

Commenti

Se il codice utilizza il codice esplicito if-then-throw per convalidare i parametri, è possibile utilizzare i metodi di supporto che eseguono controlli e generano eccezioni specifiche in caso di errore, come illustrato nell'esempio seguente.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.

using System;

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

public class Example
{
   public void Execute(string value) 
   {
      ValidationHelper.NotNull(value, "value");
      
      // Body of method goes here.
   }
}
Class ValidationHelper 
   Public Shared Sub NotNull(argument As Object, parameterName As String) 
      If argument Is Nothing Then 
         Throw New ArgumentNullException(parameterName, 
                                         "The parameter cannot be null.")
      End If
   End Sub
End Class

Module Example
   Public Sub Execute(value As String)
      ValidationHelper.NotNull(value, "value")
      
      ' Body of method goes here.
   End Sub
End Module

In questo esempio, Execute dispone una precondizione elettiva in cui viene specificato che il valore del parametro non deve essere null.In this example, Execute has an elective precondition specifying that the parameter value should not be null. Per abilitare gli strumenti dei contratti per riconoscere che la chiamata a ValidationHelper.NotNull rappresenta un contratto, è possibile contrassegnare il metodo chiamato con il ContractArgumentValidatorAttribute attributo.To enable the contract tools to recognize that the call to ValidationHelper.NotNull represents a contract, you can mark the called method with the ContractArgumentValidatorAttribute attribute. Il Contract.EndContractBlock chiamata al metodo deve essere utilizzata per attivare gli strumenti necessari per estrarre le specifiche appropriate per la generazione di documenti e controllo statico, come indicato di seguito.The Contract.EndContractBlock method call should be used to enable the tools to extract the proper specifications for document generation and static checking, as follows.

using System;
using System.Diagnostics.Contracts;

static class ValidationHelper 
{
   [ContractArgumentValidator]
   public static void NotNull(object argument, string parameterName) 
   {
      if (argument == null) throw new ArgumentNullException(parameterName, 
                                                            "The parameter cannot be null.");
      Contract.EndContractBlock();
   }
}
Imports System.Diagnostics.Contracts

Class ValidationHelper 
   <ContractArgumentValidator> 
   Public Shared Sub NotNull(argument As Object, parameterName As String) 
      If argument Is Nothing Then 
         Throw New ArgumentNullException(parameterName, 
                                         "The parameter cannot be null.")
         Contract.EndContractBlock()
      End If
   End Sub
End Class

Oltre alle istruzioni if-then-throw, la sezione del contratto relativa ai metodi di convalida del contratto può contenere chiamate ad altri metodi di convalida del contratto.In addition to if-then-throw statements, the contract section of contract validator methods may contain calls to other contract validator methods. Tuttavia, non sono consentiti altri contratti, ad esempio Contract.Requires o Contract.Ensures.However, no other contracts (such as Contract.Requires, or Contract.Ensures) are allowed. Il codice che segue il Contract.EndContractBlock chiamata viene ignorata da tutti gli strumenti di contratto.Code that follows the Contract.EndContractBlock call is ignored by all contract tools.

L'esempio seguente mostra un validator degli argomenti intervallo scritto in termini di un oggetto esistente NotNull metodo di convalida.The following example shows a range argument validator written in terms of an existing NotNull validator method.

using System;
using System.Diagnostics.Contracts;

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

   [ContractArgumentValidator]
   public static void InRange(object[] array, int index, string arrayName, string indexName)
   {
      NotNull(array, arrayName);
      
      if (index < 0) 
         throw new ArgumentOutOfRangeException(indexName, 
                                               "The index cannot be negative.");
      if (index >= array.Length) 
         throw new ArgumentOutOfRangeException(indexName, 
                                               "The index is outside the bounds of the array.");                                                     
      Contract.EndContractBlock();
   }
}

public class Example
{
   public void Execute(object[] data, int position) 
   {
      ValidationHelper.InRange(data, position, "data", "position");

      // Body of method goes here.
   }
}
Imports System.Diagnostics.Contracts

Class ValidationHelper 
   <ContractArgumentValidator> 
   Public Shared Sub NotNull(argument As Object, parameterName As String) 
      If argument Is Nothing Then 
         Throw New ArgumentNullException(parameterName, 
                                         "The parameter cannot be null.")
         Contract.EndContractBlock()
      End If
   End Sub

   <ContractArgumentValidator>
   Public Shared Sub InRange(array() As Object, index As Integer, 
                             arrayName As String, indexName As String)
      NotNull(array, arrayName)
      
      If index < 0 Then 
         Throw New ArgumentOutOfRangeException(indexName, 
                                               "The index cannot be negative.")
      End If                                         
      If index >= array.Length Then 
         Throw New ArgumentOutOfRangeException(indexName, 
                                               "The index is outside the bounds of the array.")
      End If                                                                                              
      Contract.EndContractBlock()
   End Sub
End Class

Module Example
   Public Sub Execute(data() As Object, position As Integer)
      ValidationHelper.InRange(data, position, "data", "position")
      
      ' Body of method goes here.
   End Sub
End Module

Dal punto di vista, specifica il Execute metodo presenta i seguenti tre contratti:From a specification point of view, the Execute method has the following three contracts:

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

Nei metodi standard le chiamate ai metodi di convalida dei contratti possono essere liberamente combinate con altri contratti come Contract.Ensures o Contract.Requires.In standard methods, calls to contract validator methods can be freely mixed with other contracts such as Contract.Ensures or Contract.Requires.

Costruttori

ContractArgumentValidatorAttribute() ContractArgumentValidatorAttribute() ContractArgumentValidatorAttribute() ContractArgumentValidatorAttribute()

Inizializza una nuova istanza della classe ContractArgumentValidatorAttribute.Initializes a new instance of the ContractArgumentValidatorAttribute class.

Metodi

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Restituisce un valore che indica se questa istanza è uguale a un oggetto specificato.Returns a value that indicates whether this instance is equal to a specified object.

(Inherited from Attribute)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Restituisce il codice hash per l'istanza.Returns the hash code for this instance.

(Inherited from Attribute)
GetType() GetType() GetType() GetType()

Ottiene l'oggetto Type dell'istanza corrente.Gets the Type of the current instance.

(Inherited from Object)
IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute()

In caso di override in una classe derivata, indica se il valore di questa istanza è il valore predefinito per la classe derivata.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(Inherited from Attribute)
Match(Object) Match(Object) Match(Object) Match(Object)

Quando è sottoposto a override in una classe derivata, restituisce un valore che indica se questa istanza equivale a un oggetto specificato.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Inherited from Attribute)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.Returns a string that represents the current object.

(Inherited from Object)

Implementazioni dell'interfaccia esplicita

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Esegue il mapping di un set di nomi a un set corrispondente di ID dispatch.Maps a set of names to a corresponding set of dispatch identifiers.

(Inherited from Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Recupera le informazioni sul tipo relative a un oggetto, che possono essere usate per ottenere informazioni sul tipo relative a un'interfaccia.Retrieves the type information for an object, which can be used to get the type information for an interface.

(Inherited from Attribute)
_Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32)

Recupera il numero delle interfacce di informazioni sul tipo fornite da un oggetto (0 o 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(Inherited from Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fornisce l'accesso a proprietà e metodi esposti da un oggetto.Provides access to properties and methods exposed by an object.

(Inherited from Attribute)

Proprietà

TypeId TypeId TypeId TypeId

Quando è implementata in una classe derivata, ottiene un identificatore univoco della classe Attribute.When implemented in a derived class, gets a unique identifier for this Attribute.

(Inherited from Attribute)

Si applica a