PDA

View Full Version : مفهوم yield که در IEnumerable بکار میرود



ma_barnamenevis
جمعه 30 بهمن 1388, 20:22 عصر
تو سایت نگاه کردم درمورد مفهوم yield یک مقاله بود ولی فقط یک برداشت کلی رو می رسوند اگر کسی این مفهوم رو واضح تر و کامل تر می تونه بگه بسم الله

r00tkit
جمعه 30 بهمن 1388, 23:38 عصر
سلام

قبل net.2 ما برای این که یه مجموعه داشته باشیم که بشه با foreach اعضای ان رو پیمایش کرد نیاز به پیاده سازیinterface IEnumerable داشتیم اما بعد net.2 ما یه راه دیگه هم داریم که ان استفاده از کلمه ی کلیدی yield هستش که این کار رو خیلی اسون می کنه

نكته ی
1)) البته اگه با reflection نگاه کنی می بیمی که خود کامپایلر GetEnumerator() وCurrentو
Reset() رو پیاده سازی کرده

2)) هر بار که برنامه به yield return می رسه حالت برنامه ذخیره می شه و هر وقت كنترل برنامه یک بار دیگه به yield return رسید برنامه از جایی که حالتش ذخیره بود ادامه پیدا می گنه(احتمالا این کار با thread ها انجام می شه (توی reflection بود) )

3)) از yield برای پباده سازی توابع coroutine استفاده می شه

مثال:



using System;
using System.Collections;
public class Garage
{

static public IEnumerable GetEnumerator()
{
for (int i = 0; i < 10; i++)
{
yield return i;
}

}
static void Main()
{
foreach (var i in GetEnumerator())
Console.WriteLine(i);
}
}

ma_barnamenevis
یک شنبه 02 اسفند 1388, 13:54 عصر
میشه بگید در اینجا منظورتون از حالت برنامه دقیقاً چیه؟

r00tkit
یک شنبه 02 اسفند 1388, 15:39 عصر
میشه بگید در اینجا منظورتون از حالت برنامه دقیقاً چیه؟
مثلا مقدار local variable ها و حلقه ها (منظور اجرای ادامه ی حلقه )

r00tkit
یک شنبه 02 اسفند 1388, 17:32 عصر
یادم رفت مثال بزنم




using System;
using System.Collections;
public class Garage
{

static public IEnumerable GetEnumerator()
{
int sa = 100;
for (int i = 0; i < 10; i++)
{
sa++;
Console.WriteLine(sa);
yield return i;
}

}
static void Main()
{
foreach (var i in GetEnumerator())
Console.WriteLine(i);
}
}