ABA


"שאלה של מתחיל ב C#"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15821 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15821
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק, 2 נקודות
   00:27   16.04.10   
אל הפורום  
  שאלה של מתחיל ב C#  
 
   יש את המילה השמורה out שכל הקטע בה הוא נגיד לשלוח לפונקציה פרמטרים(גם לא מאותחלים) ולבצע בהם השמה..
כדי לשאול את השאלה שלי אני אמחיש עם דוגמא..
נניח שיש לי class obj ואני מייצר מופע שלו בmain לצורך הדוגמא..

obj sampleObj;

doSomething(out sampleObj);

public void doSomething(out obj o_Obj)
{
if(something)
{
o_Obj = new obj(6);
}
else
{
o_Obj = new obj(7);
}
}


סתם כתבתי דוגמא חסרת משמעות..
במקרה כזה הקומפיילר נותן שגיאת קומפילציה אבל אני יודע(בתור המתכנת) שהמשתנה ששלחתי הולך לקבל ערך על בטוח בסוף הפונקציה.
אני לא רוצה לעשות את ה new בהתחלה עם ctor ריק כי זאת אופציה לעקוף את השגיאה..אבל אם כבר אני משתמש בפעולה out אני לא מחפש קומבינות איך לעקוף אותה..
יש דרך לתת לעקוף את זה עם מילה שמורה נוספת..שתגיד לקומפיילר "וידאתי את העניין והוא בטוח הולך לקבל ערך בפונקציה"?
אני יודע שאפשר עם ref לפתור את הבעיה..אבל שוב זה עוד קומבינה..

ואם כבר אז שאלה אחרונה..נניח שאני כותב struct מסוים..נגיד Point..הוא לא טיפוס של reference type ולכן אם נניח אני רוצה להעביר reference למתודה אני משתמש ב ref..אבל בכללי אם ה point היה class שיצרתי ולא struct הוא אוטומטית refernce type בלי שאני אצטרך לרשת explictly מ object?
כאילו האם


public class Point <-> public class Point:object ?

תודה רבה..סתם שאלות של מתחיל ב C#..


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  OUT וREF זה לטיפוסים שהם VALUE TYPE לא של הפניה ronen333  16.04.10 00:53 1
     אני הבנתי מה הם VeNom  16.04.10 09:02 2
         חחח כן לא כל כך קראתי מה שכתבת ronen333  16.04.10 09:24 3
             האמת שאני לא בא משום תחום VeNom  16.04.10 09:33 4
                 תקרא את העריכה שלי. ronen333  16.04.10 09:38 5
                     זה כבר נושא מת..עשיתי כל מיני שינויים VeNom  16.04.10 09:41 6
                         לא, לא היה לי בעיה עם OUT שלא הצלחתי לפתור ronen333  16.04.10 09:44 7

       
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   00:53   16.04.10   
אל הפורום  
  1. OUT וREF זה לטיפוסים שהם VALUE TYPE לא של הפניה  
בתגובה להודעה מספר 0
 
   אתה יכול לאתחל אווביקט גם בלי OUT, ביגלל שהוא REFERENCE.
אני לא מבין למה אתה בכלל עושה את זה..
REF נועד להעביר "מצביע" לפונקציה כדי לערוך שינויים למשתנים מטיפוס VALUE.
OUT זה בדיוק כמו REF רק שניתן לאתחל איתו משתנה.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק, 2 נקודות
   09:02   16.04.10   
אל הפורום  
  2. אני הבנתי מה הם  
בתגובה להודעה מספר 1
 
   ותודה על התגובה..אבל בתכלס לא ענית לי על אף אחד מהשאלות הספציפיות ששאלתי..
