PDA

View Full Version : مقاله: Static در C#



Keramatifar
شنبه 19 خرداد 1386, 18:29 عصر
براساس سوال یکی از دوستان مبنی بر چگونگی تعریف متغیری که در تمام فرمها قابل استفاده باشد، میخواهم در مورد کلاسها و اعضای static توضیح مختصری بدم:
یک کلاس از نوع static که بصورت نمونه زیر تعریف میشود ، خواص زیر را داراست:





public static class CompanyInfo
}
; public static string CompanyName
; public static string CompanyAddress
{

امکان گرفتن و ایجاد نمونه (Instance) از این نوع کلاس وجود ندارد.
اعضای آن تنها میتوانند از نوع static باشند.
این کلاسها sealed هستند و در نتیجه امکان وراثت و inheritance از آنها و برای آنها وجود ندارد .
نمیتوانند constructor داشته باشند ، مگر یک static constructor برای تعیین و انتصاب مقادیر اولیه .
برای ساماندهی متدهایی که با object های خاصی کار نمیکنند (مثلا متدهای کلاس Math در Sysytem namespace) میتوانید یک کلاس از این نوع ایجاد کنید با متدها و متغیرهایی از همین نوع و بدون الزام در ساختن و گرفتن object از آن کلاس ، از متدها و متغیرهای موجود در آن بطور مستقیم و با بکار بردن نام کلاس ، استفاده کنید . به مثال زیر توجه کنید :





public class Automobile
}
; public static int NumberOfWheels = 4
public static int SizeOfGasTank
}
get
}
; return 15
{
{
{} ()public static void Drive
; public static event EventType RunOutOfGas
{
و برای دسترسی به اعضا و متدها :

Automobile.Drive ;()
;int i = Automobile.NumberOfWheels




شما در یک کلاس غیر static هم میتوانید متد ،property , field یا event هایی از این نوع تعریف کنید و بدون تعریف یک instance از آن کلاس به اعضای static آن دسترسی داشته باشد . اگرچه حتی اگر instance ای هم از کلاس بسازید ، توسط آن نمیتوانید به این اعضا دسترسی پیدا کنید.
یک مثال دیگر :




public class MyBaseC
}
public struct MyStruct
}
; public static int x = 100
{
{
MyBaseC.MyStruct.x

اَرژنگ
یک شنبه 20 خرداد 1386, 20:49 عصر
براساس سوال یکی از دوستان مبنی بر چگونگی تعریف متغیری که در تمام فرمها قابل استفاده باشد، میخواهم در مورد کلاسها و اعضای static توضیح مختصری بدم:


استفاده از استاتیک ربطی به استفاده از متغیری که درر تمام فرمها قابل دسترسی باشه ندارد.

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

reza.palang
دوشنبه 21 خرداد 1386, 00:56 صبح
استفاده از استاتیک ربطی به استفاده از متغیری که درر تمام فرمها قابل دسترسی باشه ندارد.
پترن سینگلتن برایه این کار است،

به شدت موافقم.
خب حالا "پترن سینگلتن" چیه ؟؟ خوردنی؟ پوشیدنیه؟؟
درسته گفتن فارسی بنویسید. اما نه اینکه دیگه هم اینو خراب کنی هم اونو.



سوال اصلش غلط است،
چرا غلطه؟؟ یعنی یه نفر بخواد یه مقدار رو توی یه کلاس دیگه استفاده کنه باید عزا بگیره؟؟
<< توضیح: این تاپیک ادامه این و (http://barnamenevis.org/forum/showthread.php?t=69943)این (http://barnamenevis.org/forum/showthread.php?t=69995) تاپیک هست.>>


استفاده از متغیرهایه سراسری در برنامه نویسی خلاف اولین اصول برنامه نویسییست.
این روش فقط به مشکلات بیشتر مینجد.
باید میگفتی: خلاف اولین اصول برنامه نویسی شی گرا است.

باید بگم نیست. یعنی اگه 100% خلاف این اصول بود زبانی که این قابلیت رو داشت نمیگفت OO هست. بهتر بود میگفتی "... ممکن است بعضی وقت ها این اصول رو نقض کنه"

اَرژنگ
دوشنبه 21 خرداد 1386, 05:42 صبح
به شدت موافقم.
خب حالا "پترن سینگلتن" چیه ؟؟ خوردنی؟ پوشیدنیه؟؟
درسته گفتن فارسی بنویسید. اما نه اینکه دیگه هم اینو خراب کنی هم اونو.

OK



چرا غلطه؟؟ ینی یه نفر بخواد یه مقدار رو توی یه کلاس دیگه استفاده کنه باید عزا بگیره؟؟


سوال داشتن مقدار در یک کلاس با استفاده از یک Global Variable که از هر فرمی همینطوری بهش دسترسی داشته باشه و کیفی مقدارش را عوض کند فرق داره.



باید میگفتی: خلاف اولین اصول برنامه نویسی شی گرا است.

خیر! قبل از اینکه برنامه نوسی شی‌گرا پیداش بشه، استفاده از Global variables خلاف اصول برنامه نویسی بود.



باید بگم نیست. یعنی اگه 100% خلاف این اصول بود زبانی که این قابلیت رو داشت نمیگفت OO هست. بهتر بود میگفتی "... ممکن است بعضی وقت ها این اصول رو نقض کنه"
بعضی وقت ها این اصول رو نقض کردن درست است، ولی تا جایی که من برخوردم معمولاْ کسانی که با نقض قوانین شروع میکنند همانطور هم ادمه میدند.

reza.palang
دوشنبه 21 خرداد 1386, 15:21 عصر
سوال داشتن مقدار در یک کلاس با استفاده از یک Global Variable که از هر فرمی همینطوری بهش دسترسی داشته باشه و کیفی مقدارش را عوض کند فرق داره.
از این دو خط که هیچی نفهمیدم. اما باید بگم به هر حال اگه کسی که بخواد همچین کاری بکنه خلاف اصول برنامه نویسی نیست و یک راه داره پس سوال اشتباه نیست. جواب ممکنه اشتباه باشه. (که در این مورد بود)



خیر! قبل از اینکه برنامه نوسی شی‌گرا پیداش بشه، استفاده از Global variables خلاف اصول برنامه نویسی بود.
در این مورد نظری ندارم (چون تجربه کافی ندارم) . اما اونجا برای همچین کاربردی راه حل دیگه ای بود؟ که استفاده از global variable اشتباه بود؟
به هر حال از تذکرت ممنون:چشمک:



بعضی وقت ها این اصول رو نقض کردن درست است، ولی تا جایی که من برخوردم معمولاْ کسانی که با نقض قوانین شروع میکنند همانطور هم ادمه میدند.

... هیچوقت درست نیست.
منظور من اینه که نمیشه گفت استفاده از global variableهمیشه و همه جا ناقض اصول برنامه نویسی هست.
وجود داره که استفاده بشه. برا خوشگلی نیست که
اگر به طور مطلق غلط بود توی زبان های برنامه نویسی تعبیه نمیشد

Alireza_Salehi
دوشنبه 21 خرداد 1386, 15:54 عصر
از این دو خط که هیچی نفهمیدم. اما باید بگم به هر حال اگه کسی که بخواد همچین کاری بکنه خلاف اصول برنامه نویسی نیست و یک راه داره پس سوال اشتباه نیست. جواب ممکنه اشتباه باشه. (که در این مورد بود)

در این مورد نظری ندارم (چون تجربه کافی ندارم) . اما اونجا برای همچین کاربردی راه حل دیگه ای بود؟ که استفاده از global variable اشتباه بود؟
به هر حال از تذکرت ممنون:چشمک:

... هیچوقت درست نیست.
منظور من اینه که نمیشه گفت استفاده از global variableهمیشه و همه جا ناقض اصول برنامه نویسی هست.

کاملا با آرژنگ در مورد Global Varible موافقم ، برای این که درست و حسابی حس کنید چرا غلطه (البته کاربرد داره ولی نه این طوری) تشریف ببرید در C یک برنامه بنویسید که مثلا 50 تا تابع داشته باشه (که هر کدوم بیشتر از 50 خط باشن) بعد تو 30 تاش یک Global Varible را دستکاری کنید. حالا کافیه برنامتون خطای منطقی داشته باشه که از قضا به دستکاری این Global Varible مربوط بشه .......!

اصولا اگر هر تابعی با ورودی و خروجی مقدار بگیره و بده (در OOP خاصیتها Propertyو متدها) به جای این که روی یک متغییر سراسری دستکاری کنه خیلی بهتره ، هم توی نگهداری هم توی خطایابی هم توی توسعه برنامه و ....

reza.palang
دوشنبه 21 خرداد 1386, 16:43 عصر
کاملا با آرژنگ در مورد Global Varible موافقم ، برای این که درست و حسابی حس کنید چرا غلطه (البته کاربرد داره ولی نه این طوری) تشریف ببرید در C یک برنامه بنویسید که مثلا 50 تا تابع داشته باشه (که هر کدوم بیشتر از 50 خط باشن) بعد تو 30 تاش یک Global Varible را دستکاری کنید. حالا کافیه برنامتون خطای منطقی داشته باشه که از قضا به دستکاری این Global Varible مربوط بشه .......!

اصولا اگر هر تابعی با ورودی و خروجی مقدار بگیره و بده (در OOP خاصیتها Propertyو متدها) به جای این که روی یک متغییر سراسری دستکاری کنه خیلی بهتره ، هم توی نگهداری هم توی خطایابی هم توی توسعه برنامه و ....

من که جسارتی نکردم. من هم با ایشون به شدت موافقم. من هم در مورد <<<(البته کاربرد داره ولی نه این طوری)>>> صحبت میکنم. و استفاده از property و method خیلی که چه عرض کنم. خیلی خیلی بهتره. منظور همون 0.0001 است که ممکنه استفاده بشه. این امکان برای استفاده کردنه (با توجه به اینکه در بیشتر موارد اشتباه هست)
امیدوارم سوتفاهم رفع شده باشه. به هر حال ادامه بحث مفید نخواهد بود.

PC2st
دوشنبه 21 خرداد 1386, 17:51 عصر
یک کار نامناسب به نظر میرسه که بخوایم یک عضو عمومی داشته باشیم تا یک مقدار رو به فرمی پاس بده...

اعضای کلاس عمومی استاتیک، مثل یک صندوقچه بدون "در" (door) هستند...
مشکل در بدون "در" بدون این صندوقچه نیست!
مشکل در قرار دادن بی مورد اعضا در این صندوقچه است!
هر صندوقچه میتونه برای وسایل برقی یا پزشکی یا غیره، استفاده داشته باشد.

مثلا من و برادرم (!)...
یک اسباب بازی داریم که فقط بین خودمون رد و بدل میشه و ربطی به دیگر اعضای خانواده نداره...
حالا یک صندوقچه در این خونه هست که برای نگهداری وسایل عمومی بکار میره.

من با موافقت برادرم، این اسباب بازی رو در داخل این صندوقچه قرار میدیم...!!
روز بعد، پدر من، یک وسیله شخصی مثل ریش تراشش رو در این صندوقچه قرار میده!
و پس فردا، عموی من (!) حوله شخصی اش رو در این صندوقچه قرار میده...!

بعد از مدتی، هر کس باید به دنبال وسیله شخصی اش در صندوقچه عمومی بگرده!! :-)
آیا دیگه این صندوقچه برای کارهای عمومی بدرد میخوره یا شده انباری از وسایل شخصی!؟

بی خودی هر چیزی رو در این صندوقچه قرار دادن، کار درستی نیست،
و هر کسی باید وسایلی که به نحوی به خودش مربوط میشه رو در کنار خودش نگهداری کنه.

kiani.mehdi
دوشنبه 21 خرداد 1386, 20:54 عصر
سلام به همگی اساتید برنامه نویس
حالا که بحث به اینجا کشید اجازه بدین من هم نظرم را راجع به این موضوع بیان کنم
خوشحال میشم نظراتتون را هم در مورد نوشته ها مبگین
اینو هم بگم که من نظر شخص خاصی را مورد نقد قرار نمی دم
نظر خودم را میگم
به طور کلی اینکه بگیم استفاده از متغیر static غلط است را من قبول ندارم ، در واقع اگر ایجاد چنین فیلد ها ویا هرچیز دیگه ای از این نوع مثل توابع ، کلاس و .... به طور محض غلط باشه پس برای چه این کلمه توی زبان های برنامه نویسی هست ، حتی این درست نیست که بگیم خلاف اصول برنامه نویسی شی گرا هم هست
همونطور که میدونین زبان سی شارپ به گفته خود ماکروسافت یک زبان شی گرای محض است
پس اگر استفاده از static مخالف این امر باشه مطمئنا این کلمه را در سی شارپ نمی دیدیم

اما این مسئله را کاملا قبول دارم که هر جایی نباید از این نوع استفاده بشه اما اینکه خلاف اصول برنامه نویسی است را قبول ندارم
دلیل اینکه قبول ندارم :
کلاس math را که 100% ازش استفاده کردین را نظر بگیرین ، همونطور که میتونید این کلاس تو خود دات نت پیاده سازی شده و تموم توابع اون هم به صورت static هستند ، حتی فیلدی به نام PI که عدد PI را بر میگردونه //
پس درست نیست که بگیم ماکروسافتی که یه چنین محیط قدرت مندی را ایجاد کرده خلاف اصول برنامه نویسی عمل کرده

پس اینکه متغیر static خلاف اصول برنامه نویسی است را قبول ندارم اما معتقدم که باید بجا و درست ازش استفاده بشه


نکته دومی که متغیر های static دارن و بقیه متغیر ها ندارن اینه که متغیر های استاتیک مقدار را درون خودشون نگه میدارن که این حسن بزرگی است ، یعنی اینکه اگه شما به فیلد استاتیک درون یک کلاس مقدار 20 را بدین و درون کلاس دوم به اون 10 تای دیگه اضافه کنین ، هنگام استفاده درون کلاس سوم از این فیلد شما مقدار 30 را خواهید داشت

البته همه اساتید این نکته را میدونستند ، فقط من باب یاد اوری گفتم

اما اینکه چگونه یه همچین متغیری را پیاده سازی کنیم یه بحث دیگه می باشد
حتما الان میگین خوب بیایم یه متغیر توی یه فایل setting ایجاد کنیم و از اون استفاده کنیم
گرچه این روش خوبیست و در اکثر مواقع هم توصیه میشه از این استفاده بشه ، اما همیشه نیاز نیست که از این استفاده کنیم

خیلی وقت ها بهتره از همون static و درون یک کلاس استفاده کنیم به دلیل زیر :

همونطور که میدونید توی برنامه نویسی یه نکته ای که باید بهش توجه کرد اینه کم کردن حجم کد است
در واقه به نظر من باید هنگام استفاده و تصمیم گیری از اینکه یه متغیر را درون یک کلاس و به صورت استاتیک استفاده کنیم و یا اینکه یه متغیر برای اون توی setting در نظر بگیریم ،باید به این نکته توجه کرد که کل برنامه ما چقدر عظیم هستش ؟ آیا یه برنامه فوق العاده سنگسن هست ویا نه یه برنامه صرفا به قول خودمون دست گرمی هستش و نه خیلی عظیم و بزرگ
بذارید یه مثال دیگه بزنم
برنامه فاکتوریل ساده را در نظر بگیرین مثلا درون TC
میدونید که الگوریتم ها متفاوتی برای این عمل وجود داره ، از ساده ترین اونا گرفته (به صورت بازگشتی) تا برنامه هایی که از لحاظ پیچیدگی های زمانی خیلی خوب هستند
خوب حالا شمت از کدوم استفاده می کنید ؟ از اولی یا دومی ؟
اگه یه برنامه نویس بی حوصله باشین که دنبال صرفا یه راه حل هست اولی و گر نه دومی را انتخاب میکنید
اما به نظر من یه برنامه نویس خوب قبل از اینکه یکی از دو الگوریتم فوق را انتخاب کنه به این فکر میکنه که ماکزیمم مقداری که قراره این برنامه فاکتوریل اونو حسای کنه چقدره ؟ 5 ؟ 200 ؟ 1000؟

مسلنا اگه برنامه نهایتا فاکتوریل 5 را حساب میکنه خوب هیچ عقل سلیمی نمیاد الگوریتم اول را که 4 خط بیشتر نیست را رها کنه و یه الگوریتم مثلا 100 خطی بنویسه که چی چون پیچیدگی زمانیش بهتره
اما عکس اون ، اگه برنامه قراره برای اعداد بزرگ یه کار بره خوب طبیعتا باید از الگوریتم های بهینه استفاده کنه

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

اما اگه بخوام تمام صحبت هام را در یک جمله بگم :
استفاده از نوع استاتیک (یا هر نوع دیگه ای) نه اشتباه هست و نه بر خلاف اصول برنامه نویسی بلکه باید از اونا به جا و درست استفاده کرد

ممنون که خوندین ، نظرات و انتقاداتون را هم با کمال میل می پذیرم
موفق باشید
مهدی کیانی

PC2st
دوشنبه 21 خرداد 1386, 21:29 عصر
استفاده از نوع استاتیک (یا هر نوع دیگه ای) نه اشتباه هست و نه بر خلاف اصول برنامه نویسی بلکه باید از اونا به جا و درست استفاده کرد
منم موافقم، ( همون جریان صندوقچه!!! ) که درست باید ازش استفاده کرد تا برنامه قاطی پاتی (!) نشه.

kiani.mehdi
دوشنبه 21 خرداد 1386, 21:56 عصر
منم موافقم، ( همون جریان صندوقچه!!! ) که درست باید ازش استفاده کرد تا برنامه قاطی پاتی (!) نشه.

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

reza.palang
سه شنبه 22 خرداد 1386, 00:26 صبح
به طور کلی اینکه بگیم استفاده از متغیر static غلط است را من قبول ندارم...............

پس اگر استفاده از static مخالف این امر باشه مطمئنا این کلمه را در سی شارپ نمی دیدیم


سلام دکتر جون. من داشتم مینوشتم که "بابا موضوع رو درست بخون" . برا احتیاط یه نگاهی از اول تا آخر تاپیک انداختم دیدم حق داری. توضیح اینکه این بحث از یکی دو تا تاچیک دیگه اینجا کشیده شد:
http://barnamenevis.org/forum/showthread.php?t=69995
و http://barnamenevis.org/forum/showthread.php?t=69943
کو دوستمون wishmaster جان فکر کرد با متغیرای static میتونه راح حل مناسبی رو ارائه بده، که ........
بالا رفتیم ماست بود، پایین اومدیم دوغ بود.

این بحث و گفتمان ها بیشتر در مورد public variable هست
------------------------------------------------------------------
اما جدا از این مباحث با نظر شما نیز به شدت موافقم. یعنی اگه کسی مخالف استفاده متغیر های static باشه برنامه نویسی نمیکنه. همونطور که گفتم بحث در مورد public variable بود که باید ذکر میشد.

kiani.mehdi
سه شنبه 22 خرداد 1386, 07:04 صبح
همونطور که گفتم بحث در مورد public variable بود که باید ذکر میشد.



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

اَرژنگ
چهارشنبه 23 خرداد 1386, 04:46 صبح
جریان صندوقچه همان Encapsulation نیست؟

reza.palang
یک شنبه 27 خرداد 1386, 10:39 صبح
جریان صندوقچه همان Encapsulation نیست؟
صندوقچه توی مثال دوستمون نماینده public variableهست که با encapsulation توی دو فاز مخالف هستن. ومیشه گفت encapsolate رو زیر سوال میبره.

parsadsa
پنج شنبه 25 خرداد 1391, 17:53 عصر
ای بابا ما کشته شدیم .... یه پروژه کوچیک داشتم که زمان نوشتنش برام مهم بود نیاز مبرم به استفاده متغیر تو همه فرم ها داشتم آخه دق دادین مارو یکی نگفت چطوری میشه منم که سوادم خیلی ضعیفه ...بس که بحث کردین ضعیف تر شد ...آقا جام من نخوام برم بهشت کیو باید ببینم؟؟؟؟؟؟ شما بگین چطوری درست میشه کرد بعد رجع به بدیش حرف بزنین.... اگه بده چرا امکانش هست پس بد نیست به نظرم اما خو به جاش باسد استفاده بشه

prgakbarzadeh
پنج شنبه 14 شهریور 1392, 11:35 صبح
ا شما بگین چطوری درست میشه کرد بعد رجع به بدیش حرف بزنین

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Meye
{
public static class Cl_Variables
{
public static string VCode { get; set; }
public static bool edit { get; set; }
}
}