بررسی کلمات کلیدی Const و ReadOnly در سی شارپ
نویسنده: مهدی ملائیان
تاریخ: ۱۳۹۷/۰۲/۱۶ ۸:۱۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
| Constant | ReadOnly |
| میتواند به Fieldها و همچنین localها اعمال شود. | تنها به Field ها اعمال میشود. |
| مقدار دهی اولیه آن الزامی است. | مقدار دهی اولیه میتواند هنگام تعریف و یا در درون سازنده انجام شود (در هیچ متد دیگری امکان پذیر نیست). |
| تخصیص حافظه انجام نمیشود و مقدار آن در کدهای IL گنجانده میشود (توضیح در ادامه مطلب). | تخصیص حافظه بصورت داینامیک انجام میشود و میتوانیم در زمان اجرا مقدار آن را بدست آوریم. |
| ثابتها در #C بصورت پیش فرض از نوع static هستند. بدین معنا که از طریق نام کلاس قابل دسترسی هستند. | تنها از طریق وهله سازی از یک کلاس قابل دسترسی هستند. |
| نوعهای درون ساز (built in) و Null Reference ها را میتوان بصورت const تعریف کرد. Boolean,Char, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double, Decimal , string. | مشابه Constant ها |
| مقدار آن در طول عمر یک برنامه ثابت است. | مقدار آن میتواند در هنگام فراخوانی سازنده برای وهلههای مختلف متفاوت باشد. |
| فیلدهای const را نمیتوان بصورت پارامترهای out و ref استفاده کرد. | فیلدهای ReadOnly را میتوان بصورت پارامترهای ref و out در درون سازنده استفاده کرد. |
const int field_constant = 10; //constant field
static void Main(string[] args)
{
const int x = 10, y = 15; //constant local :correct
const int z = x + y; //constant local : correct;
const int a = x + GetVariableValue();//Error
}
public static int GetVariableValue()
{
const int localx = 10;
return 10;
}
class Program
{
public const int numberOfDays = 7;
public readonly double piValue = 3.14;
static void Main(string[] args)
{
}
}
public const int numberOfDays = 7; public readonly double piValue = 3.14;
static void Main(string[] args)
{
var readEx = new MyLib.TestClass();
var readConstValue = MyLib.TestClass.numberOfDays;
var readReadOnlyValue = readEx.piValue;
} .method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 17 (0x11)
.maxstack 1
.locals init ([0] class [MyLib]MyLib.TestClass readEx,
[1] int32 readConstValue,
[2] float64 readOnlyValue)
IL_0000: nop
IL_0001: newobj instance void [MyLib]MyLib.TestClass::.ctor()
IL_0006: stloc.0 //readEx
IL_0007: ldc.i4.7 //ارزش ذخیره شده در کد
IL_0008: stloc.1 //readConstValue
IL_0009: ldloc.0 //readEg
IL_000a: ldfld float64 [MyLib]MyLib.TestClass::piValue
IL_000f: stloc.2 //readReadOnlyValue
IL_0010: ret
} // end of method Program::Main public class ReadonlyStatic
{
public static readonly string x = "Hi";
public static readonly string y;
public ReadonlyStatic()
{
//y = "Hello"; This is wrong
}
static ReadonlyStatic()
{
y = "Hello";
}
} | ReadOnly | Static |
| هم در زمان تعریف و هم از طریق سازنده میتوان آن را مقدار دهی کرد. | در زمان تعریف و تنها از طریق سازنده static میتوان آن را مقدار دهی کرد. |
| مقدار بر اساس مقادیری که در سازندهها تعیین میشود متفاوت است. | مقادیر بعد از مقدار دهی اولیه تغییر نمیکنند. |
چه زمانی از Const و چه زمانی از ReadOnly استفاده کنیم :