שני הסנטים שלי למילת המפתח תשואה ב- C #

מילת המפתח תשואה, שהוצגה לראשונה ב- C # 2.0, T מחזירה אובייקט המיישם את הממשק המספרי IE. ממשק IEnumerable חושף IEnumerator שיכול להשתמש בו כדי לחזור על אוסף לא גנרי באמצעות לולאת foreach ב- C #. אתה יכול להשתמש במילת המפתח תשואה כדי לציין שהשיטה או אביזר ה- get בו נעשה שימוש היא איטרטור.

ישנן שתי דרכים בהן ניתן להשתמש במילת המפתח תשואה: שימוש במשפטים "תשואה תשואה" והצהרת "תשואת תשואה". התחביר של שניהם מוצג להלן.

yield return ;

yield break;

מדוע עלי להשתמש במילת המפתח תשואה?

מילת המפתח תשואה יכולה לעשות איטרציה מלאה של המדינה, הצורך ליצור אוסף זמני. במילים אחרות, כשמשתמשים במשפט "תשואה תשואה" בתוך איטרטור, אינך צריך ליצור אוסף זמני כדי לאחסן נתונים לפני שהוא חוזר. אתה יכול לנצל את הצהרת התשואה לתשואה כדי להחזיר כל אלמנט באוסף אחד בכל פעם, ואתה יכול להשתמש בהצהרת "תשואה תשואה" עם איטרטורים בשיטה או באבטחת get.

שים לב שהבקרה מוחזרת למתקשר בכל פעם שמתקיימת ומבוצעת הצהרת "תשואה תשואה". והכי חשוב, בכל שיחה כזו, המידע על המצב של ה- callee נשמר כך שהביצוע יכול להימשך מיד לאחר הצהרת התשואה כאשר הבקרה חוזרת.

בואו נסתכל על דוגמא. קטע הקוד הבא ממחיש כיצד ניתן להשתמש במילת המפתח תשואה להחזרת מספר פיבונאצ'י. השיטה מקבלת מספר שלם כארגומנט המייצג את ספירת מספרי פיבונאצ'י לייצר.

static IEnumerable GenerateFibonacciNumbers(int n)

       {

           for (int i = 0, j = 0, k = 1; i < n; i++)

          {

               yield return j;

               int temp = j + k;

               j = k;

               k = temp;

           }

       }

כפי שמוצג בקטע הקוד לעיל, המשפט "תשואה תשואה j;" מחזירה את מספרי פיבונאצ'י בזה אחר זה מבלי לצאת מלולאת "עבור". במילים אחרות, המידע הממלכתי נשמר. כך ניתן לקרוא לשיטת GenerateFibonacciNumbers.

foreach (int x in GenerateFibonacciNumbers(10))

   {

       Console.WriteLine(x);

   }

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

שים לב שמתחת לכיסויים מילת המפתח תשואה יוצרת מכונת מדינה לשמירה על מידע מצב. ה- MSDN קובע: "כשמגיעים להצהרת החזר תשואה בשיטת האיטרטור, מוחזר הביטוי והמיקום הנוכחי בקוד נשמר. ההפעלה מופעלת מחדש מאותה מיקום בפעם הבאה שקוראים לפונקציית האיטרטור."

יתרון נוסף בשימוש במילת המפתח תשואה הוא שהפריטים המוחזרים נוצרים רק על פי דרישה. כדוגמה, ה- access access הבא מחזיר את המספרים הזוגיים בין 1 ל -10.

public static IEnumerable EvenNumbers

       {

           לקבל

           {

               עבור (int i = 1; i <= 10; i ++)

               {

                   אם ((i% 2) == 0)

                   תשואה תשואה i;

               }

           }

       }

תוכל לגשת למאפיין הסטטי EvenNumbers כדי להציג את המספרים הזוגיים בין 1 ל -10 בחלון המסוף באמצעות קטע הקוד המופיע למטה.

foreach (int i in EvenNumbers)

     {

         Console.WriteLine(i);

     }

אתה יכול להשתמש במשפט "הפסקה תשואה" בתוך איטרטור כאשר אין עוד ערכים להחזרה. הצהרת "הפסקת התשואה" משמשת לסיום המניין.

public IEnumerable GetData(IEnumerable items)

{

   if (null == items)

       yield break;

   foreach (T item in items)

       yield return item;

}

עיין ברישום הקוד לעיל. שים לב כיצד מתבצעת בדיקה האם הפרמטר "פריטים" אפס. כשאתה קורא לשיטת GetData () בתוך איטרטור ועם פרמטר null, הפקד פשוט חוזר למתקשר מבלי שיוחזר שום ערך.

נקודות לזכור

כשאתה עובד עם מילת המפתח תשואה, עליך לזכור את הנקודות הבאות:

  • לא ניתן להחזיק את הצהרת ההחזר על התשואה בבלוק מנסה לתפוס אם כי אתה יכול לקבל אותה בתוך חסימה לנסות סוף סוף
  • אינך יכול לקבל את הצהרת שבירת התשואה בתוך חסימה סופית
  • סוג ההחזר של השיטה בה נעשה שימוש בתשואה צריך להיות IEnumerable, IEnumerable, IEnumerator או IEnumerator
  • לא ניתן לכלול בשיטתך פרמטר ref או out שבו נעשה שימוש בתשואה
  • אינך יכול להשתמש בהצהרות "תשואה תשואה" או בהצהרת "תשואת תשואה" בשיטות אנונימיות
  • אינך יכול להשתמש במשפטים "תשואת תשואה" או הצהרות "תשואת תשואה" בשיטות "לא בטוחות", כלומר בשיטות המסומנות במילת המפתח "לא בטוחה" כדי לציין הקשר לא בטוח.