ContractArgumentValidatorAttribute Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Umožňuje faktoring starší verze if-then-throw
kódu do samostatných metod pro opakované použití a poskytuje úplnou kontrolu nad vyvolaných výjimkami a argumenty.
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
- Dědičnost
- Atributy
Poznámky
Pokud váš kód používá explicitní if-then-throw
kód k ověření parametrů, možná používáte pomocné metody, které provádějí kontroly a vyvolají konkrétní výjimky při selhání, jak je znázorněno v následujícím příkladu.
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
V tomto příkladu Execute
má volitelnou podmínku určující, že hodnota parametru by neměla být null
. Pokud chcete nástrojům kontraktu umožnit rozpoznávání, že volání ValidationHelper.NotNull
představuje kontrakt, můžete volanou metodu označit atributem ContractArgumentValidatorAttribute . Volání Contract.EndContractBlock metody by mělo být použito k tomu, aby nástroje mohly extrahovat správné specifikace pro generování dokumentů a statickou kontrolu, jak je uvedeno níže.
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
Kromě if-then-throw
příkazů může oddíl smlouvy metody validátoru smlouvy obsahovat volání jiných metod validátoru kontraktů. Nejsou však povoleny žádné jiné smlouvy (například Contract.Requires, nebo Contract.Ensures). Kód, který následuje po Contract.EndContractBlock volání, je ignorován všemi nástroji kontraktu.
Následující příklad ukazuje validátor argumentu rozsahu napsaný jako existující NotNull
validator metoda.
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
Z hlediska Execute
specifikace má metoda následující tři kontrakty:
Contract.Requires<ArgumentNullException>(data != null);
Contract.Requires<ArgumentOutOfRangeException>(position >= 0);
Contract.Requires<ArgumentOutOfRangeException>(position < data.Length);
Ve standardních metodách lze volání metod validátoru kontraktů volně kombinovat s jinými kontrakty, jako Contract.Ensures je nebo Contract.Requires.
Konstruktory
ContractArgumentValidatorAttribute() |
Inicializuje novou instanci ContractArgumentValidatorAttribute třídy . |
Vlastnosti
TypeId |
Při implementaci v odvozené třídě získá jedinečný identifikátor pro tuto Attributetřídu . (Zděděno od Attribute) |
Metody
Equals(Object) |
Vrací hodnotu, která určuje, zda je tato instance rovna zadanému objektu. (Zděděno od Attribute) |
GetHashCode() |
Vrátí hodnotu hash pro tuto instanci. (Zděděno od Attribute) |
GetType() |
Type Získá z aktuální instance. (Zděděno od Object) |
IsDefaultAttribute() |
Při přepsání v odvozené třídě označuje, zda je hodnota této instance výchozí hodnotou pro odvozenou třídu. (Zděděno od Attribute) |
Match(Object) |
Při přepsání v odvozené třídě vrátí hodnotu, která označuje, zda se tato instance rovná zadanému objektu. (Zděděno od Attribute) |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |
Explicitní implementace rozhraní
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Mapuje sadu názvů na odpovídající sadu identifikátorů pro rozesílání. (Zděděno od Attribute) |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Načte informace o typu objektu, které lze použít k získání informací o typu pro rozhraní. (Zděděno od Attribute) |
_Attribute.GetTypeInfoCount(UInt32) |
Získá počet rozhraní typu informací, které objekt poskytuje (0 nebo 1). (Zděděno od Attribute) |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Poskytuje přístup k vlastnostem a metodám vystaveným objektem. (Zděděno od Attribute) |