עבור לתוכן

סוג ערך וסוג ייחוס|C#

Featured Replies

פורסם

לא כ"כ הבנתי מה זה סוג ערך ומה זה סוג ייחוס...

אני אודה לכם אם תסבירו לי מה זה ומה ההבדל ביניהם. :xyxthumbs:

פורסם

אני מניח שאתה מדבר על value type ו-reference type.

טיפוסי הפניה (reference types) הם סוגי משתנים שלא באמת מכילים את המידע שאליו הם מתייחסים, אלא הם מכילים התייחסות (מה שקרוי גם מצביע) למקום כלשהו בזכרון שבו יושב המידע. לעומתם, טיפוסי ערך (value types) מכילים עותק של המידע עצמו.

מה זה אומר?

נסתכל על ההגדרות הבאות:

int x =1;
int[] a = new int[10];
int y = x;
int[] b = a;

הגדרנו את x,y כמשתנים מטיפוס int (שהוא טיפוס ערך), ואת a,b כמשתנים מטיפוס []int (מערך של int, שהוא טיפוס הפניה). שתי השורות הראשונות פשוט מגדירות את x ו-a ומאתחלות אותם. השורות הבאות מגדירות את y ו-b ושמות בהם את ערכי x ו-a. אבל, כאן נכנס ההבדל בין טיפוס ערך לטיפוס הפניה: ההשמה y=x מעתיקה את הערך של x לתוך y, בעוד שההשמה b=a רק גורמת לכך ש-b כעת מצביע על אותו מערך כמו a. כלומר, כל שינוי ב-a (פרט להשמה של ערך חדש ב-a) יגרור שינוי ב-b, כי הם למעשה מצביעים לאותו אובייקט. לדוגמה, הפקודות הבאות יגרמו להדפסה של 10:

a[1] = 10;
Console.WriteLine(b[1]);

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

void func(int[] arr, int num) {
num = 5;
arr[0] = 10;
}

כעת, נניח שנבצע את הקוד הבא:

func(a, x);
Console.WriteLine("{0},{1}", a[0], x);

מה יודפס? התשובה היא שיודפסו המספרים 10,1, ולא כפי שהיה ניתן לצפות 10,5. הסיבה לכך היא ש-x הוא טיפוס ערך, ולכן כשהוא מועבר לפונקציה, הערך שלו מועתק למשתנה חדש בשם num. ההשמה num=5 רק משנה את num, ולא את המשתנה x. לעומת זאת, כש-a מועבר לפונקציה, המצביע למערך מועתק למשתנה arr, כלומר arr מצביע על אותו מערך כמו a, ולכן שינוי ב-arr הוא גם שינוי ב-a.

אם היינו רוצים "לתקן" את ה"באג" שיש לנו בפונקציה (כלומר לדאוג שהיא תוכל לשנות את x) אז גם יש דרך לעשות את זה, באמצעות המילה המיוחדת ref.

איזה טיפוסים הם טיפוסי ערך ואיזה הם טיפוסי הפניה? כל הטיפוסים הפרימיטיביים (byte,short,int,long,float,double,boolean,char) ומבנים שהוגדרו באמצעות המילה struct הם טיפוסי ערך. כל הטיפוסים האחרים - מערכים או מחלקות שהוגדרו באמצעות class - הם טיפוסי הפניה. לדוגמה, object ו-string הם מחלקות רגילות, ולכן הם טיפוסי הפניה.

פורסם
  • מחבר

תודה! עכשיו זה הרבה יותר ברור :xyxthumbs:

ארכיון

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

דיונים חדשים