by value, by refrence

Misprint

New member
by value, by refrence

מה החוקיות ב C# לגבי העברות by-value ו by-reffrence? כלומר, ב cpp למשל הייתי יכול לעשות משהו כזה:
int a = 10; int b = a&;​
ואז b לא היה מקבל את הערך של a, אלא את הכתובת שלו בזכרון. כך שלמעשה ל a ו b יש את אותה כתובת בזכרון _ברגע שנשה אחד, השני ישתנה בהתאמה) המצב זהה לעבודה עם פוינטרים. עכשיו ב c# אין אפשרות לציין אם אני רוצה להעביר את הכתובת או את הערך, אז רציתי לדעת מה החוקיות של זה. למשל אם אני אעשה דבר כזה:
int a = 10; int b = a;​
אז תהיה כאן העברה by-value ויהיו לי שני אובייקטים עם כתובות שונות בגלל שמדובר ב value-type? ואם אני אעשה דבר כזה:
Hashtable hash = new Hashtable(); Hashtable hash2 = hash;​
אז תהיה לי העברה של כתובת הזכרון בלבד? (בגלל שמדובר ב ref type) ואם אני אעשה ל hash2 new, אז במקרה הזה יהיה מדובר בשני אובייקטים שונים? או שאני חייב להשתמש ב Clone בשביל זה? אם תוכלו להאיר את עיניי בנושא, אני אשמח תודה
 

J u n k y

New member
Value Type ו - Reference Type

אז ככה:יש 2 סוגי אובייקטים: Value Type ו - Reference Type. Value Type: כל מה שנגזר מ - struct, כולל int, double, char וכו'. Reference Type: כל מה שנגזר ב - class, כולל string. int הוא Value Type ולכן בדוגמה הבאה יווצרו 2 אובייקטים שונים:
int a = 10; int b = a;​
כנ"ל בהעברת פרמטרים לפונקציות. לעומת זאת, בדוגמה הבאה, יווצרו 2 מצביעים לאותו אובייקט:
string s1 = "hello"; string s2 = s1;​
מצביעים כמו ב - CPP אפשריים רק בבלוקים שמוגדרים unsafe, שבהם ה - Garbage Collector לא נוגע באובייקטים עד ליציאה מהבלוק. הפונקציה Clone משכפלת את האובייקט ומחזירה מצביע לאינסטנס של האובייקט החדש, וזו הדרך ליצור 2 אובייקטים שונים.
 

Misprint

New member
ומה לגבי

כשאני עושה new לשני אובייקטים? למשל
SomeClass a = new SomeClass(); SomeClass b = new SomeClass(); b = a;​
זה ישנה משהו? האם new משמעותה פשוט להקצות זכרון?
 

J u n k y

New member
new יוצר אובייקט חדש

ומחזיר את הכתובת שלו. לאחר השורה השניה יש 2 אובייקטים בזכרון. השורה השלישית דורסת את כתובת המצביע של b ומציבה בו את הכתובת של a. בשלב הזה, האובייקט שעליו הצביע b קודם נותר ללא מצביע ומיועד לאיסוף ע"י ה - GC.
 
למעלה