ContractArgumentValidatorAttribute Classe

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.

C#
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false)]
[System.Diagnostics.Conditional("CONTRACTS_FULL")]
public sealed class ContractArgumentValidatorAttribute : Attribute
Ereditarietà
ContractArgumentValidatorAttribute
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.

C#
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.
   }
}

In questo esempio, Execute dispone una precondizione elettiva in cui viene specificato che il valore del parametro non deve essere null. Per abilitare gli strumenti del contratto per riconoscere che la chiamata a ValidationHelper.NotNull rappresenta un contratto, è possibile contrassegnare il metodo chiamato con l'attributo ContractArgumentValidatorAttribute . La Contract.EndContractBlock chiamata al metodo deve essere usata per consentire agli strumenti di estrarre le specifiche appropriate per la generazione di documenti e il controllo statico, come indicato di seguito.

C#
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();
   }
}

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. Tuttavia, non sono consentiti altri contratti, ad esempio Contract.Requires o Contract.Ensures. Il codice che segue la Contract.EndContractBlock chiamata viene ignorato da tutti gli strumenti del contratto.

Nell'esempio seguente viene illustrato un validator di argomenti di intervallo scritto in termini di un metodo validator esistente NotNull .

C#
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.
   }
}

Da un punto di vista della specifica, il Execute metodo ha i tre contratti seguenti:

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.

Costruttori

ContractArgumentValidatorAttribute()

Inizializza una nuova istanza della classe ContractArgumentValidatorAttribute.

Proprietà

TypeId

Quando è implementata in una classe derivata, ottiene un identificatore univoco della classe Attribute.

(Ereditato da Attribute)

Metodi

Equals(Object)

Restituisce un valore che indica se questa istanza è uguale a un oggetto specificato.

(Ereditato da Attribute)
GetHashCode()

Restituisce il codice hash per l'istanza.

(Ereditato da Attribute)
GetType()

Ottiene l'oggetto Type dell'istanza corrente.

(Ereditato da Object)
IsDefaultAttribute()

In caso di override in una classe derivata, indica se il valore di questa istanza è il valore predefinito per la classe derivata.

(Ereditato da Attribute)
Match(Object)

Quando è sottoposto a override in una classe derivata, restituisce un valore che indica se questa istanza equivale a un oggetto specificato.

(Ereditato da Attribute)
MemberwiseClone()

Crea una copia superficiale dell'oggetto Object corrente.

(Ereditato da Object)
ToString()

Restituisce una stringa che rappresenta l'oggetto corrente.

(Ereditato da Object)

Implementazioni dell'interfaccia esplicita

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

Esegue il mapping di un set di nomi a un set corrispondente di ID dispatch.

(Ereditato da Attribute)
_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.

(Ereditato da Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Recupera il numero delle interfacce di informazioni sul tipo fornite da un oggetto (0 o 1).

(Ereditato da Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Fornisce l'accesso a proprietà e metodi esposti da un oggetto.

(Ereditato da Attribute)

Si applica a

Prodotto Versioni
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0