Farhad Nosrati فرهاد نصرتی
Farhad Nosrati فرهاد نصرتی
خواندن ۵ دقیقه·۳ سال پیش

static در #C ( سی شارپ )

برای هر نوع پروسه‌ای که در آن بارگذاری می‌شود RAM به سه قسمت تقسیم می‌گردد : Stack ، Heap و Static (استاتیک در دات نت در حقیقت قسمتی از Heap است که به آن High Frequency Heap نیز گفته می‌شود ).

این قسمت استاتیک حافظه، محل نگهداری متدها و متغیرهای استاتیک است. آن متدها و یا متغیرهایی که نیاز به نمونه سازی از کلاس برای ایجاد ندارند، به صورت استاتیک ایجاد می‌گردند. در سی شارپ از واژه کلیدی static برای معرفی آن‌ها کمک گرفته می‌شود. برای مثال:

گفته شد که کامپایلر تضمین می کند هیچ شی ای (object) از نوع کلاس های استاتیک (static class) ساخته نشود و فراخوانی اعضای کلاس از طریق نام کلاس انجام می شود.

کلاس استاتیک ( Static class )

از دیدگاه کلی یک کلاس استاتیک (static class) مانند یک کلاس غیر استاتیک (none static class) است با همان بدنه و تعاریف ، هر چند در بین تعریف این دو نوع از کلاس (class) تفاوت ها یی وجود دارد :

قبل از کلمه کلید class از کلمه کلیدی static استفاده می شود.

از یک کلاس استاتیک (static class) نمی توان نمونه (instance) و یا شی (object) ایجاد کرد به عبارت دیگر استفاده از کلمه کلیدی new برای ایجاد و مقدار دهی متغیری (شی) از نوع  داده یک کلاس استاتیک(static class) بی معنا است. در این نوع از کلاس  یعنی کلاس استاتیک (static class) برای دسترسی به اعضای کلاس (members) مانند ، فیلد ها (fields) و متد ها (methods) از نام کلاس استاتیک (static class)  استفاده می شود .

مثال : فراخوانی یک متد (method) با دسترسی عمومی (public) در یک کلاس استاتیک (static class).

● تمامی اعضای یک کلاس استاتیک (static class) از نوع استاتیک (static) هستند. در واقع یک کلاس استاتیک (static class) را می توان مخزنی از متد های استاتیکی (static methods) دانست که برای انجام عملی که به منظور انجام آن بوجود آمده اند تنها با پارامترهای ورودی خود ، کار می کنند .

● کلاس استاتیک (static class)  مهر وموم شده (sealed) هستند در نتیجه نمی توان از انها ارث (inheritance) برد.

● کلاس استاتیک (static class)  نمی تواند از هیچ  کلاسی ارث بری (inheritance) داشته باشند بجز کلاس object ( تمام کلاس ها به صورت مستقیم و غیر مستقیم از کلاس object ارث بری داند)

● کلاس استاتیک (static class) نمی توانند سازنده (constructor )  غیر استاتیک داشته باشند البته  قطعا از سازنده استاتیک (static constructor) می توانند برای مقدار دهی متغیر های استاتیک خود استفاده کنند

نکته :

یک کلاس استاتیک (static class) مانند یک کلاس غیر استاتیک (none static class) با سازنده خصوصی (private constructor) است  که تمامی اعضای داده ای (data members) واعضای تابعی (functional members) در آن از نوع استاتیک (static) تعریف شده باشند. در این حالت سازنده  خصوصی (private constructor) می تواند تضمین کننده این باشد که هیچ شی ای از این  کلاس ساخته  نشود.  اما در مورد یک کلاس استاتیک (static class) این برتری  وجود دارد که کامپایلر تضمین می کند که هیچ شی ای (object) از یک کلاس استاتیک(static class) ساخته نمی شود، در کنار خصوصیات دیگری که در بالا از ان ها نام برده شد.


اعضای استاتیک ( Static members )

● اعضای استاتیک (static members) نه تنها در کلاس های استاتیک (static class) قابل استفاده هستنند بلکه در کلاس های غیر استاتیک (none static class) نیز می توانند تعریف شوند.

● متد های استاتیک (static methods) و خصوصیات استاتیک (static properties) نمی توانند دربدنه خود به فیلدهای غیراستاتیک (none static fields) و یا رخدادهای غیراستاتیک (none static events) و یا شی (object) تعریف شده در بدنه کلاس دسترسی داشته باشند مگر اینکه به صورت پارامتر به ان ها ارسال شوند.

● اعضای غیر استاتیک (none static members) می توانند دربدنه خود به اعضای استاتیک (static members)  دسترسی داشته باشند .

تفاوت اعضای استاتیک و غیراستاتیک

● اعضای استاتیک (static members) بین تمامی شی های یک کلاس مشترک هستند و مقدار ان ها در بین تمامی شی های یک کلاس مشترک است. به عبارت دیگر متعلق به کلاس هستند .

● اعضای غیر استاتیک متعلق به شی های ایجاد شده هستند نه کلاس.

فیلدهای استاتیک :

نکته :

دو تا از موارد استفاده از فیلد های استاتیک :

• در نگه داشتن  تعداد شی های ایجاد شده از یک نوع داده کلاس درسی شارپ

• نگه داشتن مقادیر مشترک بین تمام نمونه های ایجاد شده از یک نوع داده کلاس درسی شارپ

متد های استاتیک :

نکته

● در کلاس استاتیک میتوانیم متود overloading داشته باشیم و تو کلاس عادی هم میتونیم کلاس استاتیک overloading داشته باشیم .

● متد های استاتیک (static methods) می توانندoverload شوند اما نمی توانند override شوند. زیرا انها متعلق به کلاس هستند و نه یک شی. ( در رابطه با overloading و overriding در مقالات بعدی بحث خواهد شد. )

● سی شارپ از متغیرهای استاتیک (static variables) که به صورت محلی در بدنه متدهای استاتیک (static methods) و غیراستانیک (none static methods) ، تعریف می شوند حمایت نمی کند و ایجاد خطای زمان کامپایل می کند.

● از نظر سرعت اجرا بین دو تا متد استاتیک (static method) و غیراستاتیک (none static) با بدنه یکسان ، متد استاتیک (static method) یک مقدار سریع تر اجرا می شود. زیرا در فراخوانی متد غیراستاتیک ، باید غیر نال بودن شی (object) نیز چک شود که زمان بیشتری را به اجرا تحمیل می کند. هرچند اختلاف زمانی در بیشتر موارد بسیار ناچیز است

نکته‌ی مهمی که در اینجا وجود دارد این است که متدهای استاتیک تنها قادر به استفاده از متغیرهای استاتیک تعریف شده در سطح کلاس هستند.

دوستان عزیز ، خیلی ممنون که وقت گران قدرتونو گذاشتید و تا به اینجا همراهیم کردید .

اگه اشتباه مفهومی داشتم یا ایراد تایپی داشتم یا ایراد توضیح داشتم خیلی خوشحال میشم بهم بگید تا اصلاح کنم .

مخلصیم ...

staticdotnetcoreسی شارپ
https://github.com/nosratifarhad
شاید از این پست‌ها خوشتان بیاید