کلمه کلیدی static
نام دوره: زبان سی شارپ مقدماتی
نویسنده: علی مقدم جاه (مدرس دوره)
دستور static چیست؟
در پست آموزش کلاس چیست، با مفهوم اجزا داخلی یک کلاس همانند فیلدها، پراپرتیها، متدها و … آشنا شدید.
بصورت پیشفرض تمامی اجزا نوشته شده درون یک کلاس، متعلق به اشیائی که از آن کلاس تعریف میشوند، هستند.
برای درک بهتر شما عزیزان، ابتدا کلاس Student را با سه پراپرتی و یک متد تعریف میکنیم:
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public string StudentFamily { get; set; }
public override string ToString()
{
return string.Format($"Id: {StudentId}\tName: {StudentName}\tFamily : {StudentFamily}");
}
}
در مثال فوق، تمامی اجزاء درون کلاس Student که دارای سطح دسترسی public باشند، قابل دسترسی توسط اشیاء (نمونه ها) یا همان object های تعریف شده از آن کلاس در برنامه هستند:
class Program
{
public static void Main(string[] args)
{
Student object1 = new Student();
object1.StudentId = 1;
object1.StudentName = "ali";
object1.StudentFamily = "moghadam";
Console.WriteLine(object1.ToString());
}
}
همانطور که در کد بالا مشاهده میکنید، شئ تعریف شده از کلاس Student به نام object1 دسترسی به هر سه پراپرتی و متد ToString از کلاس Student را دارد، چرا که این شئ object1 از کلاس Student تعریف شده است.
اما اگر در زمان تعریف هر یک از این اجزاء درون کلاس Student، پس از نام سطح دسترسی (مثلا public)، از کلمه کلیدی static استفاده کنید، دیگر آن عضو متعلق به شئ نبوده و نمیتوانید به کمک شناسه شئ تعریف شده از آن کلاس در برنامه خود، به عضو static شده دسترسی داشته باشید.
علت این مورد این است که دیگر آن عضو static شده، متعلق به شئ یا دیگر اشیاء تعریف شده از کلاس نبوده و تنها متعلق به خود کلاس است:
public class Student
{
public static int StudentId { get; set; }
public static string StudentName { get; set; }
public static string StudentFamily { get; set; }
public static override string ToString()
{
return string.Format($"Id: {StudentId}\tName: {StudentName}\tFamily : {StudentFamily}");
}
}
مثلا در کد بالا، ما هر چهار عضو کلاس Student را از نوع static تعریف کردهایم، درنتیجه برای استفاده از این چهار عضو، دیگر نیازی به ساخت یک شئ یا نمونه از کلاس Student درون برنامه خود نداشته و تنها با استفاده از نام کلاس Student میتوانیم به این عضوهای static شده دسترسی پیدا کنیم!
مثال قابل لمس آن برای شما عزیزان، دستوراتی است که تاکنون بسیار از آنها استفاده کردهاید:
Console.Write();
Console.WriteLine();
Console.Clear();
Console.Read();
Console.ReadLine();
Console.ReadKey();
تمامی این متدها از کلاس Console هستند، اما شما هیچوقت برای استفاده از این متدها در برنامه خود، اول یک شئ یا نمونه از کلاس Console تعریف نکردید!
علت این مورد هم، static تعریف شدن تمامی این متدها بوده که شما برای دسترسی به آنها، تنها از نام کلاس Console استفاده میکنید.
نکته: درصورتی که متدها را از نوع static تعریف کنید، نمیتوانید از اعضا غیر static در محدوده بلاک این متد استفاده کنید.
جهت شرکت در دورههای زبان برنامه نویسی سیشارپ، از کد تخفیف heplc30 استفاده کنید.