העברת this כREF בC#

tseliot

New member
העברת this כREF בC#

כיצד ניתן להתגבר על אי היכולת של העברת this כREF בC#, במקרה בו אוביקט שמחלקה מכילה אמור לקבל את אותה המחלקה כפרמטר,ואני מעונין שהוא יקבל כפרמטר את אותה המחלקה עצמה? לדוגמא, נניח שיצרתי מחלקה שמציירת ראש, ואז בניתי גם מחלקה שמציירת את השיער, וכמובן שרציתי שהשיער תמיד יהיה מונח על הראש,לכן גרמתי לשיער לשמור הפנייה לראש ולקבל ממנו את הקוארדינטות שהוא צריך כדי לצייר
 

tseliot

New member
סליחה על הניסוח, אולי דוגמא תעזור

class Head { private Hair itsHair; public double X; public double y; public Head(double X,double Y) { x=X; y=Y; itsHair=newHair(ref this);//not Allowed } } class Hair { private Head itsHead; public Hair(ref Head NewHead) {itsHead=NewHead;} public double X { get { return itsHead.x; } } public double y { get { return itsHead.y; } } }
 

itaym02

New member
להוריד את המילה REF

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

tseliot

New member
להוריד את הref ימנע את השגיאה, אבל

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

tseliot

New member
אני מודה בטעותי ../images/Emo13.gif

אבל היכן שגיתי- חשבתי שכאשר מעבירים ארגומנט בלי המילה ref הדבר גורם ליצירת עותק של האוביקט ולא העברת האוביקט המקורי, האם טעיתי, ואם כן מה כן נכון? תודה רבה
 

itaym02

New member
נכון בהחלט רק שבמקרה זה

הארגומנט הוא handle לאובייקט (ניתן לומר כתובת בזכרון - למרות שאני לא בטוח שזה נכון לומר בC#). ולכן כאשר עברה הכתובת בזכרון - המטודה יכלה לפנות לאובייקט המקורי.
 

tseliot

New member
איך אני יודע אם מועברת Handle

האם כל אוביקט פרט לValue Types מעביר את הHandle שלו?
 

tseliot

New member
מדוע ישנו איסור על העברת this כref?

אם ההנחה היא שthis תמיד יהיה אוביקט שאינו value type, הרי ממילא הוא מעביר handle- מה האיסור הזה בא למנוע?
 

זהר פלד

New member
אובייקטים תמיד עוברים כ reference,

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

itaym02

New member
אם את מכירה פונטרים בC זה יעזור

המשמעות של העברת THIS כREF יכולה להתפרש כנסיון שינוי של כתובת בזכרון בדרך ישירה. C# היא שפה בטוחה, ולכן זה לא אפשרי.
 

itaym02

New member
ממש לא - למרות שC# זו נכדה של C

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

סומבודי

New member
שגית.

כשמעבירים אובייקט מסוג reference ללא המילה ref, לא נוצר עותק שלו. כל שינוי שתבצע על האובייקט, יתבצע על האובייקט המקורי. הסיבה היחידה לשימוש ב-ref היא כאשר אתה רוצה להקצות על ה-reference אובייקט חדש בתוך הפונקציה.
 

סומבודי

New member
הרחבה

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