یک کلاس استاتیک ( Static Class ) در واقع همان کلاس غیر استاتیک است، و فقط یک تفاوت مهم با آن دارد. یک کلاس استاتیک را نمی توانید نمونه سازی کنید. به عبارت دیگر، نمی توانید از عملگر new برای ایجاد متغیری از نوع آن کلاس استفاده کنید.
از آنجایی که در این نوع کلاسها هیچ متغیر نمونه ای وجود ندارد، شما با استفاده از نام خود کلاس به اعضای یک کلاس ثابت دسترسی دارید.
به عنوان مثال، اگر یک کلاس استاتیک ( Static Class ) به نام UClass دارید که دارای یک متد استاتیک عمومی به نام AMethod است، متد را همانطور که در مثال زیر نشان داده شده است فراخوانی می کنید:
یک کلاس استاتیک می تواند به عنوان یک فضای مناسب برای مجموعه ای از توابع استفاده شود که فقط بر روی پارامترهای ورودی کار می کنند و نیازی به دریافت یا تنظیم فیلدهای نمونه داخلی ندارند. به عنوان مثال، در کلاس System.Math که یک کلاس استاتیک است، متدهایی وجود دارند که عملیات ریاضی را بدون نیاز به ذخیره یا بازیابی داده هایی که مختص نمونه خاصی از کلاس ریاضی است، انجام می دهند. یعنی از اعضای کلاس صرفا با تعیین نام کلاس و نام متد استفاده می کنیم و نیازی به ایجاد شیع نمونه وجود ندارد.
در یک کلاس استاتیک ، سازنده استاتیک ( Constructor ) فقط یک بار فراخوانی می شود و یک کلاس استاتیک طی طول عمر دامنه برنامه ای که برنامه شما در آن قرار دارد در حافظه باقی می ماند.
اگر می خواهید یک کلاس غیر استاتیک داشته باشید که اجازه می دهد تنها یک نمونه از خود ایجاد شود، به پیاده سازی Singleton در C# مراجعه کنید.
لیست زیر ویژگی های اصلی یک کلاس استاتیک را ارائه می دهد:
یک کلاس استاتیک فقط شامل اعضای ثابت است.
کلاس استاتیک را نمی توان نمونه سازی کرد.
مهر و موم شده است.
نمی تواند شامل سازندگان نمونه باشد.
بنابراین، ایجاد یک کلاس استاتیک اساساً مشابه ایجاد کلاسی است که فقط شامل اعضای ثابت و یک سازنده خصوصی است.
یک سازنده خصوصی از نمونه سازی کلاس جلوگیری می کند.
مزیت استفاده از کلاس استاتیک این است که کامپایلر ( Compiler ) می تواند بررسی کند که هیچ عضو نمونه ای به طور تصادفی اضافه نشده باشد.
کامپایلر تضمین می کند که نمونه هایی از این کلاس نمی توانند ایجاد شوند.
کلاس های استاتیک مهر و موم شده اند و بنابراین نمی توان آنها را به ارث برد. آنها نمی توانند از هیچ کلاسی به جز Object ارث ببرند.
کلاس های استاتیک نمی توانند شامل سازنده نمونه باشند و صرفا می توانند شامل یک سازنده استاتیک باشند.
مثال
در اینجا یک مثال از یک کلاس استاتیک قرار گرفته است که شامل دو تابع است که دما را از سانتیگراد به فارنهایت و از فارنهایت به سانتیگراد تبدیل می کند:
اعضای ثابت
یک کلاس غیر استاتیک می تواند شامل متدها، فیلدها، خصوصیات یا رویدادهای استاتیک باشد.
یک عضو استاتیک بدون نیاز به ایجاد نمونه ای از کلاس قابل فراخوانی است.
یک عضو استاتیک همیشه با نام اصلی خود کلاس قابل دسترسی است نه نام نمونه ی ایجاد شده از آن.
متدها و ویژگیهای استاتیک نمیتوانند به فیلدها و رویدادهای غیراستاتیک دسترسی داشته باشند، و همچنین نمیتوانند به یک متغیر نمونه از یک شیء نمونه سازی شده دسترسی داشته باشند، اگر نیاز باشد که متغیر ها در متد استاتیک استفاده شود باید آن را به صورت پارامتر به آن متد ارسال کرد.
دو کاربرد متداول فیلدهای استاتیک عبارتند از: شمارش تعداد اشیایی که نمونهسازی شدهاند یا ذخیره مقداری که باید بین همه نمونهها به اشتراک گذاشته شود.
متدهای استاتیک را می توان بدون محدودیت بارگذاری کرد، اما نمیتوان آنها را بازنویسی کرد، زیرا آنها به کلاس تعلق دارند و نه به هیچ نمونه ای از کلاس.
توجه داشته باشید که نمی توان فیلد Const را به صورت استاتیک تعریف کرد. برای دسترسی به فیلد های Const از همان ClassName می توان استفاده کرد.
همانطور که در مثال زیر نشان داده شده است، اعضای کلاس استاتیک را با استفاده از کلمه کلیدی Static قبل از مشخص کردن نوع آن اعلام می کنند:
اعضای استاتیک قبل از دسترسی به عضو استاتیک برای اولین بار و قبل از فراخوانی سازنده استاتیک، در صورت وجود، مقدار دهی اولیه می شوند.
برای دسترسی به یک عضو کلاس ایستا، از نام کلاس به جای نام متغیر برای تعیین مکان عضو استفاده کنید، همانطور که در مثال زیر نشان داده شده است: