PDA

View Full Version : مبتدی: کي از کلاس Static استفاده کنيم؟



bftarane
دوشنبه 12 فروردین 1392, 22:37 عصر
سلام.
من در اين مورد جستجو کردم و يه چيزايي متوجه شدم ولي هنوز اون طور که بايد درکش نمي کنم.
مثلاً خوندم که اگه کلاس استاتيک باشه لازم نيست ازش نمونه (instance) ايجاد بشه.
خوب اين مزيتش چيه؟
چه جوري بگم يعني مي خوام همونطور که وقتي لازمه يه متغير از نوع int تعريف کنيم خيلي برامون جا افتادس و نمي ياييم به جاش از string استفاده کنيم بفهمم کي بايد از static استفاده کنيم و کي استفاده نکنيم.
ممنون.

nava_2012
دوشنبه 12 فروردین 1392, 22:44 عصر
سلام.
ازکلاس static زمانی که نمی خواهید نمونه گیری از شئی تون object انجام بشه مورده استفاده قرار میگیره.
مثلا:


public string sqlconnection;
connection=new sql connection("connection string")
در رویداد کلیک باتن برای ثبت اطلاعات نیاز دارید که شئی کانکشن نمونه سازی کنید دوباره.
در کلاس کانکشن که نوشتید،برای نوشتن به روش static داریم:
public static string sqlconnection=new sqlconnection();
دیگر در رویداد باتن نیاز به نمونه سازی ندارید.
هنگامی که اسم کلاس کانکشن تایپ کردید بعداز گذاشتن نقطه خودبه خود شئی کانکشن برای استفاده شما ظاهر می شود.
موفق باشید.

FastCode
دوشنبه 12 فروردین 1392, 23:13 عصر
مثلاً خوندم که اگه کلاس استاتيک باشه لازم نيست ازش نمونه (instance) ايجاد بشه.
دقیقا برعکس.
یعنی اگر کسی عکس این رو درک کنه به نظر من کلاس استاتیک رو درک کرده.
فقط وقتی از کلاس استاتیک استفاده میکنیم که به نسخه ای از کلاس نیاز نداریم.(حتی یک نسخه هم نیاز نداریم.)در غیر این صورت طراحیتون غلطه.

plus
دوشنبه 12 فروردین 1392, 23:22 عصر
توضیحش مفصله.یک نمونه کلاس استاتیک در #C کلاس Math (http://msdn.microsoft.com/en-us/library/system.math.aspx)هست که تعدادی متد static برای عملیات ریاضی ارائه میده.هیچ لزومی به ساخت یک شی از کلاسی که این عملیات رو انجام میده برای انجام این عملیات نیست.بنابراین همه متد ها static تعریف شده و در نتیجه خود کلاس هم static تعریف شده.
شاید بشه گفت، این حالت استفاده برای زمانیه که شما بخوای تعدادی "تابع"/مقدار ثابت (و یا متغیر هایی که اون "تابع" ها روشون کار میکنن) مرتبط به هم رو در #C که یک زبان شی گرا هست در قالب "متد" های static یک کلاس static پیاده سازی کنی.البته متد و متغیر static استفاده های مهم دیگه ای دارن، ولی وقتی صحبت از کلاس static هست، این حالتی که گفتم میتونه یکی از دلایل مهم ایجاد کلاس static باشه.

erfan_urchin
سه شنبه 13 فروردین 1392, 03:12 صبح
مثلاً خوندم که اگه کلاس استاتيک باشه لازم نيست ازش نمونه (instance) ايجاد بشه.
خوب اين مزيتش چيه؟
خیلی مزیت داره مثلا یکی از مزیتاشو شما تو Console میتونید ببینید
ما برای Console شی نمیسازیم چون بصورت Public Static تعریف شده. حالا شما فرض کن ما بخوایم برای اینکه هردفعه برای نوشتن Console.WriteLine یا Console.ReadLine یه شی ازش تعریف کنیم ، خیلی سخت میشه دیگه، نه؟؟!!!
میتونه یکی از دلیلاش همین باشه که کلاس هایی که Public Static هستند زیاد کاربرد دارند (مثل Console) و اینجوری خب قاعدتا کار برنامه نویس ها راحت تر میشه و دیگه لازم نیست هر دفعه ازش شی بسازن

ordebehesht
سه شنبه 13 فروردین 1392, 12:25 عصر
بررسي واژه كليدي staticدر C#‎


