PDA

View Full Version : Static method ....



s_mostafa_h
یک شنبه 04 آذر 1386, 20:26 عصر
با سلام
یه سئوال راجع به متد های static , non-static داشتم . همانطوریکه می دانید ، برای فراخوانی متد استاتیک از داخل یک کلاس ، نیازی به ساخت نمونه از کلاس نیست . اما برای متد های غیر استاتیک ، ساخت نمونه از کلاس لازم است . حال سئوال اینه چه وقت از متد های استاتیک استفاده کنیم و چه وقت از متد های غیر استاتیک . به عبارت دیگر در کار ما تداخل ایجاد می کنه که یک متد را استاتیک تعریف کنیم یا غیر استاتیک ؟
متشکرم

combo_ci
یک شنبه 04 آذر 1386, 21:09 عصر
خوب مسلاما" با توجه به نیاز باید از این دو نوع تعرف استفاده کرد.....مثلا من یه تابع نوشتم که error ها ی برنامه رو توی یه فایل txt ذخیره میکنه

public static void WriteError(string message, string fileCS, string func)
{
System.IO.StreamWriter wr = new System.IO.StreamWriter(Application.StartupPath + "\\Error.txt", true, System.Text.Encoding.Unicode);
wr.WriteLine(message + " Time is : " + DateTime.Now.ToString() + " in " + fileCS + " @ " + func);
wr.WriteLine("");
wr.Close();
}

خوب این تابع چون تمام برنامم کاربرد یکسان داشت به صورت static تعریف شد....اما اگر یک تابع مخصوص به یک کلاس داشته باشه یا مجبور باشین عملیات خاصی مثل متغیر دهی یک سری متغیر های کلاس رو تو کانستراکتور انجام بدین مسلما" تعریف به عنوان static کار درستی نیست

s_mostafa_h
یک شنبه 04 آذر 1386, 22:11 عصر
با تشکر از پاسختان .
یعنی منظورتان اینه که چنانچه بخواهیم تغییر اتی در متد ما انجام بشه ، از متد غیر استاتیک استفاده کنیم در غیر اینصورت ..........

combo_ci
دوشنبه 05 آذر 1386, 16:33 عصر
نه عزیزم ...منظورم اینه که اگر کاری که داشتی میکردی منحصر به کلاس خاصی نبود و در تمام برنامه مشترک بود (مثل همون تابع writError که کدشو گذاشتم) میتونی از یک تابع static استفاده کنی (و توی هر کلاس از تابع رو تکرار نکنی)

PC2st
دوشنبه 05 آذر 1386, 23:36 عصر
در راستای توضیحاتی که در بالا گفته شد...
یک متد رو درصورتی static تعریف کنید که نتیجه عملیات به نمونه های کلاس وابسته نباشد.
میدونید که هر مردی که در کشور انگلستان زندگی کنه، بعنوان یک مرد انگلیسی شناخته میشه و هر مرد انگلیسی میتونه دارای یک شغل متفاوتی باشه یا از لحاظ رنگ پوست و موقعیت اجتماعی و غیره، با دیگر مردان انگلیسی تفاوت داشته باشه. حالا کلاس EnglishMan رو در نظر داشته باشید (که EnglishMan یک کلاس به ازای هر مرد انگلیسی است). حالا کدهای زیر رو ببینید:


EnglishMan em1 = new EnglishMan();
EnglishMan em2 = new EnglishMan();
string str1 = em1.GetJob();
string str2 = em2.GetJob();

string c1 = em1.GetCountry();
string c2 = em2.GetCountry();

متد GetJob یک رشته مبنی بر نوع شغل فرد برمیگردونه و این طبیعی است که هر مرد انگلیسی میتونه دارای یک شغل متفاوت باشه. پس متد GetJob به افرادی که در انگلستان زندگی میکنند بستگی داره پس متد GetJob نباید بصورت static تعریف بشه چون به نمونه کلاس بستگی داره.
متد GetCountry یک رشته مبنی بر نام کشوری که فرد در آن زندگی میکنه رو بر میگردونه، آیا قبول دارید که مقدار خروجی متد GetCountry برای تمام افرادی (مردانی) که در انگلستان زندگی میکنند، یکی است؟ به عبارتی تمام نمونه های ایجاد شده از کلاس EnglishMan همواره مقدار رشته "کشور انگلستان" را بعنوان خروجی متد GetCountry برمیگردانند، بعبارتی مقدار خروجی متد GetCountry برای اشیاء em1 و em2 یک مقدار برابر است. پس خروجی ناشی از متد GetCountry به نمونه اشیاء (یعنی اشیاء em1 و em2) بستگی ندارد! پس این متد باید بصورت static تعریف شود، یعنی بصورت زیر:


string cc = EnglishMan.GetCountry();