אשמח אם תענה ממוקד עליהם..כי רק שם אני צריך חידוד..
וסתם נתתי לך דוגמא של מקרה..נניח יש לי class Pixel שכולל 4chars...
עכשיו אני מעביר אותו לפונקציית אתחול כפרמטר out מבלי לעשות לו new..
בקיצור ולעניין בפונקציה יש לי 2 מצבים של if\else כאשר בשניהם יש אתחול של הפיקסל אבל עם ערכים אחרים.
הקומפיילר יצעק כי מבחינתו הוא לא יודע אם הPixel שלי יאותחל..כל מה שהוא יודע זה שהוא בבלוק של if\else..השאלה שלי אם יש keyword נוסף ל out שאומר לקומפיילר "אני אחראי על זה שהוא יאותחל" ושיגרום לקומפיילר להתעלם מהמקרה הזה?

תודה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   09:24   16.04.10   
אל הפורום  
  3. חחח כן לא כל כך קראתי מה שכתבת  
בתגובה להודעה מספר 2
 
   ערכתי לאחרונה בתאריך 16.04.10 בשעה 09:38 בברכה, ronen333
 
בלי לפגוע, פשוט עשיתי משהו אחר תוך כדי אז הסתכלתי נטו על הקוד.

עכשיו קראתי ועדיין ולא כל כך הבנתי מה אתה שואל.אז תנסה להסביר שוב..

OUT מספיק כדי להודיע לקומפילר שהוא יאותחל בתוך הפונקציה (כפי שאמרתי זה בדיוק כמו ref רק כשאתה מודיע לקומפילר שזה בסדר שהוא לא מאותחל כבר).

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

לזה אתה מתכוון?


static void aa(out Object a,int b,int c)
{
if (b > c)
a = new Object();
else
a = new Object();
}
static void Main(string args)
{
Object a;
aa(out a,5,6);
}

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

עכשיו לגבי השאלת ירושה מOBJECT, תדע שכל דבר בעולםםםםםםםםם בC# יורש מOBJECT. כדי להגיד שמשהו הוא VALUE TYPE יהיה REFERENCE אתה לא צריך להוסיף נקודותיים OBJECT אלא פשוט להמיר את אותו טיפוס לOBJECT.
נגיד יש int a
ואתה רוצה להתחשב בו כאוביקט אז אתה עושה
(object)a;
עריכה:
האמת שזה לא כזה מדויק, זה נקרא לעשות BOXING.. תקרא על זה בMSDN או וויקיפדיה.
נ.ב-אני מבין שאתה בא מC/C++ שמת PROTOTYPE בתוכנית שלך בC#? זה מיותר.. בC# תחום ההכרה של הפונקציות הוא גם למעלה וגם למטה (כל המסמך).


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק, 2 נקודות
   09:33   16.04.10   
אל הפורום  
  4. האמת שאני לא בא משום תחום  
בתגובה להודעה מספר 3
 
   אבל כן עשיתי קורסים ב c c++ ו JAVA..ככה שיש לי קצת ניסיון בתכנות..
עכשיו לגבי הירושה מ object הייתי בטוח שרק בref types יש ירושה..ז"א שב structs כמו int וטיפוסים חדשים שאני יוצר אין את זה..

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   09:38   16.04.10   
אל הפורום  
  5. תקרא את העריכה שלי.  
בתגובה להודעה מספר 4
 
   ותביא דוגמה לקוד שעושה לך בעיה..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק, 2 נקודות
   09:41   16.04.10   
אל הפורום  
  6. זה כבר נושא מת..עשיתי כל מיני שינויים  
בתגובה להודעה מספר 5
 
   בקוד..אני כבר לא זוכר..
אתה אף פעם לא נתקלת בבעיות עם out?
ז"א אני רואה שאתה עובד הרבה ב c#..גם בפלטפורמות של XNA..אז בטח יש לך יותר ניסיון ממני בשפה..
ואני אקרא את העריכה..תודה..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   09:44   16.04.10   
אל הפורום  
  7. לא, לא היה לי בעיה עם OUT שלא הצלחתי לפתור  
בתגובה להודעה מספר 6
 
   בדרך אלגנטית.
בכל מקרה אם צצה לך בעיה מוזרה כפי שתיארת תציג אותה פה ונבחון אותה ביחד ;)


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net