بررسي واژه كليدي staticدر C#‎ تفاوت بين يك كلاس استاتيك، متدي استاتيك و يا متغير عضو استاتيك چيست؟ چه زماني بايد از آنها استفاده كرد و لزوم بودن آنها چيست؟
براي پاسخ دادن به اين سؤالات بايد از نحوهي تقسيم بندي حافظه شروع كرد.
RAM براي هر نوع پروسهاي كه در آن بارگذاري ميشود به سه قسمت تقسيم ميگردد: Stack ، Heap و Static (استاتيك در دات نت در حقيقت قسمتي از Heap است كه به آن High Frequency Heap نيز گفته ميشود).
اين قسمت استاتيك حافظه، محل نگهداري متدها و متغيرهاي استاتيك است. آن متدها و يا متغيرهايي كه نياز به وهلهاي از كلاس براي ايجاد ندارند، به صورت استاتيك ايجاد ميگردند. در سي شارپ از واژه كليدي static براي معرفي آنها كمك گرفته ميشود. براي مثال:
view plainprint?
class MyClass
{
public static int a;
public static void DoSomething();
}
در اين مثال براي فراخواني متد DoSomething نيازي به ايجاد يك وهله جديد از كلاس MyClass نميباشد و تنها كافي است بنويسيم:
view plainprint?
MyClass.DoSomething(); // and not -> new MyClass().DoSomething();
نكتهي مهمي كه در اينجا وجود دارد اين است كه متدهاي استاتيك تنها قادر به استفاده از متغيرهاي استاتيك تعريف شده در سطح كلاس هستند. علت چيست؟
به مثال زير دقت نمائيد:
view plainprint?
class MyClass
{
// non-static instance member variable
private int a;
//static member variable
private static int b;
//static method
public static void DoSomething()
{
//this will result in compilation error as “a” has no memory
a = a + 1;
//this works fine since “b” is static
b = b + 1;
}
}
در اين مثال اگر متد DoSomething را فراخواني كنيم، تنها متغير b تعريف شده، در حافظه حضور داشته (به دليل استاتيك معرفي شدن) و چون با روش فراخواني MyClass.DoSomething هنوز وهلهاي از كلاس مذكور ايجاد نشده، به متغير a نيز حافظهاي اختصاص داده نشده است و نامعين ميباشد.
بر اين اساس كامپايلر نيز از كامپايل شدن اين كد جلوگيري كرده و خطاي لازم را گوشزد خواهد كرد.

اكنون تعريف يك كلاس به صورت استاتيك چه اثري را خواهد داشت؟
با تعريف يك كلاس به صورت استاتيك مشخص خواهيم كرد كه اين كلاس تنها حاوي متدها و متغيرهاي استاتيك ميباشد. امكان ايجاد يك وهله از آنها وجود نداشته و نيازي نيز به اين امر ندارند. اين كلاسها امكان داشتن instance variables را نداشته و به صورت پيش فرض از نوع sealed به حساب خواهند آمد و امكان ارث بري از آنها نيز وجود ندارد. علت اين امر هم اين است كه يك كلاس static هيچ نوع رفتاري را تعريف نميكند.

پس با اين تفاسير چرا نياز به يك كلاس static ممكن است وجود داشته باشد؟
همانطور كه عنوان شد يك كلاس استاتيك هيچ نوع رفتاري را تعريف نميكند بنابراين بهترين مكان است براي تعريف متدهاي كمكي كه به ساير اعضاي كلاسهاي ما وابستگي نداشته، عمومي بوده، مستقل و متكي به خود هستند. عموما متدهاي كمكي در يك برنامه به صورت مكرر فراخواني شده و نياز است تا به سرعت در دسترس قرار داشته باشند و حداقل يك مرحله ايجاد وهله كلاس در اينجا براي راندمان بيشتر حذف گردد.
براي مثال متدي را در نظر بگيريد كه بجز اعداد، ساير حروف يك رشته را حذف ميكند. اين متد عمومي است، وابستگي به ساير اعضاي يك كلاس يا كلاسهاي ديگر ندارد. بنابراين در گروه متدهاي كمكي قرار ميگيرد. اگر از افزونهي ReSharper استفاده نمائيد، اين نوع متدها را به صورت خودكار تشخيص داده و راهنمايي لازم را جهت تبديل آنها به متدهاي استاتيك ارائه خواهد داد.

با كلاسهاي استاتيك نيز همانند ساير كلاسهاي يك برنامه توسط JIT compiler رفتار ميشود، اما با يك تفاوت. كلاسهاي استاتيك فقط يكبار هنگام اولين دسترسي به آنها ساخته شده و در قسمت High Frequency Heap حافظه قرار ميگيرند. اين قسمت از حافظه تا پايان كار برنامه از دست garbage collector در امان است (بر خلاف garbage-collected heap يا object heap كه جهت instance classes مورد استفاده قرار ميگيرد)


نكته:
در برنامههاي ASP.Net از بكارگيري متغيرهاي عمومي استاتيك برحذر باشيد (از static fields و نه static methods). اين متغيرها بين تمامي كاربران همزمان يك برنامه به اشتراك گذاشته شده و همچنين بايد مباحث قفلگذاري و امثال آنرا در محيطهاي چند ريسماني هنگام كار با آنها رعايت كرد

