פורסם 2012 בנובמבר 2113 שנים סרטון? אני בספק... אבל יש מדריכים בעברית.http://webmaster.org.il/articles/csharp-parameters-ref-outhttp://www.underwar.co.il/1-Programming/d104/24/נ.ב. תערוך את הכותרת ותוסיף את השפה שאתה מדבר עליה.
פורסם 2012 בנובמבר 2113 שנים קראת את שני המדריכים? הם מסבירים די בבירור. אם יש משהו ספציפי שלא הבנת אז תאמר מה.
פורסם 2012 בנובמבר 2113 שנים מחבר קראת את שני המדריכים? הם מסבירים די בבירור. אם יש משהו ספציפי שלא הבנת אז תאמר מה.לא הבנתי את זה המשתנים הבסיסיים (int, double, long וכו') עוברים לפונקציות by value כברירת המחדלומזה by value? ומה זאת אומרת המשתנה המקורי מועבר לפונקצייה ולא העתק שלא.מזה המקורי ומזה העתק?
פורסם 2012 בנובמבר 2113 שנים בדיוק להיפך. By value אומר שהערך של המשתנה מועתק לתוך משתנה חדש, ולפונקציה אין גישה למשתנה המקורי שהועבר אליה.
פורסם 2012 בנובמבר 2113 שנים קודם כל קצת תיאוריה: כאשר אתה "קורא" לפונקציה, מועברים עליה ערכים כפרמטרים. לצורך ההבהרה - ישנה הפרדה בין "ארגומנטים אקטואליים" - שהם הערכים אותם הפונקציה מקבלת בזמן הקריאה אליה, לבין "ארגומנטים פורמאליים" שהם המשתנים השייכים לפונקציה. לדוגמא: public static void function ( int par1, double par2, object par3){ Console.WriteLine("Hello, world");}public static int main (string args[]){ int arg1 = 1; double arg2 = 2; object arg3 = GetSomeObject(); function(arg1,arg2,arg3); return 0;} ארגומנטים פורמאליים, הם par1, par2, par3 (כפי שהם מופיעים בהגדרת הפונקציה), ואילו הארגומנטים האקטואליים הם arg1,arg2,arg3. ההבדל בין call-by-value (לסוגיו) לבין call-by-ref, הוא בשאלת הקשר בין הארגומנטים הפורמליים והארגומנטים האקטואליים: call-by-value משמעו בעיקרון, כי רק הערך של המשתנים זהה אבל מדובר בשתי ישויות שונות בזיכרון. call-by-ref משמעו, כי רק המשתנים זהים, והם אותה ישות בזיכרון. מה משותף ל ref ול out: שניהם call-by-ref: בשני המקרים, שינוי של הערך בתוך הפונקציה, יגרור שינוי מחוץ לפונקציה. שניהם "עובדים" על משתנים: אתה לא יכול לשלוח את הערך הקבוע 5 (או כל ערך קבוע) כארגומנט אקטואלי. ההבדל בין ref ל out: ref: המשתנה צריך להיות מאותחל לפני הקריאה לפונקציה. out: (תוקן, ח' כסלו תשע"ג בשעה 23:34) המשתנה צריך להיות מאותחל בתוך הפונקציה (לאו דווקא "מאותחל", אלא שצריך לשים בו ערך כלשהו, יעני שהוא ישמש l-value). אם אתה רוצה לראות דוגמאות חביבות, יש לmicrsofot אתר מצויין - ה msdn. (הערה לסיום: כל זה נכון לטיפוסים "פרימיטיביים" שמועברים by-value בדר"כ, לטיפוסים "לא-פרימיטיביים" יש בלאגן קצת שונה )
פורסם 2012 בנובמבר 2113 שנים כתבת אותו דבר בדיוק על ref ועל out... חוץ מזה, יש עוד הבדלים ביניהם (כפי שמוסבר בלינקים שנתתי קודם).
פורסם 2012 בנובמבר 2213 שנים מחבר כתבת אותו דבר בדיוק על ref ועל out... חוץ מזה, יש עוד הבדלים ביניהם (כפי שמוסבר בלינקים שנתתי קודם).למה הכוונה המשתנה צריך להיות מאותחל?
פורסם 2012 בנובמבר 2213 שנים זאת אומר שחייבים לשים במשתנה ערך כלשהו לפני שמעבירים אותו לפונקציה. נגיד, אם יש לך פונקציה כזו:void f(ref int x) { x *= x;}אז הקוד הזה הוא לא חוקי:void g() { int x; f(ref x);}אבל הקוד הזה כן חוקי:void g() { int x = 10; f(ref x);}ההבדל בין ref ל-out הוא שב-ref חייבים לתת ערך למשתנה לפני שמעבירים אותו לפונקציה, וב-out הפונקציה היא זו שחייבת לתת לו ערך.
פורסם 2012 בנובמבר 2213 שנים מחבר קשה לי להבין את זה תיאורתי.מישהו יכול להסביר לי איך זה מתבצע באופןמעשי?
פורסם 2012 בנובמבר 2213 שנים הרעיון הוא פשוט - כאשר אתה רוצה שפונקצי התוכל לשנות את הערך אותו היא מקבלת, עליך לציין זאת ע"י אחת המילים השמורות ref או out.ההבדל הוא ב"רעיון" שמאחורי המליה השמורה, ולכן באופן השימוש שלה:ref:נועד להעביר משתנה קיים, שיש לו ערך ומשמעות גם ברגע זה, ופשוט "לעדכן" אותו.out:נועד למעשה להחזיר ערך מפונקציה, על-גבי הפרמטר הנשלח.דוגמא לשימוש:public static void getSizeOfCStringViaOut (char str[], out uint size){ for(size = 0; str[size] != '\0'; size++);}public static void getSizeOfCStringViaRef (char str[], ref uint size){ for(size = 0; str[size] != '\0'; size++);}public static void Main(string args[]){ char[] str = "hello!"; int OutLen; int RefLen = 0; getSizeOfCStringViaOut(str, out OutLen); getSizeOfCStringViaRef(str, ref RefLen);}באופן "מעשי" מה שקורה הוא call-by-reference:השם בו הפונקציה מכירה את המשתנה (ארגומנט פורמאלי), הוא רק "שם נרדף" למשתנה האמיתי שנמצא ב main (ארגומנט אקטואלי).אם יש עדיין משהו לא ברור, תמשיך לשאול - אל תתביש.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.