تا حالا فکر کردین در یک کلاس مقدار دهی یک متغیر استایک جلوی خودش چه فرقی با مقدار دهی در یک سازنده استاتیک دارد؟ شاید خیلی کاربردی نباشد ولی دانستنش خالی از لطف نیست.
در جواب باید بگم بغیر از یک از تفاوت کوچک در زمان اجرای مقدار دهی، فرقی ندارند. خوب با یک مثال بیشتر قضیه رو بررسی کنیم.
تا حالا احتمال زیاد تو مصاحبه از شما پرسیدن که پترن سینگلتون چیه؟ و اگه جواب دادین احتمالا یک کاغذ جلوی شما گذاشتن کە کدش را بنویسی.
اگه مطابق عکس بالا پیاده سازی کنید شاید مصاحبه کننده دوباره از شما بپرسد کە اگر دفعه اول مثلا همزمان ١٠ Thread بیانید و متغیر سینگلتون رو مقدار دهی کنند، اولی قفل را در اختیار میگیرد و مقدار دهی میکند ولی باز ٩ تا Thread دیگر پشت قفل گیر میکنند، راه حل چیست؟
برای حل این مشکل و استفاده نکردن از قفل باید متغیر استاتیک سینگلتون رو جلوی خودش یا در سازنده استایک مقدار دهی کنید. CLR تضمین یک بار مقدار دهی شدن فیلدهای استاتیک را میدهد.
حالا برگردیم به اصل سوال و ببینیم تفاوت در زمان اجرا چگونه است. زمانی کە فیلد را جلوی خودش مقدار دهی کنید قبل از ساخته شدن اولین نمونه از کلاس، فیلد استایک مقدار دهی خواهد شد و اگه به زبان میانی نگاه کنید یک beforefieldinit به کد اضافه شده است.
اما زمانی کە در داخل سازنده استاتیک مقدار دهی کنید یا باز خود سازنده استاتیک را اضافه کنید، فیلد استاتیک تا زمان ساخته شدن اولین نمونه از کلاس یا ارجاع به فیلد استاتیک مقدار دهی نخواهد شد و حالت Lazy پیدا میکند.
Static constructors in C# are specified to execute only when an instance of the class is created or a static member is referenced, and to execute only once per AppDomain.
برای آگاهی بیشتر در مورد پترن Singleton و beforefieldinit این پست خیلی عالی از Jon Skeet را مطالعه کنید: Implementing the Singleton Pattern in C#