///////----------------------------------------------------
نویسنده kingmostafa (http://www.forum.persianv.com/member.php?22-kingmostafa)

nava_2012
سه شنبه 13 فروردین 1392, 18:21 عصر
سرکلاس static بین علمای برنامه نویس بحثه.
نیازی به یک کلاس برای استفاده داریم فقط.
نمونه سازی انجام نمیشه.
....

tooraj_azizi_1035
چهارشنبه 14 فروردین 1392, 16:22 عصر
مثلاً خوندم که اگه کلاس استاتيک باشه لازم نيست ازش نمونه (instance) ايجاد بشه.

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


خوب اين مزيتش چيه؟مزیتش این هست که هزینه کمتری بابت فراخوانی متدهای این کلاس می پردازید چون لزومی به ساخت نمونه از روی کلاس نیست همچنین سریعتر به خواستتون می رسید. بحث این هست که آیا ساختن نمونه از روی کلاس شما معنی داره یا نه یعنی نیاز داریم تا بین نمونه های مختلف کلاس فرق بگذاریم یا نه.
مثلاً اگه کلاسی به نام Circle داشته باشیم دایره ها می تونن شعاع و رنگ های مختلفی نسبت به هم داشته باشن اما در مورد کلاسی مثل System.Math لزومی نداره که بخوایم بین دو نمونه از Math فرق بگذاریم چون متدهای Math یک ورودی می گیرند و یک خروجی پس می دهند و با فرض اینکه بتونیم نمونه ای هم بسازیم هیچ تفاوقی نمی تونیم بین دو نمونه قائل بشیم:


A static class can be used as a convenient container for sets of methods that just operate on input parameters and do not have to get or set any internal instance fields. For example, in the .NET Framework Class Library, the static System.Math class contains methods that perform mathematical operations, without any requirement to store or retrieve data that is unique to a particular instance of the Math class. That is, you apply the members of the class by specifying the class name and the method name, as shown in the following example.

double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));

// Output:
// 3.14
// -4
// 3






چه جوري بگم يعني مي خوام همونطور که وقتي لازمه يه متغير از نوع int تعريف کنيم خيلي برامون جا افتادس و نمي ياييم به جاش از string استفاده کنيم بفهمم کي بايد از static استفاده کنيم و کي استفاده نکنيم.اگر متدهای کلاس شما روی نمونه خاصی از کلاس عمل نمی کنند باید کلاسش رو استاتیک بگیرید.
فرض کنید کلاسی به نام CompanyInfo دارید که دارای متدهای زیر برای گرفتن اطلاعات مربوطه به شرکت است:


class CompanyInfo
{
public string GetCompanyName() { return "CompanyName"; }
public string GetCompanyAddress() { return "CompanyAddress"; }
//...
}



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

static class CompanyInfo
{
public static string GetCompanyName() { return "CompanyName"; }
public static string GetCompanyAddress() { return "CompanyAddress"; }
//...
}


Use a static class as a unit of organization for methods not associated with particular objects. Also, a static class can make your implementation simpler and faster because you do not have to create an object in order to call its methods. It is useful to organize the methods inside the class in a meaningful way, such as the methods of the Math (http://msdn.microsoft.com/en-us/library/system.math%28v=vs.80%29.aspx) class in the System (http://msdn.microsoft.com/en-us/library/system%28v=vs.80%29.aspx) namespace.

منبع: http://msdn.microsoft.com/en-us/library/79b3xss3%28v=vs.80%29.aspx

FastCode
چهارشنبه 14 فروردین 1392, 16:50 عصر
بزارید با یک نمونه برای System.Math یک بخش دیگه موضوع رو توضیح بدم.
فرض کنید برای محاسبه اعداد دو استاندارد IEEE754 (الان .Net روی این استاندارد هست) و BCD(قدیمی,در بعضی موارد سریعتر, خیلی دقیق و مصرف حافظه بیشتر ) رو نیاز داریم.
بنابراین برای عملیات ریاضی دو سری تابع نیاز داریم.
BCD و IEEE754
که میتونیم به سه شکل پیاده کنیم.
دو کلاس استاتیک هر کدام برای یک استاندارد
یک کلاس abstract و دو کلاس derived(مشتق)
و یک کلاس استاتیک که ورودی های مختلف میگیره.
البته ۵ ۶ حالت دیگه هم هست که از بحث خارجه.مثل اینترفیس یا جایگزاری زمان اجرا یا نوع داده abstract یا generic یا CRTP یا کلاس معمولی با قابلیت سویچ بین دو حالت که فعلا کاری باهاشون نداریم.



دو کلاس استاتیک یعنی Math_BCD و Math_IEEE754 که مشخص هست چطور عمل میکنند

و مشکلش اینه که تغییر در کد بسیار سخت میشه.


یک کلاس abstract یعنی Math و Math_BCD و Math_IEEE754 که دو کلاس اخیر از کلاس اول ارثبری میکنند و توابع abstract رو override میکنند.

مشکلش اینه:
http://en.wikipedia.org/wiki/Virtual_method_table



و یک کلاس استاتیک که ورودی های مختلف میگیره که بهترین پاسخ هست که با توجه به ورودی عمل کنه.

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

راجع به این نکته که overloading هیچگونه overhead ی نداره هم تحقیق کنید.
راجع به ADL هم تحقیق کنید بد نیست.