מילות המפתח 'readonly' ו-'const'
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C# של Coddy. שיעור 16 מתוך 70.
ב-C# יש שתי מילות מפתח ליצירת ערכים שאי אפשר לשנות: const ו-readonly. אף ששתיהן מונעות שינוי, הן פועלות באופן שונה ומשמשות למטרות שונות.
יש לאתחל שדה const בעת ההכרזה עליו, והערך שלו נקבע בזמן הקומפילציה. הוא סטטי באופן מרומז, כלומר שייך למחלקה ולא למופעים שלה:
public class GameSettings
{
public const int MaxPlayers = 4;
public const double Gravity = 9.81;
}ניגשים לקבועים דרך שם המחלקה: GameSettings.MaxPlayers. קבועים פועלים רק עם טיפוסים פרימיטיביים, מחרוזות ו-null, מכיוון שהמהדר חייב לדעת את הערך המדויק.
לשדה readonly ניתן להקצות ערך בזמן ההכרזה או בבנאי, וערכו נקבע בזמן הריצה:
public class Player
{
public readonly string Id;
public readonly DateTime CreatedAt = DateTime.Now;
public Player(string id)
{
Id = id;
}
}בניגוד ל-const, שדות readonly יכולים להכיל כל סוג ויכולים לקבל ערכים שונים בכל מופע. לאחר שהבנאי מסתיים, לא ניתן לשנות את הערך.
השתמשו ב־const עבור ערכים שהם אוניברסליים באמת ולעולם לא ישתנו, כמו קבועים מתמטיים. השתמשו ב־readonly עבור ערכים שיש להגדיר פעם אחת, אך הם עשויים להשתנות בין אובייקטים או לדרוש חישוב בזמן ריצה.
אתגר
קלבואו נבנה מערכת תצורה לסימולציית פיזיקה שמדגימה מתי להשתמש ב-const עבור קבועים אוניברסליים, לעומת readonly עבור ערכים שנקבעים פעם אחת בזמן הריצה.
תיצרו שני קבצים כדי לארגן את הקוד:
PhysicsConstants.cs: הגדירו מחלקה בשםPhysicsConstantsבמרחב השמותSimulation. המחלקה צריכה להכיל קבועים אוניברסליים שאינם משתנים לעולם וזהים בכל מקום:- שדה
constבשםGravityשערכו9.81 - שדה
constבשםSpeedOfLightשערכו299792458 - מחרוזת
constבשםGravityUnitשערכה"m/s^2"
- שדה
Projectile.cs: הגדירו מחלקה בשםProjectileבמרחב השמותSimulation. לכל קליע יש ערכים שצריכים להיקבע פעם אחת בעת יצירתו ולא להשתנות לאחר מכן:- שדה
readonlyבשםName(מחרוזת) - שדה
readonlyבשםInitialVelocity(מספר ממשי) - שדה
readonlyבשםLaunchAngle(מספר ממשי, במעלות) - בנאי שמקבל את שלושת הערכים וקובע אותם
- מתודה
GetMaxHeight()שמחשבת את הגובה המרבי באמצעות הנוסחה:(velocity^2 * sin^2(angle)) / (2 * gravity). השתמשו ב-Math.Sin()והמירו מעלות לרדיאנים על ידי הכפלה ב-Math.PI / 180
- שדה
Program.cs: בקובץ הראשי, צרו קליע באמצעות ערכי הקלט והציגו את קבועי הפיזיקה לצד הגובה המרבי שחושב עבור הקליע.
תקבלו שלושה קלטים:
- שם הקליע
- מהירות התחלתית (ב-m/s)
- זווית השיגור (במעלות)
הדפיסו את הפלט בפורמט הבא:
Gravity: {Gravity} {GravityUnit}
Speed of Light: {SpeedOfLight} m/s
Projectile: {Name}
Initial Velocity: {InitialVelocity} m/s
Launch Angle: {LaunchAngle} degrees
Max Height: {maxHeight} mעגלו את הגובה המרבי ל-2 ספרות אחרי הנקודה העשרונית באמצעות Math.Round(value, 2).
לדוגמה, אם הקלטים הם Rocket, 50 ו-45, הפלט צריך להיות:
Gravity: 9.81 m/s^2
Speed of Light: 299792458 m/s
Projectile: Rocket
Initial Velocity: 50 m/s
Launch Angle: 45 degrees
Max Height: 63.71 mנסו בעצמכם
using System;
using Simulation;
class Program
{
public static void Main(string[] args)
{
// קראו את הקלטים
string name = Console.ReadLine();
double velocity = Convert.ToDouble(Console.ReadLine());
double angle = Convert.ToDouble(Console.ReadLine());
// TODO: צרו אובייקט Projectile עם ערכי הקלט
// TODO: הדפיסו את הקבועים הפיזיקליים (כוח הכבידה עם יחידת מידה, מהירות האור)
// TODO: הדפיסו את פרטי הקליע (שם, מהירות התחלתית, זווית השיגור)
// TODO: חשבו והדפיסו את הגובה המרבי (מעוגל ל-2 ספרות אחרי הנקודה העשרונית)
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמרחבי שמות והנחיותמבוא למחלקות ולאובייקטיםמילת המפתח 'this'מתודות ופרמטריםשדות לעומת מאפייניםבנאיםאתחול אובייקטיםסיכום – מחשבון פשוט4ירושה
תחביר ירושה בסיסית (:)מילת המפתח 'base'מילות המפתח Virtual ו-Overrideמחלקות Sealedמחלקת הבסיס 'object'סיכום – היררכיית עובדים7תכונות מתקדמות
העמסת אופרטוריםאינדקסרים (this[])דריסת ToString()מתודות הרחבהסיכום – רשימה מותאמת אישית2מאפיינים וחברים סטטיים
מאפיינים במימוש אוטומטימאפיינים לקריאה בלבד ולכתיבה בלבדשדות ומתודות סטטייםמחלקות סטטיותחברים עם גוף ביטוי5פולימורפיזם וממשקים
פולימורפיזם בזמן קומפילציה לעומת בזמן ריצהממשק לעומת מחלקה מופשטתממשקים מרוביםממשקים מפורשיםהמרה כלפי מעלה והמרה כלפי מטהחזרה: מחשבון צורות8מושגים מתקדמים בתכנות מונחה עצמים
קומפוזיציה במקום ירושהGenerics (מחלקות ומתודות)נציגים ואירועיםמאפיינים ורפלקציהIDisposable והצהרת usingיסודות הזרקת תלויות3ארכיטקטורת מחלקות
נתוני מופע לעומת נתונים סטטייםמילות המפתח 'readonly' ו-'const'שדות גיבויסיכום – מנהל חשבונות בנקתרגלו בעצמכם: קומפיילר C# אונליין