Citat:
Shadowed: Nisam siguran pa taman i da se proverim, da li bi se
str.Split(' ') izvrsilo samo jednom (kao sto bi bilo ovde potrebno)?
Tj. kako foreach interno radi?
foreach je jezikca konstrukcija, tj. kompajler u pozadini uradi implementaciju while petlje. U zavisnosti da li objekat implementira IDisposable ovo varira:
Code:
Enumerator enumerator = (collection).GetEnumerator();
try {
while (enumerator.MoveNext()) {
ElementType element = (ElementType)enumerator.Current;
statement;
}
}
finally {
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
Zanimljivo da Reflecotor prikazuje foreach petlju a ne ovakvu while konstrukciju, sto ce reci, izgleda da cita odredjeni blok IL kodova kako bi zakljucio da je u pitanju foreach petlja. Ono sto je jos zanimljivo je, sto sve nizove ([]) foreach drukcije konstruise u odnosu na klase koje implementiraju IEnumerable. Ukoliko klasa implementira IEnumerable onda se poziva citava ova konstrukcija, dok ako je u pitanju niz, onda se radi prosto uporedjivanje duzine niza sa trenutnom pozicijom u while petlji. Drugim recima, brze radi foreach sa [] nego sa klasama koje implementiraju IEnumerable i to skoro 2x.
Da, zaboravih, sporije je ako se radi samo uporedjivanje foreach bez ikakvog dodatnog overhead-a, sto u praksi niko ne koristi, dok ako postoji i obicno sabranje dve promenljive u foreach, onda ta razlika bledi sa povecanjem kompleksnosti operacije, drugim recima, skoro da je nebitno.
@cvolka11
Imas System.IO.File.ReadAllText method, posto vidim da citas odjednom ceo fajl.