اعضای Static

اگر بخواهیم عضو داده‌ای (فیلد) یا خاصیتی ایجاد کنیم که در همه نمونه‌های کلاس قابل دسترسی باشد از کلمه کلیدی static استفاده می‌کنیم. کلمه کلیدی static برای اعضای داده‌ای و خاصیت‌هایی به کار می‌رود که می‌خواهند در همه نمونه‌های کلاس تقسیم شوند. وقتی که یک متد یا خاصیت به صورت static تعریف شود، می‌توانید آنها را بدون ساختن نمونه‌ای از کلاس، فراخوانی کنید. به مثالی در مورد متدها و خاصیتهای static توجه کنید :

   1: using System;
   2: 
   3: class SampleClass
   4: {
   5:     public static string StaticMessage { get; set; }
   6:     public string NormalMessage { get; set; }
   7: 
   8:     public static void ShowStaticMessage() 
   9:     {                                      
  10:         Console.WriteLine(StaticMessage);  
  11:     }                                      
  12: 
  13:     public void ShowNormalMessage()
  14:     {
  15:         Console.WriteLine(NormalMessage);
  16:     }
  17: 
  18:     public void ShowStaticFromInstance()
  19:     {
  20:         Console.WriteLine(StaticMessage);
  21:     }
  22: }
  23: 
  24: class Program
  25: {
  26:     public static void Main()
  27:     {
  28:         SampleClass sample1 = new SampleClass();
  29:         SampleClass sample2 = new SampleClass();
  30: 
  31:         SampleClass.StaticMessage = "This is the static message!";
  32:         SampleClass.ShowStaticMessage(); 
  33: 
  34:         sample1.NormalMessage = "nMessage from sample1!";
  35:         sample1.ShowNormalMessage();
  36:         sample1.ShowStaticFromInstance();
  37: 
  38:         sample2.NormalMessage = "nMessage from sample2!";
  39:         sample2.ShowNormalMessage();
  40:         sample2.ShowStaticFromInstance();
  41:     }
  42: }
This is the static message!

Message from sample1!
This is the static message!

Message from sample2!
This is the static message!

در مثال بالا یک خاصیت استاتیک به نام StaticMessage (خط 5) و یک متد استاتیک به نام ShowStaticMessage() (خطوط 11-8) تعریف کرده‌ایم. مقدار خاصیت StaticMessage در همه نمونه‌های کلاس SampleClass قابل دسترسی است. متد استاتیک را نمی‌توان به وسیله نمونه ایجاد شده از کلاس SampleClass فراخوانی کرد. برای فراخوانی یک متد یا خاصیت استاتیک، به سادگی می‌توان نام کلاس و بعد از آن علامت دات ( . ) و در آخر نام متد یا خاصیت را نوشت. این موضوع را می‌توان در خطوط (32-31) مشاهده کرد. مشاهده می‌کنید که لازم نیست هیچ نمونه‌ای از کلاس ایجاد شود.

همانطور که مشاهده می‌کنید یک پیغام را به StaticMessage اختصاص داده‌ایم و با فراخوانی یک متد استاتیک (ShowStaticMessage()) مقدار آن را نمایش می‌دهیم. در مرحله بعد خاصیت NormalMessage را به وسیله دو نمونه ایجاد شده فراخوانی می‌کنیم و یک متد را هم برای نشان دادن مقدار آن فراخوانی می‌کنیم. همانطور که مشاهده می‌کنید نمونه‌های ایجاد شده دارای مقدار NormalMessage مخصوص خودشان هستند چون خاصیت NormalMessage غیر استاتیک است.

سپس ShowStaticFromInstance() فراخوانی می‌کنیم که متدی برای نشان دادن مقدار StaticMessage می‌باشد. متدهای غیر استاتیک می‌توانند از فیلدها و خاصیت‌های استاتیک استفاده کنند ولی عکس این قضیه امکان پذیر نیست. به عنوان مثال اگر شما یک متد static داشته باشید نمی‌توانید از هر خاصیت، متد، یا فیلدی که static نیست، استفاده کنید.

private int number = 10;

public static void ShowNumber()
{
   Console.WriteLine(number); //Error: cannot use non-static member
}

اصرار بر این کار باعث بروز خطا می‌شود. به این نکته نیز توجه کنید که در سی شارپ، متد Main() باید به صورت static تعریف شود. کامپایلر به Static بودن متد Main() نیاز دارد تا بتواند برنامه را بدون ساختن نمونه اجرا کند.