עבור לתוכן

פרמטר ref out

Featured Replies

פורסם

יש סרטון וידאו בעברית שמסביר על הפרמטרים האלו?

תודה.

פורסם
  • מחבר

אז מישהו יכול להסביר לי מה הפרמטרים

האלו עושים?

פורסם

קראת את שני המדריכים? הם מסבירים די בבירור. אם יש משהו ספציפי שלא הבנת אז תאמר מה.

פורסם
  • מחבר

קראת את שני המדריכים? הם מסבירים די בבירור. אם יש משהו ספציפי שלא הבנת אז תאמר מה.

לא הבנתי את זה המשתנים הבסיסיים (int, double, long וכו') עוברים לפונקציות by value כברירת המחדל

ומזה by value? ומה זאת אומרת המשתנה המקורי מועבר לפונקצייה ולא העתק שלא.

מזה המקורי ומזה העתק?

פורסם

בדיוק להיפך. By value אומר שהערך של המשתנה מועתק לתוך משתנה חדש, ולפונקציה אין גישה למשתנה המקורי שהועבר אליה.

פורסם

קודם כל קצת תיאוריה:

כאשר אתה "קורא" לפונקציה, מועברים עליה ערכים כפרמטרים.

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

לדוגמא:

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 בדר"כ, לטיפוסים "לא-פרימיטיביים" יש בלאגן קצת שונה ;) )

פורסם

כתבת אותו דבר בדיוק על ref ועל out... חוץ מזה, יש עוד הבדלים ביניהם (כפי שמוסבר בלינקים שנתתי קודם).

פורסם
  • מחבר

כתבת אותו דבר בדיוק על ref ועל out... חוץ מזה, יש עוד הבדלים ביניהם (כפי שמוסבר בלינקים שנתתי קודם).

למה הכוונה המשתנה צריך להיות מאותחל?

פורסם

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

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 הפונקציה היא זו שחייבת לתת לו ערך.

פורסם

שניצל - צודק, טעות עריכה. :silly:

פורסם
  • מחבר

קשה לי להבין את זה תיאורתי.

מישהו יכול להסביר לי איך זה מתבצע באופן

מעשי?

פורסם

מה יש עוד להסביר? כבר נתנו לך עשרים דוגמאות.

פורסם
  • מחבר

לא הבנתי מזה ערך,אובייקט.ומזה מחלקה?

פורסם

הרעיון הוא פשוט - כאשר אתה רוצה שפונקצי התוכל לשנות את הערך אותו היא מקבלת, עליך לציין זאת ע"י אחת המילים השמורות 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 (ארגומנט אקטואלי).

אם יש עדיין משהו לא ברור, תמשיך לשאול - אל תתביש.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים