Czy istnieje w C# możliwość przekazania referencji do elementu ArrayList jako argumentu funkcji? Wyobraźmy sobie, że mamy przykładową funkcję rekurencyjną oraz kolekcję typu Arraylist przechowywującą obiekty jakiejś klasy, które wspólnie tworzą pewną strukturę hierarchiczną. (coś jak drzewo binarne) Funkcja powinna pobierać element kolekcji o danym indeksie (jako ref), sprawdzać go, i albo jakoś modyfikować jego atrybuty, albo wywoływać samą siebie dla elementu o pewnym innym indeksie. Niestety, kompilator wyświetla komunikat: "A property or indexer may not be passed as an out or ref parameter". W jaki sposób mógłby taką przeszkodę ominąć ktoś, kto właśnie potrzebowałby funkcji modyfikującej obiekty przechowywane w ArrayList?
W formie pseudokodu wyglądałoby to mniej więcej tak:
ArrayList obiekty = new ArrayList(); // przechowuje obiekty klasy JakaśKlasa
class JakasKlasa // element drzewa
{
int c1;
int c2;
bool CzyLisc;
string nazwa;
}
void OznaczLiscie(ref object o) // wyszukuje liście drzewa i zmienia ich pole "nazwa"
{
if ( ((JakasKlasa)o).CzyLisc == true ) ((JakasKlasa)o).nazwa+=" (jest liściem)";
else
{
OznaczLiscie(ref obiekty[c1]);
OznaczLiscie(ref obiekty[c2]);
}
}
int main()
{
OznaczLiscie(ref obiekty[0]); // obiekt[0] jest korzeniem
}
Oczywiście, funkcja nie musi spełniać dokładnie takiego zadania jak pokazuje powyższy pseudokod - to tylko taki abstrakcyjny przykład mający pokazać w jaki sposób ma ona dojść do celu.