פרק 11.4 — שדות מול תכונות ב־C#


Disambiguation: מה שנקרא 'תכונות' בהוראה לעומת המינוח והמשמעות ב־C# אמיתי

מטרת הדף היא לעשות דיסאמביגואציה בין מינוח שמופיע לעיתים בהוראה (“תכונות”) לבין המינוח הרשמי ב־C#: ב־C# המילה Property / תכונה היא ישות שונה מ־Field / שדה.


הרעיון בשורה אחת

ב־C#:

  • שדה (Field) הוא משתנה בתוך המחלקה (לרוב private).
  • תכונה (Property) היא “עטיפה” שנראית מבחוץ, עם get/set, ויכולה לבצע ולידציה/לוגיקה.

במשרד החינוך, לעיתים כשמבקשים לכתוב “תכונות” מתכוונים בפועל ל־שדות private (כלומר Fields), ולא ל־Properties.


דוגמה בסיסית ב־C#

רכיב #C משרד החינוך C# Code
שדה (Field)
private int age; // תכונה (משרד החינוך)
private int age; // שדה
תכונה (Property)
public int GetAge() => age;

public void SetAge(int value)
{
    if (value > 0)
      age = value;
}
public int Age // תכונה
{
  get => age;
  set
  {
    if (value > 0)
      age = value;
  }
}
דוגמה – קריאה (Get)
  // "Java style" / משרד החינוך
  int a = student.GetAge();
  
  // C# אמיתי ב Property
  int a = student.Age;
  
דוגמה – קביעה (Set)
  // "Java style" / משרד החינוך
  student.SetAge(18);
  
  // C# אמיתי ב Property
  student.Age = 18;
  

“ממשק” חיצוני לגישה/עדכון של ערך. נראה מבחוץ כמו נתון, אבל בפועל זו תחבירית פעולה/מנגנון עם get/set.


טבלה משווה — שדות מול תכונות (מטרת דיסאמביגואציה)

מונח בהוראה (עברית) המונח הרשמי ב־C# מה זה בפועל? איך מזהים בקוד? למה זה חשוב?
"תכונה" (כמו שמופיע לפעמים בדרישות) Field (שדה) משתנה פנימי במחלקה, לרוב private. זה *הנתון עצמו*. שורה כמו private int age; אם תלמיד/ה כותבים רק שדות — הם/ן עדיין לא כתבו Property. חשוב לדעת על מה בדיוק הדרישה מדברת.
"פעולות מאחזרות/קובעות" (לעיתים מדברים על get/set כ"פעולות") Property (תכונה) מנגנון גישה מבוקר לשדה (או לחישוב ערך). יכול לבצע ולידציה/לוגיקה. בלוק עם get/set או תכונה אוטומטית: public int X { get; set; } מאפשר הכמסה אמיתית: לא לחשוף שדה, לשמור על כללים (למשל גיל לא שלילי), ולשנות מימוש בלי לשבור משתמשים.
"תכונה" (במובן הכללי: תיאור של אובייקט) תלוי: Field או Property לפעמים מתכוונים לנתון פנימי, ולפעמים לדרך החיצונית לגשת אליו. מסתכלים מה מופיע בקוד בפועל. זו בדיוק הסיבה לדף הזה: לא להתבלבל בין המונחים.

כלל אצבע להוראה (שימושי בבדיקת עבודות)

אם כתוב private int x; — זה שדה (Field).

אם כתוב public int X { get; set; } או בלוק get/set — זו תכונה (Property).


הערה פדגוגית קצרה

כשנאמר בכיתה “תכונות” במובן של מה יש לאובייקט, קל להחליק למצב שבו מתכוונים לשדות. אבל בעולם של C# (וגם של OOP מודרני), תכונה (Property) היא כלי שמייצג גישה חיצונית מבוקרת — לא “סתם משתנה”.

במילים אחרות:

  • שדה = הנתון
  • תכונה = הדרך הנכונה לחשוף/לשנות את הנתון מבחוץ (או אפילו לחשב אותו)