[נכתב ע”י עידו גוטרמן]
קיימים שני סוגים של קבועים שבהם נרצה להשתמש
Compile-time constants
|
|
בזמן קומפילציה מומר הcompile time const לערך. הIL אינה מכירה את הקבוע הנ"ל.
כמו כן ניתן להגדיר קבועים רק לPrimitive Types. למשל קטע הקוד הבא לא יתקמפל :
|
|
נציין כי חסכון בזמן ריצת התוכנית (זניח בהשוואה לRuntime consts). בנוסף לרב, שימוש בconsts יצור assembly גדול יותר ( כיוון שהIL מחליף ref לפרמטר בערך עצמו)
נשתמש בconst כאשר נרצה לבצע
- שימוש בEnums
- אתחול ctors של Attributes באמצעות consts
- Primitive constant (שאינו משתנה בין גרסאות)
Run-time constants
הקבוע מוגדר במקום בזיכרון הניתן להשמה רק בזמן הctor. ז"א שיהיה מקום בזיכרון שיאחסן את הקבוע ובזמן הJIT הוא יומר לקוד.
|
|
נשתמש בRuntime constants כאשר
- נרצה להגדיר קבועים מטיפוס reference types
- הקבועים שלנו יכולים להשתנות בין גרסאות ( למשל מיקום קובץ דיפולטי) – ראה דוגמא בסוף
- נוכל להשתמש ב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 |