IteratorStateMachineAttribute Classe

Definizione

Indica se un metodo in Visual Basic è contrassegnato con il modificatore Iterator.Indicates whether a method in Visual Basic is marked with the Iterator modifier.

public ref class IteratorStateMachineAttribute sealed : System::Runtime::CompilerServices::StateMachineAttribute
[System.AttributeUsage(System.AttributeTargets.Method, AllowMultiple=false, Inherited=false)]
[System.Serializable]
public sealed class IteratorStateMachineAttribute : System.Runtime.CompilerServices.StateMachineAttribute
type IteratorStateMachineAttribute = class
    inherit StateMachineAttribute
Public NotInheritable Class IteratorStateMachineAttribute
Inherits StateMachineAttribute
Ereditarietà
IteratorStateMachineAttribute
Attributi

Esempi

Nell'esempio seguente viene illustrato come determinare se un metodo è un metodo iteratore.The following example shows how to determine whether a method is an iterator method. Nell'esempio, IsIteratorMethod esegue i passaggi seguenti:In the example, IsIteratorMethod performs the following steps:

  • Ottiene un MethodInfo oggetto per il nome del metodo Type.GetMethodtramite.Obtains a MethodInfo object for the method name by using Type.GetMethod.

  • Ottiene un Type oggetto per l'attributo utilizzando l' operatore GetType.Obtains a Type object for the attribute by using GetType Operator.

  • Ottiene un oggetto attributo per il metodo e il tipo di MethodInfo.GetCustomAttributeattributo tramite.Obtains an attribute object for the method and attribute type by using MethodInfo.GetCustomAttribute. Se GetCustomAttribute restituisceNothing (Visual Basic), il metodo non contiene l'attributo.If GetCustomAttribute returns Nothing (Visual Basic), the method doesn't contain the attribute.

Imports System.Collections.Generic
Imports System.Reflection
Imports System.Threading.Tasks
Imports System.Runtime.CompilerServices


Module Module1

    ' This class is used by the code below to discover method attributes.
    Public Class TheClass
        Public Async Function AsyncMethod() As Task(Of Integer)
            Await Task.Delay(5)
            Return 1
        End Function

        Public Iterator Function IteratorMethod() As IEnumerable(Of Integer)
            Yield 1
            Yield 2
        End Function

        Public Function RegularMethod() As Integer
            Return 0
        End Function
    End Class


    Private Function IsAsyncMethod(classType As Type, methodName As String)
        ' Obtain the method with the specified name.
        Dim method As MethodInfo = classType.GetMethod(methodName)

        Dim attType As Type = GetType(AsyncStateMachineAttribute)

        Dim attrib = CType(method.GetCustomAttribute(attType), AsyncStateMachineAttribute)
        ' The above variable contains the StateMachineType property.

        Return (attrib IsNot Nothing)
    End Function

    Private Function IsIteratorMethod(classType As Type, methodName As String)
        ' Obtain the method with the specified name.
        Dim method As MethodInfo = classType.GetMethod(methodName)

        Dim attType As Type = GetType(IteratorStateMachineAttribute)

        ' Obtain the custom attribute for the method.
        ' The value returned contains the StateMachineType property.
        ' Nothing is returned if the attribute isn't present for the method.
        Dim attrib = CType(method.GetCustomAttribute(attType), IteratorStateMachineAttribute)

        Return (attrib IsNot Nothing)
    End Function

    Private Sub ShowResult(classType As Type, methodName As String)
        Console.Write((methodName & ": ").PadRight(16))

        If IsAsyncMethod(classType, methodName) Then
            Console.WriteLine("Async method")
        ElseIf IsIteratorMethod(classType, methodName) Then
            Console.WriteLine("Iterator method")
        Else
            Console.WriteLine("Regular method")
        End If

        ' Note: The IteratorStateMachineAttribute applies to Visual Basic methods
        ' but not C# methods.
    End Sub

    Sub Main()
        ShowResult(GetType(TheClass), "AsyncMethod")
        ShowResult(GetType(TheClass), "IteratorMethod")
        ShowResult(GetType(TheClass), "RegularMethod")

        Console.ReadKey()
    End Sub

    '   AsyncMethod:    Async method
    '   IteratorMethod: Iterator method
    '   RegularMethod:  Regular method

End Module

Commenti

Non è necessario applicare IteratorStateMachine l'attributo ai metodi nel codice.You shouldn't apply the IteratorStateMachine attribute to methods in your code. Per i metodi in Visual Basic che hanno il modificatore iterator , il compilatore applicherà l' IteratorStateMachine attributo nel linguaggio il che emette.For methods in Visual Basic that have the Iterator modifier, the compiler will apply the IteratorStateMachine attribute in the IL that it emits.

Quando un metodo (MethodName) in Visual Basic ha Iterator il modificatore, il compilatore genera il che include una struttura della macchina a Stati.When a method (MethodName) in Visual Basic has the Iterator modifier, the compiler emits IL that includes a state machine structure. Tale struttura contiene il codice nel metodo.That structure contains the code in the method. Tale IL contiene anche un metodo stub (MethodName) che chiama nella macchina a Stati.That IL also contains a stub method (MethodName) that calls into the state machine. Il compilatore aggiunge l' IteratorStateMachine attributo al metodo stub in modo che gli strumenti possano identificare la macchina a stati corrispondente.The compiler adds the IteratorStateMachine attribute to the stub method so that tools can identify the corresponding state machine. I dettagli del linguaggio intermedio emesso potrebbero cambiare nelle versioni future dei compilatori.Details of the emitted IL might change in future releases of the compilers.

Un metodo iteratore esegue un'iterazione personalizzata su una raccolta usando Yield l'istruzione (Visual Basic) per restituire ogni elemento uno alla volta.An iterator method performs a custom iteration over a collection by using the Yield (Visual Basic) statement to return each element one at a time. Per altre informazioni, vedere Iteratori.For more information, see Iterators.

Nota

Non è possibile IteratorStateMachineAttribute usare per verificare se un metodo è un metodo iteratore in. C#You can't use IteratorStateMachineAttribute to test whether a method is an iterator method in C#.

Costruttori

IteratorStateMachineAttribute(Type)

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

Proprietà

StateMachineType

Restituisce l'oggetto tipo per il tipo sottostante della macchina a stati generato dal compilatore per implementare il metodo della macchina a stati.Returns the type object for the underlying state machine type that was generated by the compiler to implement the state machine method.

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

(Ereditato da Attribute)

Metodi

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.

(Ereditato da Attribute)
GetHashCode()

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

(Ereditato da Attribute)
GetType()

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

(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.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(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.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Ereditato da Attribute)
MemberwiseClone()

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

(Ereditato da Object)
ToString()

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

(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.Maps a set of names to a corresponding set of dispatch identifiers.

(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.Retrieves the type information for an object, which can be used to get the type information for an interface.

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

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

(Ereditato da Attribute)

Si applica a

Vedi anche