Junior
Welke soorten objecten kunnen worden gebruikt in een foreach-lus in C#?
sobes.tech AI
Antwoord van AI
In de foreach-lus in C# kunnen alle objecttypes worden gebruikt die een van de volgende interfaces implementeren:
System.Collections.IEnumerable- Voor niet-generieke collecties. Biedt een niet-generieke iteratorIEnumerator.System.Collections.Generic.IEnumerable<T>- Voor generieke collecties. Biedt een generieke iteratorIEnumerator<T>.
Een klasse of structuur kan ook in foreach worden gebruikt als deze een publieke methode GetEnumerator() heeft, die een instantie retourneert van een klasse of structuur die de volgende handtekening implementeert (dit wordt pattern-based foreach genoemd):
- Een publieke eigenschap
Current, die elk type retourneert. - Een publieke methode
MoveNext(), die eenboolretourneert. - Optioneel, een publieke methode
Dispose()(voor het correct vrijmaken van bronnen bij gebruik vanusing).
Voorbeelden van ingebouwde types die kunnen worden gebruikt:
- Arrays (
int[],string[], etc.) - Collecties uit de namespace
System.Collections:ArrayList,Hashtable,Queue,Stack. - Collecties uit de namespace
System.Collections.Generic:List<T>,Dictionary<TKey, TValue>,HashSet<T>,Queue<T>,Stack<T>. - Strings (
string) - deze zijn een sequentie van tekenschar.
Voorbeeld van een aangepaste type die foreach ondersteunt volgens het patroon:
// Eenvoudig aangepast type dat `foreach` ondersteunt
public class MyEnumerable
{
private int[] data = { 1, 2, 3, 4, 5 };
// GetEnumerator-methode die `foreach` ondersteunt volgens het patroon
public MyEnumerator GetEnumerator()
{
return new MyEnumerator(data);
}
// Interne klasse van de enumerator
public class MyEnumerator
{
private int[] data;
private int currentIndex = -1;
public MyEnumerator(int[] data)
{
this.data = data;
}
// `Current` eigenschap
public int Current => data[currentIndex];
// `MoveNext` methode
public bool MoveNext()
{
currentIndex++;
return currentIndex < data.Length;
}
// `Dispose` methode (optioneel)
public void Dispose()
{
// Resources vrijmaken indien nodig
}
}
}
// Gebruik in `foreach`
// var collection = new MyEnumerable();
// foreach (var item in collection)
// {
// // Console.WriteLine(item);
// }