IEnumerator<T> Arabirim
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Genel bir koleksiyon üzerinde basit bir yinelemeyi destekler.
generic <typename T>
public interface class IEnumerator : IDisposable, System::Collections::IEnumerator
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator
public interface IEnumerator<T> : IDisposable, System.Collections.IEnumerator
type IEnumerator<'T> = interface
interface IEnumerator
interface IDisposable
type IEnumerator<'T> = interface
interface IDisposable
interface IEnumerator
Public Interface IEnumerator(Of Out T)
Implements IDisposable, IEnumerator
Public Interface IEnumerator(Of T)
Implements IDisposable, IEnumerator
Tür Parametreleri
- T
Numaralandıracak nesnelerin türü.
Bu genel tür parametresi kovaryanttır. Bu, kendi belirttiğiniz türü veya daha fazla türetilmiş başka bir türü kullanabileceğiniz anlamına gelir. Kovaryans ve kontravaryans hakkında daha fazla bilgi için bkz. Genel Türlerde Kovaryans ve Kontravaryans.- Türetilmiş
- Uygulamalar
Örnekler
Aşağıdaki örnekte, özel nesnelerin koleksiyon sınıfı için IEnumerator<T> arabiriminin bir uygulaması gösterilmektedir. Özel nesne, Box
türünün bir örneğidir ve koleksiyon sınıfı BoxCollection
. Bu kod örneği, ICollection<T> arabirimi için sağlanan daha büyük bir örneğin parçasıdır.
// Defines the enumerator for the Boxes collection.
// (Some prefer this class nested in the collection class.)
public class BoxEnumerator : IEnumerator<Box>
{
private BoxCollection _collection;
private int curIndex;
private Box curBox;
public BoxEnumerator(BoxCollection collection)
{
_collection = collection;
curIndex = -1;
curBox = default(Box);
}
public bool MoveNext()
{
//Avoids going beyond the end of the collection.
if (++curIndex >= _collection.Count)
{
return false;
}
else
{
// Set current box to next item in collection.
curBox = _collection[curIndex];
}
return true;
}
public void Reset() { curIndex = -1; }
void IDisposable.Dispose() { }
public Box Current
{
get { return curBox; }
}
object IEnumerator.Current
{
get { return Current; }
}
}
' Defines the enumerator for the Boxes collection.
' (Some prefer this class nested in the collection class.)
Public Class BoxEnumerator
Implements IEnumerator(Of Box)
Private _collection As BoxCollection
Private curIndex As Integer
Private curBox As Box
Public Sub New(ByVal collection As BoxCollection)
MyBase.New()
_collection = collection
curIndex = -1
curBox = Nothing
End Sub
Private Property Box As Box
Public Function MoveNext() As Boolean _
Implements IEnumerator(Of Box).MoveNext
curIndex = curIndex + 1
If curIndex = _collection.Count Then
' Avoids going beyond the end of the collection.
Return False
Else
'Set current box to next item in collection.
curBox = _collection(curIndex)
End If
Return True
End Function
Public Sub Reset() _
Implements IEnumerator(Of Box).Reset
curIndex = -1
End Sub
Public Sub Dispose() _
Implements IEnumerator(Of Box).Dispose
End Sub
Public ReadOnly Property Current() As Box _
Implements IEnumerator(Of Box).Current
Get
If curBox Is Nothing Then
Throw New InvalidOperationException()
End If
Return curBox
End Get
End Property
Private ReadOnly Property Current1() As Object _
Implements IEnumerator.Current
Get
Return Me.Current
End Get
End Property
End Class
' Defines two boxes as equal if they have the same dimensions.
Public Class BoxSameDimensions
Inherits EqualityComparer(Of Box)
Public Overrides Function Equals(ByVal b1 As Box, ByVal b2 As Box) As Boolean
If b1.Height = b2.Height And b1.Length = b2.Length And b1.Width = b2.Width Then
Return True
Else
Return False
End If
End Function
Public Overrides Function GetHashCode(ByVal bx As Box) As Integer
Dim hCode As Integer = bx.Height ^ bx.Length ^ bx.Width
Return hCode.GetHashCode()
End Function
End Class
Açıklamalar
IEnumerator<T> tüm genel numaralandırıcılar için temel arabirimdir.
C# dilinin foreach
deyimi (C++'dafor each
, Visual Basic'te For Each
) numaralandırıcıların karmaşıklığını gizler. Bu nedenle, numaralandırıcıyı doğrudan işlemek yerine foreach
kullanılması önerilir.
Numaralandırıcılar koleksiyondaki verileri okumak için kullanılabilir, ancak temel koleksiyonu değiştirmek için kullanılamaz.
Başlangıçta, numaralandırıcı koleksiyondaki ilk öğeden önce konumlandırılır. Bu konumda Current tanımlanmamıştır. Bu nedenle, Currentdeğerini okumadan önce numaralandırıcıyı koleksiyonun ilk öğesine ilerletmek için MoveNext çağırmalısınız.
Current, MoveNext çağrılana kadar aynı nesneyi döndürür. MoveNext Current sonraki öğeye ayarlar.
MoveNext koleksiyonun sonunu geçerse, numaralandırıcı koleksiyondaki son öğeden sonra konumlandırılır ve MoveNextfalse
döndürür. Numaralandırıcı bu konumdayken, MoveNext'a yapılan sonraki çağrılar da false
döndürür.
MoveNext son çağrı false
döndürdüyse Current tanımlanmamıştır.
Current koleksiyonun ilk öğesine yeniden ayarlayamazsınız; bunun yerine yeni bir numaralandırıcı örneği oluşturmanız gerekir.
COM birlikte çalışabilirliği için Reset yöntemi sağlanır. Uygulanması şart değildir; bunun yerine uygulayıcı bir NotSupportedExceptionoluşturabilir. Ancak, bunu yapmayı seçerseniz, arayanların Reset işlevselliğine güvenmediğinden emin olmanız gerekir.
Koleksiyonda öğe ekleme, değiştirme veya silme gibi değişiklikler yapılırsa, numaralandırıcının davranışı tanımsız olur.
Numaralandırıcının koleksiyona özel erişimi yoktur; Bu nedenle, bir koleksiyon aracılığıyla numaralandırma, iş parçacığı açısından güvenli bir yordam değildir. Numaralandırma sırasında iş parçacığı güvenliğini garanti etmek için, tüm numaralandırma sırasında koleksiyonu kilitleyebilirsiniz. Koleksiyona okuma ve yazma için birden çok iş parçacığı tarafından erişilmesine izin vermek için kendi eşitlemenizi uygulamanız gerekir.
System.Collections.Generic ad alanında koleksiyonların varsayılan uygulamaları eşitlenmez.
Uygulayanlara Notlar
Bu arabirimin uygulanması için, genel olmayan IEnumerator arabiriminin uygulanması gerekir.
MoveNext() ve Reset() yöntemleri T
bağımlı değildir ve yalnızca genel olmayan arabirimde görünür.
Current özelliği her iki arabirimde de görünür ve farklı dönüş türlerine sahiptir. Nongeneric Current özelliğini açık bir arabirim uygulaması olarak uygulayın. Bu, genel olmayan arabirimin herhangi bir tüketicisinin genel arabirimi kullanmasına olanak tanır.
Ayrıca, IEnumerator<T>Dispose() yöntemini uygulamanızı gerektiren IDisposableuygular. Bu, diğer kaynakları kullanırken veritabanı bağlantılarını veya yayın dosyası tanıtıcılarını veya benzer işlemleri kapatmanızı sağlar. Atılacak ek kaynak yoksa boş bir Dispose() uygulaması sağlayın.
Özellikler
Current |
Koleksiyondaki öğesini numaralandırıcının geçerli konumunda alır. |
Yöntemler
Dispose() |
Yönetilmeyen kaynakları serbest bırakma, serbest bırakma veya sıfırlama ile ilişkili uygulama tanımlı görevleri gerçekleştirir. (Devralındığı yer: IDisposable) |
MoveNext() |
Numaralandırıcıyı koleksiyonun sonraki öğesine ilerler. (Devralındığı yer: IEnumerator) |
Reset() |
Numaralandırıcıyı, koleksiyondaki ilk öğeden önceki ilk konumuna ayarlar. (Devralındığı yer: IEnumerator) |