SqlParameterCollection.GetEnumerator 方法    
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
返回循环访问 SqlParameterCollection 的枚举数。
public:
 override System::Collections::IEnumerator ^ GetEnumerator();public:
 virtual System::Collections::IEnumerator ^ GetEnumerator();public override System.Collections.IEnumerator GetEnumerator();public System.Collections.IEnumerator GetEnumerator();override this.GetEnumerator : unit -> System.Collections.IEnumeratorabstract member GetEnumerator : unit -> System.Collections.IEnumerator
override this.GetEnumerator : unit -> System.Collections.IEnumeratorPublic Overrides Function GetEnumerator () As IEnumeratorPublic Function GetEnumerator () As IEnumerator返回
IEnumerator 的一个 SqlParameterCollection。
实现
示例
下面的代码示例演示自定义集合接口 IEnumerable 的实现。 在此示例中, GetEnumerator 未显式调用 ,但实现它以支持在 Visual Basic) 中使用 foreach (For Each 。 此代码示例是 接口的较大示例的 IEnumerable 一部分。
using System;
using System.Collections;
// Simple business object.
public class Person
{
    public Person(string fName, string lName)
    {
        this.firstName = fName;
        this.lastName = lName;
    }
    public string firstName;
    public string lastName;
}
// Collection of Person objects. This class
// implements IEnumerable so that it can be used
// with ForEach syntax.
public class People : IEnumerable
{
    private Person[] _people;
    public People(Person[] pArray)
    {
        _people = new Person[pArray.Length];
        for (int i = 0; i < pArray.Length; i++)
        {
            _people[i] = pArray[i];
        }
    }
// Implementation for the GetEnumerator method.
    IEnumerator IEnumerable.GetEnumerator()
    {
       return (IEnumerator) GetEnumerator();
    }
    public PeopleEnum GetEnumerator()
    {
        return new PeopleEnum(_people);
    }
}
// When you implement IEnumerable, you must also implement IEnumerator.
public class PeopleEnum : IEnumerator
{
    public Person[] _people;
    // Enumerators are positioned before the first element
    // until the first MoveNext() call.
    int position = -1;
    public PeopleEnum(Person[] list)
    {
        _people = list;
    }
    public bool MoveNext()
    {
        position++;
        return (position < _people.Length);
    }
    public void Reset()
    {
        position = -1;
    }
    object IEnumerator.Current
    {
        get
        {
            return Current;
        }
    }
    public Person Current
    {
        get
        {
            try
            {
                return _people[position];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }
}
class App
{
    static void Main()
    {
        Person[] peopleArray = new Person[3]
        {
            new Person("John", "Smith"),
            new Person("Jim", "Johnson"),
            new Person("Sue", "Rabon"),
        };
        People peopleList = new People(peopleArray);
        foreach (Person p in peopleList)
            Console.WriteLine(p.firstName + " " + p.lastName);
    }
}
/* This code produces output similar to the following:
 *
 * John Smith
 * Jim Johnson
 * Sue Rabon
 *
 */
Imports System.Collections
' Simple business object.
Public Class Person
    Public Sub New(ByVal fName As String, ByVal lName As String)
        Me.firstName = fName
        Me.lastName = lName
    End Sub
    Public firstName As String
    Public lastName As String
End Class
' Collection of Person objects, which implements IEnumerable so that
' it can be used with ForEach syntax.
Public Class People
    Implements IEnumerable
    Private _people() As Person
    Public Sub New(ByVal pArray() As Person)
        _people = New Person(pArray.Length - 1) {}
        Dim i As Integer
        For i = 0 To pArray.Length - 1
            _people(i) = pArray(i)
        Next i
    End Sub
    ' Implementation of GetEnumerator.
    Public Function GetEnumerator() As IEnumerator _
      Implements IEnumerable.GetEnumerator
        Return New PeopleEnum(_people)
    End Function
End Class
' When you implement IEnumerable, you must also implement IEnumerator.
Public Class PeopleEnum
    Implements IEnumerator
    Public _people() As Person
    ' Enumerators are positioned before the first element
    ' until the first MoveNext() call.
    Dim position As Integer = -1
    Public Sub New(ByVal list() As Person)
        _people = list
    End Sub
    Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
        position = position + 1
        Return (position < _people.Length)
    End Function
    Public Sub Reset() Implements IEnumerator.Reset
        position = -1
    End Sub
    Public ReadOnly Property Current() As Object Implements IEnumerator.Current
        Get
            Try
                Return _people(position)
            Catch ex As IndexOutOfRangeException
                Throw New InvalidOperationException()
            End Try
        End Get
    End Property
End Class
Class App
    Shared Sub Main()
        Dim peopleArray() As Person = { _
            New Person("John", "Smith"), _
            New Person("Jim", "Johnson"), _
            New Person("Sue", "Rabon")}
        Dim peopleList As New People(peopleArray)
        Dim p As Person
        For Each p In peopleList
            Console.WriteLine(p.firstName + " " + p.lastName)
        Next
    End Sub
End Class
' This code produces output similar to the following:
' 
' John Smith
' Jim Johnson
' Sue Rabon
注解
此成员是显式接口成员的实现。 它只能在 SqlParameterCollection 实例被强制转换为 IEnumerable 接口时使用。
C# 语言的 foreach 语句(在 Visual Basic 中为 For Each)隐藏了枚举数的复杂性。  因此,建议使用 foreach,而不是直接操作枚举数。
枚举器可用于读取集合中的数据,但不能用于修改基础集合。
最初,枚举数定位在集合中第一个元素的前面。 方法 Reset 还会将枚举器带回此位置。 在此位置, Current 属性未定义。 因此,在读取 的值Current之前,必须调用 MoveNext 方法以将枚举器推进到集合的第一个元素。
在调用 Current 或 MoveNext 之前,Reset 返回同一对象。 MoveNext 将 Current 设置为下一个元素。
如果 MoveNext 传递集合的末尾,则枚举器位于集合中的最后一个元素之后,并 MoveNext 返回 false。 当枚举器位于此位置时,对 MoveNext 的后续调用也会返回 false。 如果最后一次调用 MoveNext 返回 false, Current 则为未定义。 若要再次将 Current 设置为集合的第一个元素,可以调用 Reset 并接着调用 MoveNext。
如果对集合进行了更改(例如添加、修改或删除元素),则枚举器的行为是未定义的。
枚举数没有对集合的独占访问权;因此,从头到尾对一个集合进行枚举在本质上不是一个线程安全的过程。 若要确保枚举过程中的线程安全性,可以在整个枚举过程中锁定集合。 若要允许多个线程访问集合以进行读写操作,则必须实现自己的同步。