IteratorStateMachineAttribute Klasa

Definicja

Wskazuje, czy metoda w Visual Basic jest oznaczona modyfikatorem 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
Dziedziczenie
IteratorStateMachineAttribute
Atrybuty

Przykłady

Poniższy przykład pokazuje, jak ustalić, czy metoda jest metodą iteratorową.The following example shows how to determine whether a method is an iterator method. W przykładzie IsIteratorMethod wykonuje następujące czynności:In the example, IsIteratorMethod performs the following steps:

  • Uzyskuje obiekt MethodInfo dla nazwy metody przy użyciu Type.GetMethod.Obtains a MethodInfo object for the method name by using Type.GetMethod.

  • Uzyskuje obiekt Type dla atrybutu przy użyciu elementu GetType.Obtains a Type object for the attribute by using GetType Operator.

  • Uzyskuje obiekt atrybutu dla metody i typu atrybutu przy użyciu MethodInfo.GetCustomAttribute.Obtains an attribute object for the method and attribute type by using MethodInfo.GetCustomAttribute. Jeśli GetCustomAttribute zwraca Nothing (Visual Basic), metoda nie zawiera atrybutu.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

Uwagi

Nie należy stosować atrybutu IteratorStateMachine do metod w kodzie.You shouldn't apply the IteratorStateMachine attribute to methods in your code. Dla metod w Visual Basic, które mają modyfikator iteratora , kompilator zastosuje atrybut IteratorStateMachine w Il, który emituje.For methods in Visual Basic that have the Iterator modifier, the compiler will apply the IteratorStateMachine attribute in the IL that it emits.

Gdy Metoda (MethodName) w Visual Basic ma modyfikator Iterator, kompilator emituje kod IL zawierający strukturę komputera stanu.When a method (MethodName) in Visual Basic has the Iterator modifier, the compiler emits IL that includes a state machine structure. Ta struktura zawiera kod w metodzie.That structure contains the code in the method. Ten IL zawiera również metodę zastępczą (MethodName), która wywołuje maszynę stanu.That IL also contains a stub method (MethodName) that calls into the state machine. Kompilator dodaje do metody zastępczej atrybut IteratorStateMachine, dzięki czemu narzędzia mogą identyfikować odpowiedni komputer stanu.The compiler adds the IteratorStateMachine attribute to the stub method so that tools can identify the corresponding state machine. Szczegóły emitowanej IL mogą ulec zmianie w przyszłych wydaniach kompilatora.Details of the emitted IL might change in future releases of the compilers.

Metoda iteratora wykonuje niestandardową iterację w kolekcji przy użyciu instrukcji Yield (Visual Basic), aby zwrócić każdy element po jednym naraz.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. Aby uzyskać więcej informacji, zobacz Iteratory.For more information, see Iterators.

Uwaga

Nie można użyć IteratorStateMachineAttribute do sprawdzenia, czy metoda jest metodą iteratora w C#.You can't use IteratorStateMachineAttribute to test whether a method is an iterator method in C#.

Konstruktory

IteratorStateMachineAttribute(Type)

Inicjuje nowe wystąpienie klasy IteratorStateMachineAttribute klasy.Initializes a new instance of the IteratorStateMachineAttribute class.

Właściwości

StateMachineType

Zwraca obiekt Type dla typu podstawowego komputera stanu, który został wygenerowany przez kompilator w celu zaimplementowania metody automatu Stanów.Returns the type object for the underlying state machine type that was generated by the compiler to implement the state machine method.

(Odziedziczone po StateMachineAttribute)
TypeId

Po zaimplementowaniu w klasie pochodnej pobiera unikatowy identyfikator dla tego Attribute.When implemented in a derived class, gets a unique identifier for this Attribute.

(Odziedziczone po Attribute)

Metody

Equals(Object)

Zwraca wartość wskazującą, czy to wystąpienie jest równe podanemu obiektowi.Returns a value that indicates whether this instance is equal to a specified object.

(Odziedziczone po Attribute)
GetHashCode()

Zwraca kod skrótu dla tego wystąpienia.Returns the hash code for this instance.

(Odziedziczone po Attribute)
GetType()

Pobiera Type bieżącego wystąpienia.Gets the Type of the current instance.

(Odziedziczone po Object)
IsDefaultAttribute()

Gdy jest zastępowany w klasie pochodnej, wskazuje, czy wartość tego wystąpienia jest wartością domyślną klasy pochodnej.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(Odziedziczone po Attribute)
Match(Object)

Gdy jest zastępowany w klasie pochodnej, zwraca wartość wskazującą, czy to wystąpienie jest zgodne z określonym obiektem.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Odziedziczone po Attribute)
MemberwiseClone()

Tworzy skróconą kopię bieżącego Object.Creates a shallow copy of the current Object.

(Odziedziczone po Object)
ToString()

Zwraca ciąg, który reprezentuje bieżący obiekt.Returns a string that represents the current object.

(Odziedziczone po Object)

Jawne implementacje interfejsu

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

Zestaw nazw jest mapowany na odpowiedni zestaw identyfikatorów wysyłania.Maps a set of names to a corresponding set of dispatch identifiers.

(Odziedziczone po Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Pobiera informacje o typie dla obiektu, którego można użyć do uzyskania informacji o typie dla interfejsu.Retrieves the type information for an object, which can be used to get the type information for an interface.

(Odziedziczone po Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Pobiera informację o liczbie typów interfejsów, jakie zawiera obiekt (0 lub 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(Odziedziczone po Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Umożliwia dostęp do właściwości i metod udostępnianych przez obiekt.Provides access to properties and methods exposed by an object.

(Odziedziczone po Attribute)

Dotyczy

Zobacz też