By Reference / By Value

בטיטi

New member
../images/Emo41.gif By Reference / By Value

אם הבנתי נכון, שלחית משתנים פרימיטיבים (int, long וכו') המוקצים על המחסנית - מועברים By Value ואילו שליחת משתנים המוקצים על הערימה (אובייקטים למניהם) - מועברים By Reference 1. מה ההבחנה הנכונה, האם מיקום ההקצאה (Stack או Heap) קובע האם ההעברה תהיה By Val או By ref ? 2. מה לגבי Struct ולגבי String ? 3. האם הוספת ref לפני שליחת הפרמטר בעצם מעבירה מצביע ? 4. מה ההבדל בין ref ל out ?
 

rnan

New member
../images/Emo189.gif

א. נכון , REF נוגע לגבי ה HEAP מיקום ההקצאה , אם לא אמרת אחרת ( ע"י BOXING) יעשה ע"י מיקום האובייקט לדוגמא שאתה שולח DATASET לפרמטר A ואחרי זה אומר שפרמטר B שהוא גם מסוג DATASET שווה ל A אתה תכלס מעביר REF. להבדיל מערכים STRING הוא REF כי זהו מערך של תווים בזיכרון כאשר הפרמטר מכיל בתוכו את המצביע לתחילת המערך. ההבדל בין REF ך OUT OUT כיידוע פונקציה יכולה להחזיר רק ערך אחד אתה לא יכול לעשות RETURN לכמה אובייקטים ולכן נשאלת השאלה אם אני רוצה להחזיר יותר מערך אחד אז מה עושים ? אז שולחים פרמטר ומקבלים אותו ב OUT בפונקציה עכשיו : כל שינוי שיעשה לפרמטר הזה בתוך הפונקציה , יישנה את הערך המקורי שנשלח ( REF) - למרות שאתה לא מחזיר אותו בכלל לדוגמא אם יש לך פונקציה שמחזירה פרמטר A והיא קולטת OUT B OUT C אין בעיה שתחזיר את A אבל אם תשנה את B או את C זה ישנה את המשתנים המקורים שנשלחו זה מעין שיטה להחזרת יותר מערך אחד מפונקציה. REF REF אומרת לשלוח את הכתובת של המשתנה כך , ששינוי שנעשה בפונקציה על הפרמטר של הפונקציה משפיע ישירות על המשתנה ביייייייי
 

בטיטi

New member
עשית בלאגן ../images/Emo13.gif

ידידי, נסה לכתוב בצורה מסודרת, לפי החלוקה לשאלות, ולא ע"פ סגנון דיבור ו/או נאום, זה יקל על 2 הצדדים
בכל מקרה, לפי מה שבדקתי, string אינו ref, אלא מתנהג כמו int (למשל), כנ"ל struct. בנוסף, לגבי ref ו out אני לא חושב שזו הסיבה - יכולת להחזיר מספר משתנים ע"י מספר refים, לדעתי ההבדל הוא פשוט ש out הוא משתנה שחייבים לאתחל לפני השימוש, ו ref לא.
 

rnan

New member
אוופסס טעות נפלהבחלקי

סליחה , קבל תיקון על ה STRING , במהלך כתיבה חשבתבי על ה תכונת הזיכרון של מערך התווים ונכנס לי איכשהוא הכתובת, דבר שהוביל אותי לחשוב ברוב טיפשוטי שזה REF כמובן שזה VALUק ואיתך הסליחה אבל לגבי REF ן OUT , אתה טועה אני מפנה אותך ל MSDN http://msdn2.microsoft.com/en-us/vcsharp/aa336814.aspx יש שם משפט בהמשך תקרא : One way to think of out parameters is that they are like additional return values of a method. כלומר להחזיר יותר מערך אחד ( אחד התפקידים ...)
 

בטיטi

New member
תגובה :

בפועל, אתה יכול להחזיר כמה פרמטרים ממתודה, גם ע"י שימוש ב REF...
 

rnan

New member
יותר מזה

בקוד ה IL המימוש הוא זהה לחלוטין כלומר הקומפיילר מפרש זאת כשני פקודות זהות פשוט עם תנאי התחלה שונים. ( האתחול)
 

בטיטi

New member
../images/Emo41.gif שאלה נוספת : sealed

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

rnan

New member
()

יש 2 שימושים אפשר לעשות SEALED ל CLASS ול METHOD והתוצאות שונות קודם כל אל תשכח שבאירגון שיש בו אלפי מתכנתים חשוב לדעת מה לשמור לעצמך ומה לאפשר. כפי שאמרת לא יהיה אפשר לרשת את ה CLASד אבל אם יש לך שיטה שהיא SEALED , היא כן תעבור ביירושה , אבל לא יהיה אפשר לעשות לה OVER-RIDEN שימושים לדוגמא : פונקציה שמטפלת ב איזור קריטי כלשהוא תתאר לך שצוותי תת תוכנה ירשו את זה , ויעשו שינויים שיגרמו להפרת המאזן המדוייקט שכותב השיטה במקור חשב עליו מלכתחילה ולכן הוא שם את ה METHODכ SEALED ואז הוא יכול להיות בטוח שאם יהיה FUCK אצל צוות התת תוכנה , אז זה לא FUCK שלו כי הוא יודע שהם לא היו יכולים לגעת ב METHOD
 

בטיטi

New member
../images/Emo41.gif Chat at the site

מעוניין להוסיף לאתר ASP.NET 2 אייקון של Chat with support, שלחיצה עליו תפתח אצל הגולש חלון צ'אט, לשיחה עם בעל האתר. נתקלתי בשירות הזה. האם מישהו מכיר שירותים נוספים בתשלום ? בחינם ? האם יש רכיבי דוט נט / OpenSource שמאפשרים לפתח בעצמי, אך במהירות ? תודה !
 
למעלה