none
שאלה לגבי דלגטים RRS feed

  • שאלה

  • יש לי את הקוד הבא

    class Program { public delegate void Printer(); static void Main(string[] args) { List<Printer> printers = new List<Printer>(); int i = 0; for (; i < 10; i++) { printers.Add(delegate { Console.WriteLine(i); }); } foreach (var printer in printers) { printer(); } Console.Read(); } }

    שתי שאלות
    1. מדוע יודפס 10 פעמים הספרה 10?

    2. ואם בכז הייתי רוצה לשנות כך שיודפס אחד עד עשר עם כמה שפחות שינויים, איך הייתי עושה זאת


    יום שלישי 04 אוגוסט 2020 15:53

תשובות

  • היי אופיר,

    מודפס 10 פעמים המספר "10" מכיוון שהמשתנה i הוא Captured. ז"א, כאשר אתה ניגש אליו ב- Lambda expression לא נוצר העתק שלו עם הערך הנוכחי באיטרציה, אלא ממש reference אליו. וכאשר אתה מריץ את ה- foreach, הערך של המשתנה i הוא כבר 10. מכיוון שלכל ה- Lambda Expressions יש reference לאותו משתנה, והערך של המשתנה הוא "10", זה מה שיודפס.

    אם תרצה להדפיס מ- 1 עד 10, אז תוכל לשמור משתנה לוקלי:

    for (; i < 10; i++)
    {
    		var j = i;
    		printers.Add(delegate { Console.WriteLine(j); });
    }

    שים לב למשתנה j שנוצר פה. הוא גם המשתנה שמעבירים ל- Lambda Expression (במקום i). מכיוון שבכל איטרציה נוצר משתנה חדש עם ערך ספציפי, הפלט יהיה המספרים מ- 0 עד 9.

    כאן תוכל לקרוא עוד על Capturing:

    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions


    • נערך על-ידי Moaid Hathot יום רביעי 05 אוגוסט 2020 21:12
    • הוצע כתשובה על-ידי pituachMVP, Moderator יום חמישי 13 אוגוסט 2020 04:09
    • סומן כתשובה על-ידי pituachMVP, Moderator יום ראשון 27 ספטמבר 2020 23:08
    יום רביעי 05 אוגוסט 2020 21:12