Menu
Coddy logo textTech

מילות המפתח '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 עבור ערכים שיש להגדיר פעם אחת, אך הם עשויים להשתנות בין אובייקטים או לדרוש חישוב בזמן ריצה.

challenge icon

אתגר

קל

בואו נבנה מערכת תצורה לסימולציית פיזיקה שמדגימה מתי להשתמש ב-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 ספרות אחרי הנקודה העשרונית)
    }
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C# אונליין