کلمه کلیدی readonly یک اصلاحگر است که شما می توانید آنرا رو فیلد ها استفاده کنید. وقتی اعلان فیلد شامل اصلاحگر readonly باشد، انتساب های به فیلدهایی با چنین اعلانی فقط از طریق سازنده همان کلاس و یا در هنگام اعلان می تواند اتفاق بیافتند.
مثال:
در این مثال مقدار فیلد year نمی تواند در داخل متد ChangeYear تغییر کند، هرچند یک مقدار از داخل سازنده کلاس به آن انتساب داده شده است.
class Age { readonly int _year; Age(int year) { _year = year; } void ChangeYear() { //_year = 1967; // Compile error if uncommented. } }
شما فقط در شرایط زیر می توانید مقداری را به فیلد readonly انتساب دهید:
- وقتی متغیر در هنگام اعلانش مقدار دهی اولیه شود، برای مثال:
public readonly int y = 5;
- برای یک فیلد نمونه، در سازنده های نمونه ی کلاسی که حاوی اعلان فیلد است، یا برای فیلدی static، در سازنده static کلاسی که حاوی اعلان فیلد می باشد. همچنین تنها مکان های موجود که پاس دادن فیلد های readonly مجاز می باشد، به عنوان پارامتر out یا ref است.
نکته: کلمه کلیدی readonly با کلیدواژه const تفاوت دارد. فیلد const فقط در هنگام اعلان فیلد، مقدار دهی اولیه می شود. فیلد readonly هم در زمان اعلان و هم در سازنده قابلیت مقداردهی اولیه دارد. بنابراین فیلدهای readonly می توانند بسته به تابع سازنده استفاده شده مقادیر متفاوتی داشته باشد. همچنین، درحالیکه یک فیلد const، ثابت زمان-کامپایلی است، فیلد readonly می تواند به عنوان ثابت های زمان-اجرا استفاده شود. به صورت زیر:
public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;
مثال:
public class ReadOnlyTest { class SampleClass { public int x; // Initialize a readonly field public readonly int y = 25; public readonly int z; public SampleClass() { // Initialize a readonly instance field z = 24; } public SampleClass(int p1, int p2, int p3) { x = p1; y = p2; z = p3; } } static void Main() { SampleClass p1 = new SampleClass(11, 21, 32); // OK Console.WriteLine("p1: x={0}, y={1}, z={2}", p1.x, p1.y, p1.z); SampleClass p2 = new SampleClass(); p2.x = 55; // OK Console.WriteLine("p2: x={0}, y={1}, z={2}", p2.x, p2.y, p2.z); } } /* Output: p1: x=11, y=21, z=32 p2: x=55, y=25, z=24 */
در مثال بالا اگر شما از جمله ای مانند زیر استفاده کنید:
p2.y = 66; // Error
خطای کمپایل زیر را دریافت می کنید:
The left-hand side of an assignment must be an l-value
این خطا شبیه همان خطایی است که هنگام سعی برای انتساب مقدار به یک ثابت، دریافت می شود.