PDA

View Full Version : ;کاربرد متد های استاتیک (به جز متد Main )



amirjalili
پنج شنبه 17 دی 1388, 11:34 صبح
دوستان کاربرد متد های static دقیقا چیست ؟
آیا این متد ها مستقیما اجرا میشوند؟
من به دنبال یک مثال کاربردی به جز مثال هایی که همه راجع به متد Main میزنن هستم.
لطفا راهنمایی کنید.
با تشکر

Mostafa_Dindar
پنج شنبه 17 دی 1388, 11:45 صبح
متدهاي Static بدون Instance گرفتن از كلاس اون ميتونيد از اون متد استفاده كنيد .
كلاس Math يك كلاس Static هست . تصور كنيد نبود (يعني يك كلاس نمونه اي بود). در اين صورت اگر ميخواستي از متد Sqrt() اون استفاده كني بايد مينوستي :

System.Math myMath = new System.Math();
myMath.sqrt(25);يعني بايد اول يك نمونه از اون ايجاد كني ومتد آن نمونه رو فراخواني كني ولي چون استاتيك هست ميتوني بنويسي :

System.Math.Sqrt(25);

mir555
پنج شنبه 17 دی 1388, 17:36 عصر
متد های که بصورت استاتیک در یک کلاس تعریف بشن بدون نیاز به نمونه سازی قابل استفاده است یعنی بدون اینکه نیاز باشه متغییری از نوع اون کلاس تعریف کنی و new instant ایجاد کنی قابل استفاده است

AliRezaPro
پنج شنبه 17 دی 1388, 19:25 عصر
وبلاگ جناب نصیری رو ببینید

http://vahidnasiri.blogspot.com/search/label/C%23

amirjalili
شنبه 19 دی 1388, 08:52 صبح
این تعاریف همه برای کلاس های استاتیک بود. مثال بالا هم مربوط به کلاس استاتیک بود. این تعاریف رو هم میدونستم. من میخوام واقعا بفهمم که کجا لازم میشه ما متدی مثل Main خود دات نت که استاتیک هست بنویسیم. خوب ما میدونیم که متدی که استاتیک تعریف بشه نیاز به فراخوانی نداره و اجرا میشه. حالا من مثالی میخوام تا بدونم که چه متدهای دیگه ای شبیه متد main داریم؟ یه مثال ساده. یه کد ساده.

ASKaffash
شنبه 19 دی 1388, 09:14 صبح
سلام
اینطوری فرض کنید که ما میخواهیم متدی برای تبدیل به مبنای 10 همیشه در دسترس باشد بنابراین متدی شبیه به این را درون کلاس مورد نظر می نویسیم :


public static long A2D(string Value, int Base)
{
int LValue = Value.Length;
long RtnValue = 0;
for (int i = 0; i < Value.Length; i++)
RtnValue += Value[i] * Math.Pow(Base, LValue - i - 1).ToInt64();
return RtnValue;
}

amirjalili
شنبه 19 دی 1388, 09:47 صبح
با تشکر از ASKaffash ..
حالا ما چطوری باید از این متد استفاده کنیم؟ یعنی مقدار return شده رو چطوری باید استفاده کنیم ؟ چون در متد main خود دات نت اگر مثلا بنویسید console.write اون مقدار مورد نظر رو مینویسه.. حالا اینجا من اگه بخوام مقداری که در متد شما Return شده رو با messagebox نشون بدم باید چه کار کنم ؟ (من میخوام عین متد Main بدون فراخوانی متد این کار رو انجام بدم).
ممنون.

ASKaffash
یک شنبه 20 دی 1388, 09:15 صبح
با تشکر از ASKaffash ..
حالا ما چطوری باید از این متد استفاده کنیم؟ یعنی مقدار return شده رو چطوری باید استفاده کنیم ؟ چون در متد main خود دات نت اگر مثلا بنویسید console.write اون مقدار مورد نظر رو مینویسه.. حالا اینجا من اگه بخوام مقداری که در متد شما Return شده رو با messagebox نشون بدم باید چه کار کنم ؟ (من میخوام عین متد Main بدون فراخوانی متد این کار رو انجام بدم).
ممنون.
سلام
مثلا اینطوری :


long x = MyClass.A2D("A2B3FFg", 256);

SMRAH1
دوشنبه 21 دی 1388, 13:38 عصر
سلام
صحبت در مورد اینکه چه چیزی کجا بدرد می خوره یا طبق چه الگوریتمی باید نتیجه بگیریم که از فلان نکته برنامه نویسی یا فلان دستور زبان برنامه نویسی،استفاده کنیم،کار خیلی سخته است (تفاوت برنامه نویسی ها هم در همین است و هر چه با تجربه تر باشند بهتر بر این مسائل را اشراف دارند:چشمک:).
در نتیجه صحبت در مورد اینکه کجا از متد استاتیک استفاده کنیم خیلی سخته!اما چند نکته به ذهنم رسید که با شما در میان می گذارم:
1) گاه اوقات توابعی داریم که با داشتن چند پارامتر (یا شاید هیچ پارمتر) کاری رو انجام داده و نتیجه رو بر می گردانند.مثل تابع جذر که کافیه فقط بهش بگیم جذر چی رو می خواهیم.این توابع در زبان های برنامه نویسی به سبک های متفاوت پیاده سازی می شوند.مثل در C یا ++C که اجازه معرفی یک تابع منفرد داده شده،می تونید این کار رو براحتی انجام بدید.ولی در زبانی مثل #C که همه چیز باید در قالب یک کلاس معرفی بشه،شما نمی تونید این کار (تعریف یک تابع منفرد)رو بکنید و باید حتما یک کلاس داشته باشید و این تابع رو در اون معرفی کنید.حالا فقط برای اینکه برنامه نویسی بیچاره ،همواره مجبور به ایجاد یک نمونه از کلاس و بعد فراخونی این تابع نشه،اون رو به شکل استاتیک معرفی می کنید تا براحتی در دسترس باشه.نمونه هایی مثل این در Math وجود داره.یک نمونه دیگه اینکه من معمولا در برنامه هایم که از پایگاه داده استفاده می کنم،یک تابع استاتیک در Program معرفی کرده تا رشته اتصال مناسب رو برایم برگرداند.این مسئله کمک می کنه که اگر خواستم رشته اتصال رو عوض کنم ،فقط یک تابع رو تغییر بدم و تمام برنامه به شکل مناسب از رشته اتصال (Connection String) جدید استفاده کنه.البته به مسئله راحتی برنامه نویسی،راحتی دسترسی (و امکان) اون رو هم اضافه کنید.این مسئله برای تابع Main اتفاق می افتد که سیستم عامل باید یک نقطه ورود به برنامه داشته باشه،بدون اینکه نیاز به نمونه سازی از کلاسی باشه و ...
2) گاهی اوقات این توابع منفرد مورد بحث،آنقدر زیاد هستند و دارای رابطه منطقی ،که بتوان در یک جا جمع کرد مثلا کلاس Math که چندین تابع ریاضی مورد نیاز رو در خودش جمع کرده (مثل جذر،مینیمم،ماکزیمم،قدرمطل ق و ....)
3) گاهی اوقات این توابع منفرد زیاد نیستند ولی با کلاس هایی که داریم ارتباط منطقی دارند.مثلا در کلاس Graphics (که مانند یک بوم نقاشی یوده و دارای توابعی برای رسم اشکال و ... است - در System.Drawing) توابعی استاتیک معرفی شده اند که با کلمه From شروع می شوند،مانند FromImage که در واقع وظیفه ساختن یک شی Graphics (فرض کنید بوم نقاشی) از روی درخواست وارده (برای FromImage می شود ایجاد یک بوم نقاشی از روی تصویر داده شده) ایجاد کند.خوب،این توابع استاتیک کجا معرفی شوند بهتر از اینجا!هر وقت خواستید یک شی Graphics از روی چیزی (Image یا پنجره و ..) ایجاد کنید و رویش نقاشی کنید،کافیست این توابع را استفاده کنید تا یک بوم داشته باشید:قهقهه:!
4) گاهی اوقات ما توابعی داریم که می خواهید در صورت اجرای هر نمونه از کلاس،فقط یک تابع اجرا شود.مثلا در الگوی سینگلتون،ما یک تابع استاتیک داریم که موظف است که یک نمونه از کلاس جاری را ساخته و باز گرداند.اگر دوباره این تابع را اجرا کنید،چون این تابع خودش می داند که قبلا یک نمونه ساخته (پیاده سازی آن به خوده تابع مربوط است و ما به عنوان یک توضیح این را می دانیم که تابع خودش می داند که چکار باید بکند)،دوباره همان نمونه ای که قبلا ساخته را بر می گرداند.پس در این الگو،فقط یک نمونه از کلاس ساخته می شود و ما می توانیم با خیال راحتی این مطلب را استفاده کنیم.

موفق باشید

corona
دوشنبه 21 دی 1388, 21:51 عصر
با تشکر از ASKaffash ..
حالا ما چطوری باید از این متد استفاده کنیم؟ یعنی مقدار return شده رو چطوری باید استفاده کنیم ؟ چون در متد main خود دات نت اگر مثلا بنویسید console.write اون مقدار مورد نظر رو مینویسه.. حالا اینجا من اگه بخوام مقداری که در متد شما Return شده رو با messagebox نشون بدم باید چه کار کنم ؟ (من میخوام عین متد Main بدون فراخوانی متد این کار رو انجام بدم).
ممنون.


دوست من حرفات نشون میده که هنوز نفهمیدی تابع استاتیک کاربردش چیه! تابع Main به این دلیل استاتیک تعریف شده که شما نیازی نیست اونو فراخونی کنید بلکه سیستم عامل هستش که تابع Main رو فراخوانی می کنه پس می بینی که باز هم یک نفر هستش که تابع رو داره صدا می زنه و تابع خود به خود فراخوانی نمیشه . تابع Main نقطه شروع برنامه شما هستش و سیستم عامل برای اینکه برنامه شما را اجرا کنه تابع Main رو صدا می زنه و چو ن وقتی که سیستم عامل تابع Main رو صدا می زنه هیچ شی ای در حافظه ایجاد نشده ، سیتم عامل نیاز داره که Activation record تابع Main رو روی پشته برنامه شما قرار بده ، تابع main باید Static تعریف بشه.

jeson_park
شنبه 26 دی 1388, 09:52 صبح
سلام
یه سوال
چرا ما نیاز داریم از روی کلاس ها نمونه سازی کنیم؟؟
منظورم اینه که چرا همه متد ها به صورت استاتیک تعریف نمیشن
جدای از مساله ازث بری چیزی دیگه ای هم هست؟؟

corona
شنبه 26 دی 1388, 10:16 صبح
به عنوان یک نمونه ساده فرض کن میخوای برای یک مدرسه برنامه بنویسی . هر دانش آموز ویژگیهای خاص خودش رو داره . حالا اگه بیای یک کلاس Student رو به صورت static تعریف کنی چی میشه ؟ چیز خاصی نمیشه ولی فقط همه دانش آموزا مجبورن مثلا از یک نام و فامیل و شماره شناسنامه استفاده کنن. امیدوارم خوب به این مثال فکر کنی تا واقعا متوجه بشی چرا همه چی رو استاتیک تعریف نمی کنن . موفق باشی .

amirjalili
شنبه 26 دی 1388, 10:17 صبح
دوست من حرفات نشون میده که هنوز نفهمیدی تابع استاتیک کاربردش چیه! تابع Main به این دلیل استاتیک تعریف شده که شما نیازی نیست اونو فراخونی کنید بلکه سیستم عامل هستش که تابع Main رو فراخوانی می کنه پس می بینی که باز هم یک نفر هستش که تابع رو داره صدا می زنه و تابع خود به خود فراخوانی نمیشه . تابع Main نقطه شروع برنامه شما هستش و سیستم عامل برای اینکه برنامه شما را اجرا کنه تابع Main رو صدا می زنه و چو ن وقتی که سیستم عامل تابع Main رو صدا می زنه هیچ شی ای در حافظه ایجاد نشده ، سیتم عامل نیاز داره که Activation record تابع Main رو روی پشته برنامه شما قرار بده ، تابع main باید Static تعریف بشه.


چیزی که من متوجه نشدم ! اینه که بالاخره در همه مثال هایی که دوستان بیان کردن متدی که استاتیک تعریف شده بالاخره باید فراخوانی بشه . من کاری به اینکه instance از کلاس گرفته نمیشه ندارم چون این خیلی بدیهیه . سوالی که واسه من پیش اومده اینه که همین متد Main کجا فراخوانی میشه. یعنی طبق چیزی که میدونیم باید main اینطوری فراخوانی بشه تا کار کنه.

()classname.Main

اما در main کجا این اتفاق می افته؟ کجا فراخوانی میشه. چون به هر حال تابع باید فراخوانی بشه تا بتونه اعمال درونیش رو اجرا کنه.

Saeed.Masoumi
شنبه 26 دی 1388, 13:23 عصر
سلام دوست عزیز
ببین:

شما نیازی نیست اونو فراخونی کنید بلکه سیستم عامل هستش که تابع Main رو فراخوانی می کنه پس می بینی که باز هم یک نفر هستش که تابع رو داره صدا می زنه و تابع خود به خود فراخوانی نمیشه
اینو دوستمون جوابتون رو دادن دیگه.سیستم عامل میاد و تابع Main رو صدا می کنه.
و چون قرار سیستم عامل با یک جامپ بپره سر آدرس شروع برنامه باید این تیکه از برنامه روی استک بار بشه برای همین از توابع استاتیک باید استفاده بشه.
نه Main چون تو زبانهای خوانواده سی فقط Main هستش بلکه Entry point برنامه رو صدا می زنه:


In computer programming, an entry point is a memory address, corresponding to a point in the code of a computer program which is intended as destination of a long jump, be it internal or external
می تونید برای اطلاعات بیشتر واژه در مورد Entry point در برنامه نویسی سرچ کنید.
نه تنها در برنامه نویسی های معمولی(روزمره)شما بلکه در همین سیستم عاملی که دارید ازش استفاده می کنید این اتفاق می افته.
(فرض کنید) سیستم عامل شما یک کرنل داره که کل سیستم عامل بر اون استوار است حالا موقع بوت شدن کامپیوتر کامپیوتر شما از کجا می خواد تشخیص بده که نقطه شروع کرنل شما کجاست(چون دیگه اینجا هنوز سیستم عاملی لود نشده که بخواد وظیفه جامپ کردن به تابع شروع برنامه رو مدیریت کنه) برای هیمن یک تیکه از فراید بوت (بوت لودر) اختصاص به جامپ کردن به تابع آغازین کرنل رو داره یک چیزی تو مایه های کد زیر:

[
global start]
[extern _main]
Start:
Call _main

می بینید که حتا در فرایند لود کرنل(هسته خود سیستم عامل) هم نیاز به فراخونی Entry point به صورت کال کردن از طریق یک فرایند دیگر هستش - یعنی بازهم شما به صورت مستقیم خود Mian برنامه رو در برنامه اصلی خودتون(بدنه) فراخونی نمی کنید
امیدوارم درست توضیح داده باشم

corona
شنبه 26 دی 1388, 14:48 عصر
amirjalili (http://www.barnamenevis.org/forum/member.php?u=66343) عزیز با سوالی که کردی نشون دادی که خوب جوابایی که داده میشه رو نمی خونی (; هر چند آقا سعید لطف کردن کامل تر از من دوباره توضیح دادن .

amirjalili
یک شنبه 27 دی 1388, 10:46 صبح
بله. من به دلایلی دیروز خیلی مجبور بودم به سر سری مطالب دوستان رو بخونم.. ممنون از توضیحاتتون. بسیار استفاده کردم.