با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن ، با دوره کامل آموزش #C در خدمت شما دوستان هستیم . در قسمت قبل در رابطه با Partial ها و کاربرد آنها توضیح دادیم. در این قسمت قصد داریم شما را کلمه کلیدی Static در #C و سازنده Static در #C آشنا کنیم.
#C مثل سایر زبان های برنامه نویسی مانند C ++، جاوا و … شامل کلمه کلید Static می باشد که می توان در کلاس ها، متغیرها، متد ها، خواص، عملگرها، رویدادها و سازندگان استفاده کرد، ولی ، نمی توان آن را با indexers، destructors یا انواع غیر از کلاس ها استفاده کرد.
کلمه کلیدی static یک مورد را غیر قابل اثبات می سازد، به این معنی است که نمی توان اشیاء static را نمونه سازی کرد. اگر کلمه کلیدی static به یک کلاس اعمال شود، این کلاس نمیتواند با استفاده از کلمه کلیدی new اثبات شود.
اگر کلمه کلیدی static به یک متغیر، متد یا پراپرتی یک کلاس اعمال شود، می توان به آنها بدون ایجاد یک شیء از کلاس دسترسی پیدا کرد، فقط از className.propertyName، className.methodName استفاده می کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public static class MyStaticClass { public static int myStaticVariable = 0; public static void MyStaticMethod() { Console.WriteLine("This is a static method."); } public static int MyStaticProperty { get; set; } } class Program { static void Main(string[] args) { Console.WriteLine(MyStaticClass.myStaticVariable); MyStaticClass.MyStaticMethod(); MyStaticClass.MyStaticProperty = 100; Console.WriteLine(MyStaticClass.MyStaticProperty); } } |
خروجی :
1 2 3 | 0 This is a static method. 100 |
در مثال بالا، MyStaticClass یک کلاس استاتیک با متغیر، متد و پراپرتی استاتیک است. میتوان به تمام موارد ایستا با استفاده از className بدون ایجاد یک شی از آن، دسترسی پیدا کرد ، به عنوان مثال MyStaticClass.MyStaticMethod .
همچنین ممکن است یک کلاس دارای متدها ، پراپرتی ها و … غیر استاتیک باشد. شما می توانید کلاس موارد غیر استاتیک را با استفاده از کلمه کلیدی new استفاده کنید، ولی، متغیر نمونه فقط می تواند به متدها و متغیرهای غیر استاتیک دسترسی پیدا کند و نمی تواند به متدها و متغیرهای ایستا دسترسی پیدا کرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class MyNonStaticClass { private static int myStaticVariable = 0; public static void MyStaticMethod() { Console.WriteLine("This is static method."); } public void myNonStaticMethod() { Console.WriteLine("Non-static method"); } } |
در مثال فوق، با نمونه گیری از کلاس میتوان به متد MyNonStaticClass دسترسی پیدا کرد. اما، شما نمیتوانید به موارد استاتیک دسترسی پیدا کنید. به شکل زیر دقت کنید :
یک کلاس استاتیک یا غیر استاتیک می تواند سازنده ایستا داشته باشد بدون هیچ گونه تعیین نوع دسترسی مانند public, private protected و … .
یک سازنده استاتیک در کلاس غیر استاتیک تنها یک بار زمانی اجرا می شود که کلاس برای اولین بار نمونه سازی شده باشد.
یک سازنده استاتیک در یک کلاس استاتیک تنها یک بار زمانی اجرا می شود که هر یک از اعضای استاتیک آن برای اولین بار اجراء شوند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public static class MyStaticClass { static MyStaticClass() { Console.WriteLine("Inside static constructor."); } public static int myStaticVariable = 0; public static void myStaticMethod() { Console.WriteLine("This is static method."); } public static int MyStaticProperty { get; set; } } class Program { static void Main(string[] args) { MyStaticClass.myStaticVariable = 100; MyStaticClass.MyStaticProperty = 200; MyStaticClass.myStaticVariable = 300; MyStaticClass.MyStaticProperty = 400; } } |
خروجی :
1 | Inside static constructor |
در مثال فوق، ما چندین بار به متغیر و پراپرتی داخل کلاس دسترسی پیدا کردیم، اما سازنده استاتیک با اولین مقدارهی متغیر ، تنها یک بار اجراء شد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class MyNonStaticClass { static MyNonStaticClass() { Console.WriteLine("Inside static constructor."); } public void myNonStaticMethod() { Console.WriteLine("Non-static method"); } } class Program { static void Main(string[] args) { MyNonStaticClass mnsObj1 = new MyNonStaticClass(); MyNonStaticClass mnsObj2 = new MyNonStaticClass(); MyNonStaticClass mnsObj3 = new MyNonStaticClass(); } } |
خروجی :
1 | Inside static constructor |
در مثال فوق، ما MyNonStaticClass را سه بار تکرار میکنیم، اما سازنده استاتیک با اولین نمونه سازی، تنها یک بار اجراء شد.
همانطور که می دانید، قسمت های اصلی حافظه نرم افزار را stack و heap تشکیل داده اند. اعضای استاتیک در یک ناحیه ویژه درون پشته ای با نام High Frequency Heap ذخیره می شوند. اعضای استاتیک کلاسهای غیر استاتیک نیز در پشته ذخیره می شوند و در همه نمونه های کلاس به اشتراک گذاشته می شوند.
بنابراین تغییرات انجام شده توسط یک نمونه در تمام موارد دیگر منعکس خواهد شد.
همانطور که قبلا ذکر شد، یک زیرمجموعه ثابت فقط میتواند به سایر زیرمجموعه های استاتیک دسترسی پیدا کند ، زیرا اعضای استاتیک بدون ایجاد یک نمونه استفاده می شوند و بنابراین نمیتوانند به اعضای غیر استاتیک دسترسی پیدا کنند.
تصویر زیر نشان می دهد که چگونه موارد ایستا در حافظه ذخیره می شوند:
در این بخش با کلمه کلیدی static و کاربرد آن در زبان #C آشنا شدید ، در بخش بعدی در مورد متدهای Anonymous توضیح خواهیم داد.
بهرام
مطالب بیان شده بسیار جامع بوده و بسیار قابل فهم بیان شده اند، تشکر
پی وی لرن
با سلام
ممنون، نظر لطف شماست