اصلاحکنندهی const را میتوان (و عموماً باید) روی هر فیلدی اعمال کرد که مقدارش در زمان کامپایل معلوم است و در طول عمر برنامه تغییر نمیکند.
private const int num = 1729;
public const string title = "Grand" + " Master";
اصلاحکنندهی readonly را میتوان (و عموماً باید) روی هر فیلدی اعمال کرد که نمیتوان آن را const کرد، به شرطی که مقدارش در طول عمر برنامه تغییر نکند و تعیین آن یا با مقداردهی اولیهی درجا انجام شود یا هنگام نمونهسازی (توسط سازنده یا متدی که سازنده فراخوانی میکند).
private readonly int num;
private readonly System.Random rand = new System.Random();
public MyClass(int num)
{
this.num = num;
}
در موقعیتهای حساس به امنیت (یا حتی صرفاً در یک کدبیس بزرگ که توسعهدهندگان اولویتها و اهداف متفاوتی دارند) نگذارید API عمومی یک کلاس با پذیرفتن و ذخیرهکردن پارامترهای تغییرپذیر یک متد، یا با آشکار کردن یک عضو تغییرپذیر آن از طریق مقدار بازگشتی یا پارامتر out، دور زده شود.
گرچه اصلاحکنندهی readonly جلوی بازنویسی مقدار یا ارجاع درون یک فیلد را میگیرد، اما از اعضای یک نوع ارجاعی محافظتی نمیکند.
readonly List<int> ints = new List<int>();
void Foo()
{
ints.Add(1); // ok
ints = new List<int>(); // fails to compile
}
برای اطمینان از محافظت همهی اعضای یک نوع ارجاعی، میتوان فیلدها را readonly کرد و ویژگیهای خودکار را بدون دسترسیدهندهی set تعریف کرد.
کتابخانهی کلاس پایه (BCL) چند نسخهی فقطخواندنی از مجموعهها را برای جاهایی فراهم میکند که لازم است جلوی بهروزرسانی اعضای یک مجموعه گرفته شود. اینها در قالب پوششهایی ارائه میشوند:
ReadOnlyDictionary<T> یک Dictionary<T> را بهصورت فقطخواندنی در دسترس قرار میدهد.ReadOnlyCollection<T> یک List<T> را بهصورت فقطخواندنی در دسترس قرار میدهد.سیستم احراز هویتی که آخرین بار در developer-privileges دیدهاید نیاز به کمی رسیدگی دارد. وظیفهی شما تمیزکاری این کد است. چنین پروژهی تمیزکاریای نه تنها زندگی را برای نگهدارندگان آینده راحت میکند، بلکه برخی آسیبپذیریهای امنیتی را آشکار میکند و برطرف میکند.
const کنیداین یک کار «بازآرایی» است. «اصلاحکننده»ی const را به هر عضوی از Authenticator یا Identity که مناسب میدانید اضافه کنید.
readonly کنیداین یک کار بازآرایی است. اصلاحکنندهی readonly را به هر فیلدی از کلاس Authenticator یا ساختار Identity که مناسب میدانید اضافه کنید.
برای هر ویژگی مناسب در کلاس Authenticator یا ساختار Identity، دسترسگر set را حذف کنید یا آن را private کنید.
در حال حاضر، فیلد هویتِ ادمین با فراخوانی Admin برگردانده میشود. این ایدهآل نیست، چون فراخواننده میتواند فیلد را تغییر دهد. راهی پیدا کنید که فراخواننده نتواند جزئیات ادمین را روی شیء Authenticator تغییر دهد.
در حال حاضر، دیکشنریای که هویتهای هاردکدشدهی توسعهدهندگان ممتاز را نگه میدارد، با فراخوانی GetDevelopers() برگردانده میشود. این ایدهآل نیست، چون فراخواننده میتواند دیکشنری را تغییر دهد. راهی پیدا کنید که فراخواننده نتواند جزئیات توسعهدهندگان را روی شیء Authenticator تغییر دهد.