PDA

View Full Version : سوال: کلمه کلیدی استاتیک



rezacode
یک شنبه 01 شهریور 1394, 14:17 عصر
سلام دوستان
لطفا کمک کنید
من در سی شارپ معنی کلمه static رو درست متوجه نمیشم. یک فایده اش اینه که اگر متد یا متغیری رو استاتیک تعریف کنیم دیگه نمیخواد برای دسترسی بهش نمونه سازی کرد.
ولی یک فایده دیگه هم یک جا خوندم که گفته بود برای انتقال اطلاعات از یک فرم به یک فرم دیگه مفیده. اینو نمیفهمم
لطفا جواب بدید ممنون

rg_BlackRose
یک شنبه 01 شهریور 1394, 15:43 عصر
سلام

متغر استاتیک به متغیری گفته میشه که از زمان اجرای برنامه تا زمان خاتمه، در حافظه قرار میگیره و فضا اشغال میکنه.



به این مثال توجه کنید.

وقتی شما یک کلاس تعریف میکنید
مثلا:

public Class Test()
{

}


با اینکه این کلاس رو تعریف کردید، ولی تا زمان قبل از نمونه سازی این کلاس، در حافظه سیستم جایی برای این کلاس درست نشده و آدرسی هم نداره. یعنی قبل از نمونه سازی نمیتونید از این کلاس استفاده کنید. چون این کلاس در واقع وجود نداره و ساخته نشده. حتی وقتی که برنامه در حال اجرا هست.

حالا اگر همین کلاس رو به صورت استاتیک تعریف کنید.

public static Class Test()
{

}


در این صورت با اجرای برنامه این کلاس در حافظه قرار میگیره، در صورتی که شما از این کلاس نمونه سازی نکردید.(این خاصیت کلاس های استاتیک هست که نمونه سازی نمیشن.).
ولی شما از هر جای برنامه میتونید به این کلاس دسترسی داشته باشید. حتی از فرم های مختلف یا کلاسهای دیگه.(فقط کافی هست که فضای نامی کلاس "NameSpace" رو بدونید.).

حال فرض کنید شما یک متغر با نام "X" درون این کلاس تعریف کردید.

public static Class Test
{
public static int X;
}


و در فرم شماره یک به این متغیر مقدار بدید(مثلا 7)،

Test.X = 7;

حالا اگر فرم شماره یک رو ببندید(با فرض اینکه فرم شماره یک فرم اصلی برنامه نیست و با بستن اون برنامه خاتمه پیدا نمیکنه.) و فرم شماره دو رو باز کنید. میتونید به مقدار اون متغیر دسترسی پیدا کنید(یعنی همون 7).

int x = Test.X;


استفاده کلاس ها و متغیرهای استاتیک، مزایا و معایبی داره که با توضیحات بالا میتونید بهش بهش برسید. بارزترین مزیتش از هرجای برنامه قابل دسترس بودنش هست. و بارزترین عیبش هم اینه که از اول اجرای برنامه تا خاتمه برنامه در حافظه سیستم فضا اشغال میکنه. به خاطر همین عیبش هم توصیه میشه که تا زمان نیاز پیدا نکردن ازش استفاده نشه.

مطالب زیادی در موردش وجود داره، و روشهای تعریف و چگونگی استفاده ازش رو هم میتونید با جستجو در همین سایت پیدا کنید.

موفق باشید

rezacode
یک شنبه 01 شهریور 1394, 15:53 عصر
ممنون
یک سوال : اگه فقط متغیر رو استاتیک تعریف کنیم ولی کلاسش رو استاتیک نذاریم بازم همه اینایی که گفتی برقراره؟
کلا چه فرقی داره که خود کلاس هم استاتیک باشه یا اینکه فقط متد و متغیرهاش استاتیک باشن؟
ممنون

rg_BlackRose
یک شنبه 01 شهریور 1394, 16:12 عصر
ممنون
یک سوال : اگه فقط متغیر رو استاتیک تعریف کنیم ولی کلاسش رو استاتیک نذاریم بازم همه اینایی که گفتی برقراره؟


در صورتی که این کار رو بکنید، حتی با نمونه سازی اون کلاس نمیتونید به متغیر(ها) یا متد (های) استاتیک اون کلاس دسترسی پیدا کنید.
تنها روش استفاده از اون متغیر یا متد اینه که بدون نمونه سازی از اون کلاس و تنها با نوشتن نام اون کلاس به اون متغیر یا متد برسی.

سطح دسترسی کلاس و متد(ها) و متغیر(های) کلاس استاتیک باید public باشه. در غیر اینصورت باز هم نمیشه به اون(ها) دسترسی داشت.

در کلاس(های) استاتیک نمیشه متد(ها) و متغیر(های) غیر استاتیک تعریف کرد.

نمیشه از کلاسهای استاتیک مشتق گرفت(نمیشه از کلاسهای استاتیک ارثبری کرد.).

موفق باشید

rezacode
یک شنبه 01 شهریور 1394, 17:29 عصر
ممنون
گفتی متغیر استاتیک از اول برنامه تا آخرش میمونه تو حافظه. سوالم اینه اگه متغیر استاتیکی درون کلاس غیر استاتیکی داشته باشیم تو این حالت چطور میشه؟ این متغیر استاتیک از کی وارد حافظه میشه؟

rg_BlackRose
یک شنبه 01 شهریور 1394, 23:02 عصر
سلام



اگه متغیر استاتیکی درون کلاس غیر استاتیکی داشته باشیم تو این حالت چطور میشه؟ این متغیر استاتیک از کی وارد حافظه میشه؟

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

الان شاید بپرسید به چه دردی میخوره(اگه متغیر استاتیکی درون کلاس غیر استاتیکی داشته باشیم).

این روش اشتباه نیست. چون خود مایکروسافت بارها در کتابخانه دات نت از این گونه توابع استفاده کرده.

برای مثال شی object رو در نظر بگیرید:

با نوشتن object و قرار دادن یک نقطه در جلوی اون به چند تا تابع میرسید که تابع Equals() هم جز این دسته از توابع هست.

این هم تابع Equals() از کلاس object:

public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}



موفق باشید.