IEnumerator<T> Antarmuka
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mendukung iterasi sederhana melalui koleksi generik.
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
Jenis parameter
- T
Jenis objek yang akan dijumlahkan.
Parameter jenis ini bersifat kovarian. Artinya, Anda bisa menggunakan jenis yang Anda tentukan atau jenis apa pun yang lebih banyak diturunkan. Untuk informasi lebih lanjut tentang kovariansi dan kontravariansi, lihat Kovariansi dan Kontravariansi dalam Generik.- Turunan
- Penerapan
Contoh
Contoh berikut menunjukkan implementasi antarmuka IEnumerator<T> untuk kelas koleksi objek kustom. Objek kustom adalah instans jenis Box
, dan kelas koleksi BoxCollection
. Contoh kode ini adalah bagian dari contoh yang lebih besar yang disediakan untuk antarmuka ICollection<T>.
// 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
Keterangan
IEnumerator<T> adalah antarmuka dasar untuk semua enumerator generik.
Pernyataan foreach
bahasa C# (for each
di C++, For Each
di Visual Basic) menyembunyikan kompleksitas enumerator. Oleh karena itu, menggunakan foreach
disarankan, alih-alih langsung memanipulasi enumerator.
Enumerator dapat digunakan untuk membaca data dalam koleksi, tetapi tidak dapat digunakan untuk memodifikasi koleksi yang mendasar.
Awalnya, enumerator diposisikan sebelum elemen pertama dalam koleksi. Pada posisi ini, Current tidak terdefinisi. Oleh karena itu, Anda harus memanggil MoveNext untuk memajukan enumerator ke elemen pertama koleksi sebelum membaca nilai Current.
Current mengembalikan objek yang sama hingga MoveNext dipanggil. MoveNext mengatur Current ke elemen berikutnya.
Jika MoveNext melewati akhir koleksi, enumerator diposisikan setelah elemen terakhir dalam koleksi dan MoveNext mengembalikan false
. Ketika enumerator berada di posisi ini, panggilan berikutnya ke MoveNext juga mengembalikan false
. Jika panggilan terakhir ke MoveNext dikembalikan false
, Current tidak ditentukan. Anda tidak dapat mengatur Current ke elemen pertama koleksi lagi; Anda harus membuat instans enumerator baru sebagai gantinya.
Metode Reset disediakan untuk interoperabilitas COM. Itu tidak selalu perlu diimplementasikan; sebaliknya, pelaksana hanya dapat melemparkan NotSupportedException. Namun, jika Anda memilih untuk melakukan ini, Anda harus memastikan tidak ada penelepon yang mengandalkan fungsionalitas Reset.
Jika perubahan dilakukan pada koleksi, seperti menambahkan, memodifikasi, atau menghapus elemen, perilaku enumerator tidak ditentukan.
Enumerator tidak memiliki akses eksklusif ke koleksi; oleh karena itu, menghitung melalui koleksi secara intrinsik bukan prosedur aman utas. Untuk menjamin keamanan utas selama enumerasi, Anda dapat mengunci koleksi selama seluruh enumerasi. Untuk memungkinkan koleksi diakses oleh beberapa utas untuk membaca dan menulis, Anda harus menerapkan sinkronisasi Anda sendiri.
Implementasi default koleksi di namespace System.Collections.Generic tidak disinkronkan.
Catatan Bagi Implementer
Menerapkan antarmuka ini memerlukan penerapan antarmuka IEnumerator nongenerik. Metode MoveNext() dan Reset() tidak bergantung pada T
, dan hanya muncul pada antarmuka nongenerik. Properti Current muncul di kedua antarmuka, dan memiliki jenis pengembalian yang berbeda. Terapkan properti Current nongenerik sebagai implementasi antarmuka eksplisit. Ini memungkinkan setiap konsumen antarmuka nongenerik untuk mengonsumsi antarmuka generik.
Selain itu, IEnumerator<T> mengimplementasikan IDisposable, yang mengharuskan Anda untuk menerapkan metode Dispose(). Ini memungkinkan Anda menutup koneksi database atau melepaskan handel file atau operasi serupa saat menggunakan sumber daya lain. Jika tidak ada sumber daya tambahan untuk dibuang, berikan implementasi Dispose() kosong.
Properti
Current |
Mendapatkan elemen dalam koleksi pada posisi enumerator saat ini. |
Metode
Dispose() |
Melakukan tugas yang ditentukan aplikasi yang terkait dengan membebaskan, merilis, atau mengatur ulang sumber daya yang tidak dikelola. (Diperoleh dari IDisposable) |
MoveNext() |
Memajukan enumerator ke elemen koleksi berikutnya. (Diperoleh dari IEnumerator) |
Reset() |
Mengatur enumerator ke posisi awalnya, yaitu sebelum elemen pertama dalam koleksi. (Diperoleh dari IEnumerator) |