Procedura: Ripetere su una raccolta definita dall'utente con per ognuno
Affinché la classe sia una raccolta gestita, è necessaria una funzione non privata di GetEnumerator che restituisce un handle a una classe dell'enumeratore o in un'interfaccia.Una classe dell'enumeratore deve contenere la dichiarazione della funzione di MoveNext non statico e la proprietà corrente.
Esempio
Raccolta definita dall'utente semplice con i tipi di riferimento.
// for_each_user_defined_collections.cpp
// compile with: /clr
using namespace System;
public interface struct IMyEnumerator {
bool MoveNext();
property Object^ Current {
Object^ get();
}
void Reset();
};
public ref struct MyArray {
MyArray( array<int>^ d ) {
data = d;
}
ref struct enumerator : IMyEnumerator {
enumerator( MyArray^ myArr ) {
colInst = myArr;
currentIndex = -1;
}
virtual bool MoveNext() {
if( currentIndex < colInst->data->Length - 1 ) {
currentIndex++;
return true;
}
return false;
}
property Object^ Current {
virtual Object^ get() {
return colInst->data[currentIndex];
}
};
virtual void Reset() {}
~enumerator() {}
MyArray^ colInst;
int currentIndex;
};
array<int>^ data;
IMyEnumerator^ GetEnumerator() {
return gcnew enumerator(this);
}
};
int main() {
int retval = 0;
MyArray^ col = gcnew MyArray( gcnew array<int>{10, 20, 30 } );
for each ( Object^ c in col )
retval += (int)c;
retval -= 10 + 20 + 30;
for each ( int c in gcnew MyArray( gcnew array<int>{10, 20, 30 } ) )
retval += c;
retval -= 10 + 20 + 30;
Console::WriteLine("Return Code: {0}", retval );
return retval;
}