Sorunuz, anladığım kadarıyla, yanlış bir önermeye dayanıyor gibi görünüyor. Bakalım akıl yürütmeyi yeniden yapılandırabilir miyim:
- Bağlantılı makale, otomatik olarak oluşturulan sekansların nasıl "tembel" bir davranış sergilediğini ve bunun nasıl sezgisel bir sonuca yol açabileceğini gösterir.
- Bu nedenle, belirli bir IEnumerable örneğinin otomatik olarak oluşturulup oluşturulmadığını kontrol ederek bu tembel davranışı gösterip göstermeyeceğini tespit edebilirim.
- Bunu nasıl yaparım?
Sorun, ikinci öncülün yanlış olmasıdır. Belirli bir IEnumerable'ın bir yineleyici blok dönüşümünün sonucu olup olmadığını tespit edebilseniz bile (ve evet, bunu yapmanın yolları vardır) varsayım yanlış olduğu için yardımcı olmaz. Nedenini açıklayalım.
class M { public int P { get; set; } }
class C
{
public static IEnumerable<M> S1()
{
for (int i = 0; i < 3; ++i)
yield return new M { P = i };
}
private static M[] ems = new M[]
{ new M { P = 0 }, new M { P = 1 }, new M { P = 2 } };
public static IEnumerable<M> S2()
{
for (int i = 0; i < 3; ++i)
yield return ems[i];
}
public static IEnumerable<M> S3()
{
return new M[]
{ new M { P = 0 }, new M { P = 1 }, new M { P = 2 } };
}
private class X : IEnumerable<M>
{
public IEnumerator<X> GetEnumerator()
{
return new XEnum();
}
// Omitted: non generic version
private class XEnum : IEnumerator<X>
{
int i = 0;
M current;
public bool MoveNext()
{
current = new M() { P = i; }
i += 1;
return true;
}
public M Current { get { return current; } }
// Omitted: other stuff.
}
}
public static IEnumerable<M> S4()
{
return new X();
}
public static void Add100(IEnumerable<M> items)
{
foreach(M item in items) item.P += 100;
}
}
Pekala, dört yöntemimiz var. S1 ve S2 otomatik olarak oluşturulan dizilerdir; S3 ve S4, manuel olarak oluşturulan dizilerdir. Şimdi varsayalım:
var items = C.Sn(); // S1, S2, S3, S4
S.Add100(items);
Console.WriteLine(items.First().P);
S1 ve S4 için sonuç 0 olacaktır; diziyi her numaralandırdığınızda, oluşturulan bir M'ye yeni bir referans alırsınız. S2 ve S3 için sonuç 100 olacaktır; diziyi her numaralandırdığınızda, M'ye aynı referansı son kez alırsınız. Sıralama kodunun otomatik olarak oluşturulup oluşturulmadığı, numaralandırılan nesnelerin referans kimliğine sahip olup olmadığı sorusuyla dikeydir. Bu iki özelliğin - otomatik üretim ve referans kimlik - aslında birbirleriyle hiçbir ilgisi yoktur. Bağlantı verdiğiniz makale onları biraz karıştırıyor.
Bir sekans sağlayıcısı, her zaman referans kimliğine sahip nesneleri önermiş olarak belgelenmedikçe , bunu kabul ettiği akılsızdır.
ICollection<T>
tüm koleksiyonlar olmadığı için daha iyi bir seçim olacaktırList<T>
. Örneğin, dizilerPoint[]
uygulanırIList<T>
ancak uygulanmazList<T>
.