Struct

NetShadow

New member
Struct

אני מבין שבעצם Struct הוא כמו Class, ניתן להגדיר לו משתנים ומתודות, שניהם עם או בלי הרשאות גישה, ניתן להגדיר לו Ctor, אז מה בעצם ההבדל בינו לבין Class ? אלו הם הבדלים היחידים שעמדת עליהם : * ב Struct לא ניתן להגדיר Ctor ברירת מחדל, ב Class מותר * Struct מוגדר ב Stack, ואילו Class מוגדר ב Heap 2 שאלות ברשותכם, 1. האם אלו ההבדלים היחידים, או שיש עוד ? 2. ראיתי דוגמאות שבהם בעת הגדרת משתנה מסוג Struct, משתמשים ב new. למיטב הבנתי אין צורך ב new, אלא אם יש ל Struct בנאי, וה new בעצם מפעיל אותו. (ועדיין, למרות ה new, ההקצאה היא מה Stack) - האם מדוייק ?
 

gilad g

New member
תשובות

1. אני חושב שזהו
2. צריך new, אם אתה רוצה ליצור instance חדש של ה-struct. או שלא הבנתי אותך נכון
 

NetShadow

New member
דוגמא :

Struct Point { public int x; public int y; } Point BigPoint; BigPoint.x = 5;​
הקוד הבא יעבוד, נוצר משתנה חדש בשם BigPoint והמשתנה x שלו קיבל את הערך 5, ללא שום צורך ב new...
 

gilad g

New member
בעצם

הקוד הזה אומר אותו דבר כמו
Point BigPoint = new Point();​
מתחת לפני השטח, #C קוראת לבנאי הדיפולטי (default constructor, כלומר בנאי ללא פרמטרים) במידה ויש כזה. אם אין, יש שגיאת קומפילציה, אני חושב.
 

NetShadow

New member
../images/Emo41.gif לא ברור... + טעות

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

yaakov77

New member
new

משמש לקריאה לבנאים,בדיוק כפי שסברת. אם לא תשתמש בnew תצטרך להציב בכל member בנפרד.
 

NetShadow

New member
שאלה נוספת : מה משמעות הרשאות הגישה

לאובייקט ?
public class Test { private int _x; public SetX(int x) { _x = x; } }​
מה היה קורה אילו במקום השורה : public class Test היה כתוב : private class Test
מה משמעות הגבלת הגישה ברמה של מחלקה ? (אולי Private לא יאפשר למחלקות מחוץ ל Namespace לגשת אליה ?)
 

NetShadow

New member
../images/Emo41.gif כלומר...

1. למחלקה שאינה בתוך מחלקה אחרת, אין בכלל משמעות להרשאה גישה ? 2. אם לא כותבים הרשאת גישה, האם Public הוא ברירת המחדל ?
 

NetShadow

New member
שאלה נוספת : פרמטרים ללא סוף :

קראתי שניתן לכתוב פונקציה/מתודה ב #C שיכולה לקבל מספר פרמטרים שאינו מודל, ואינו קבוע מראש, ע"י השימוש במילה השמורה params.
Func(params int[] arr)​
אני מבין ש Func יכול לקבל כמות פרמטרים משתנים, שכולם מסוג int, ובעצם מתייחסים אליהם כאל מערך. השאלה היא מה ההבדל בין הדוגמא שנתתי, לבין הצורה שבה נוהגים לכתוב את Main :
static void Main(string[] args)​
גם כאן המתודה יכולה לקבל מספר לא מוגדר מראש של פרמטרים, במקרה הזה מסוג string. אבל גם אין את המילה params. מדוע ? מה ההבדל ? מתי כן צריך params ומתי לא ?
 

yuval k

New member
params

מתי צריך להשתמש ב-params? מתי שאתה לא יודע מה מספר הפרמטרים שתקבל. ב-Main אין צורך להשתמש ב-params מהסיבה שלא האפליקציה קוראת לה, אלא ה-CLR, כשהוא מאתחל את האפליקציה - והוא כבר מכין לך מערך של מחרוזות ומעביר אותו בתור args. זה לא כמו לקבל מספר משתני string.
 

NetShadow

New member
../images/Emo41.gif So ?

אבל מדוע שה Main תוגדר שונה ? לפחות למען הסטנדרטיות, היה ראוי להוסיף לה את המילה params. אז מה עם ה CLR קורא לה ומכין את המערך ? יכולתי לומר שגם לפונקציה שלי, האפליקציה קוראת, וגם אז המנוע שדואג להעביר את השליטה לפונקציה, ידאג ליצור מערך...
 

NetShadow

New member
שאלה נוספת : this

אני מבין את המשמעות של this, הצבעה/ייחוס לאובייקט הנוכחי (מועבר גם כפרמטר נסתר), אבל אילו שימושים יש לו ? הדוגמא היחידה שראיתי שהוא שימושי בה היא כאשר מתודה מקבלת פרמטר ששמו זהה ל Data Member שלתוכו רוצים להציב, אז כותבים this.x = x האם this שימושי במצבים רציניים יותר / אחרים ?
 

yuval k

New member
כן -

1. אם אתה צריך להעביר רפרנס לאובייקט הנוכחי, אתה מעביר את this. 2. אם אתה רוצה להגדיר שיהיה ניתן לגשת לסוג הנתונים ע"י indexer (כמו למערך), אתה יכול לכתוב getter/setter עבור this. 3. כמו שציינת - כדי להבדיל משתנים שהם חברי מחלקה ממשתנים שהועברו כפרמטרים לפונקציה
 

NetShadow

New member
שאלה נוספת : מחלקה מקוננת

דוגמא :
Public class A { int a; Public class B { int b; } } למיטב ידיעותי, אם מחלקה B מוגדרת בתוך מחלקה A, אך כ
Public
ניתן ליצור מופע שלה, גם מחוץ ל A. האם נכון ? אם כן, האם זה לא עקום ? הרי טווח החיים שלה צריך להיות רק בתוך A...​
 

NetShadow

New member
../images/Emo41.gif לא הבנתי...

אם יש לי מחלקה B תוך מחלקה A, כאשר שניהם Public. האם מחוץ למחלקה A,אני יכול להגדיר מופע של המחלקה B ?
 

yaakov77

New member
בוודאי

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