14. readonly and const

[נכתב ע”י עידו גוטרמן]

קיימים שני סוגים של קבועים שבהם נרצה להשתמש

Compile-time constants

1
public const int myCompileTimeConstValue = 6;

בזמן קומפילציה מומר הcompile time const לערך. הIL אינה מכירה את הקבוע הנ"ל.

כמו כן ניתן להגדיר קבועים רק לPrimitive Types. למשל קטע הקוד הבא לא יתקמפל :

1
public const DateTime myDate = new DateTime(1987 , 1 , 22);

נציין כי חסכון בזמן ריצת התוכנית (זניח בהשוואה לRuntime consts). בנוסף לרב, שימוש בconsts יצור assembly גדול יותר ( כיוון שהIL מחליף ref לפרמטר בערך עצמו)

נשתמש בconst כאשר נרצה לבצע

  1. שימוש בEnums
  2. אתחול ctors של Attributes באמצעות consts
  3. Primitive constant (שאינו משתנה בין גרסאות)

Run-time constants

הקבוע מוגדר במקום בזיכרון הניתן להשמה רק בזמן הctor. ז"א שיהיה מקום בזיכרון שיאחסן את הקבוע ובזמן הJIT הוא יומר לקוד.

1
public static readonly int myRuntimeConstValue = 66;

נשתמש בRuntime constants כאשר

  1. נרצה להגדיר קבועים מטיפוס reference types
  2. הקבועים שלנו יכולים להשתנות בין גרסאות ( למשל מיקום קובץ דיפולטי) – ראה דוגמא בסוף
  3. נוכל להשתמש בRuntime constant שאינו סטטי על מנת להגדיר קבועים שונים למחלקות שונות

סיכום

באופן כללי נעדיף תמיד להשתמש בRuntime constants על פני Comiple Time constants. הפגיעה בביצועים היא זניחה לעומת הגמישות שהדבר נותן. ( ראה טבלה )

לדוגמא

הקבועים myCompileTimeConstValue וmyRuntimeConstValue מוגדר בassembly – myCommonConstants.dll , והאפליקציה MyApp.exe משתמשת בהם.

כאשר נחליף את ערך הקבועmyCompileTimeConstValue . נצטרך לקמפל נצטרך לקמפל מחדש את הmyCommonConstants.dll

ואת כל הassemblies שמשתמשים בו(!).

כאשר נשנה את הערך myRuntimeConstValue נצטרך לקמפל מחדש רק את הmyCommonConstants.dll

מצ"ב טבלה

מקור

Comments and Recommendations const readonly Usage
Use const. Primitive types that will never change should be const. Yes Yes Primitive constant
Use static readonly. Any constant value that might change should be readonly, not const. Yes Yes Release Dependent const, primitive type
Use static readonly. It’s the only one that works. No Yes Other constants
Use (instance) readonly. It’s the only option, and immutability is enforced by the compiler. No Yes Immutable members
Enumerated values must be const. Yes No Enumerated values
These must be constants. Yes No Values used to construct attributes
שתף