ContractArgumentValidatorAttribute Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Active la factorisation du code if-then-throw
hérité dans des méthodes distinctes pour la réutilisation, et fournit un contrôle total sur les exceptions et les arguments levés.
public ref class ContractArgumentValidatorAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false)]
[System.Diagnostics.Conditional("CONTRACTS_FULL")]
public sealed class ContractArgumentValidatorAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false)>]
[<System.Diagnostics.Conditional("CONTRACTS_FULL")>]
type ContractArgumentValidatorAttribute = class
inherit Attribute
Public NotInheritable Class ContractArgumentValidatorAttribute
Inherits Attribute
- Héritage
- Attributs
Remarques
Si votre code utilise du code explicite if-then-throw
pour valider des paramètres, vous pouvez utiliser des méthodes d’assistance qui effectuent des vérifications et lèvent des exceptions particulières en cas d’échec, comme illustré dans l’exemple suivant.
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
Dans cet exemple, Execute
a une condition préalable élective spécifiant que la valeur du paramètre ne doit pas être null
. Pour permettre aux outils de contrat de reconnaître que l’appel à ValidationHelper.NotNull
représente un contrat, vous pouvez marquer la méthode appelée avec l’attribut ContractArgumentValidatorAttribute . L’appel Contract.EndContractBlock de méthode doit être utilisé pour permettre aux outils d’extraire les spécifications appropriées pour la génération de documents et la vérification statique, comme suit.
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
En plus if-then-throw
des instructions, la section contrat des méthodes de validateur de contrat peut contenir des appels à d’autres méthodes de validateur de contrat. Toutefois, aucun autre contrat (comme Contract.Requires, ou Contract.Ensures) n’est autorisé. Le code qui suit l’appel Contract.EndContractBlock est ignoré par tous les outils de contrat.
L’exemple suivant montre un validateur d’argument de plage écrit en termes d’une méthode de validateur existante NotNull
.
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
Du point de vue de la spécification, la Execute
méthode a les trois contrats suivants :
Contract.Requires<ArgumentNullException>(data != null);
Contract.Requires<ArgumentOutOfRangeException>(position >= 0);
Contract.Requires<ArgumentOutOfRangeException>(position < data.Length);
Dans les méthodes standard, les appels aux méthodes de validateur de contrat peuvent être librement mélangés à d’autres contrats tels que Contract.Ensures ou Contract.Requires.
Constructeurs
ContractArgumentValidatorAttribute() |
Initialise une nouvelle instance de la classe ContractArgumentValidatorAttribute. |
Propriétés
TypeId |
Lors de l'implémentation dans une classe dérivée, obtient un identificateur unique pour l'objet Attribute. (Hérité de Attribute) |
Méthodes
Equals(Object) |
Retourne une valeur qui indique si cette instance est égale à un objet spécifié. (Hérité de Attribute) |
GetHashCode() |
Retourne le code de hachage de cette instance. (Hérité de Attribute) |
GetType() |
Obtient le Type de l'instance actuelle. (Hérité de Object) |
IsDefaultAttribute() |
En cas de substitution dans une classe dérivée, indique si la valeur de cette instance est la valeur par défaut pour la classe dérivée. (Hérité de Attribute) |
Match(Object) |
En cas de substitution dans une classe dérivée, retourne une valeur indiquant si cette instance équivaut à un objet spécifié. (Hérité de Attribute) |
MemberwiseClone() |
Crée une copie superficielle du Object actuel. (Hérité de Object) |
ToString() |
Retourne une chaîne qui représente l'objet actuel. (Hérité de Object) |
Implémentations d’interfaces explicites
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Mappe un jeu de noms avec un jeu correspondant d'identificateurs de dispatch. (Hérité de Attribute) |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Récupère les informations de type pour un objet, qui peuvent être utilisées pour obtenir les informations de type d'une interface. (Hérité de Attribute) |
_Attribute.GetTypeInfoCount(UInt32) |
Récupère le nombre d'interfaces d'informations de type fourni par un objet (0 ou 1). (Hérité de Attribute) |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Fournit l'accès aux propriétés et aux méthodes exposées par un objet. (Hérité de Attribute) |