مشخصات مقاله
-
3326
-
0.0
-
16691
-
0
-
1
کلاس استاتیک (static class) در سی شارپ
وقتی توی یک پروژه C# با کلاسها و بخشهای مختلف بیشتری سروکار پیدا میکنی، ممکنه به بعضی از این اجزا اصلاً نیازی به نمونهسازی و ساخت شیء نداشته باشی. اینجاست که کلاسهای ایستا یا Static Class میتونن به کار بیان و برای تعریف اعضایی که مستقیماً به خود کلاس مربوط هستن، گزینه مناسبی باشن.
توی این بخش از آموزش C# میخوایم با مفهوم کلاسهای ایستا، نحوه ایجاد اونها و همچنین constructorهای static آشنا بشیم. اگه در حال یادگیری برنامهنویسی با C# هستی، آشنایی با این مفاهیم کمک میکنه نحوه سازماندهی کلاسها و استفاده از اعضای اونها رو بهتر درک کنی.
وقتی یک کلاس در سی شارپ به صورت استاتیک تعریف میشه، تمام اعضای اون هم باید از نوع استاتیک باشن. یعنی نمیتونیم یک عضو معمولی یا غیر استاتیک داخل چنین کلاسی قرار بدیم. توی این بخش از آموزش سی شارپ میخوایم دقیقاً همین موضوع رو بررسی کنیم.
همونطور که متد و متغیر میتونن ایستا باشن، کلاس هم میتونه به صورت ایستا تعریف بشه. کلاس ایستا کلاسیه که برای دسترسی به اعضای اون، هیچ نیازی به ساختن نمونهای از کلاس نداریم. به زبان سادهتر، برای دسترسی به اعضای یک کلاس ایستا فقط کافیه اسم کلاس، عملگر نقطه و عضو موردنظر رو بنویسیم.
در یک کلاس ایستا، اعضای کلاس باید به صورت ایستا تعریف شده باشن. یعنی نمیتونیم یک عضو غیر ایستا (non-static) به یک کلاس ایستا اضافه کنیم. تمام اعضای کلاس، به جز ثابتها، باید ایستا باشن.
ایجاد کلاس ایستا
برای اینکه یک کلاس رو به صورت ایستا تعریف کنیم، کافیه کلیدواژه static رو قبل از کلیدواژه class قرار بدیم.
مثال:
using System;
public static class Square
{
public static double side;
public static double Perimeter()
{
return side * 4;
}
public static double Area()
{
return side * side;
}
}
public class Exercise
{
public static int Main()
{
Square.Side = 36.84;
Console.WriteLine("Square Characteristics");
Console.Write("Side: ");
Console.WriteLine(Square.side);
Console.Write("Perimeter: ");
Console.WriteLine(Square.Perimeter());
Console.Write("Area: ");
Console.WriteLine(Square.Area());
Console.ReadKey();
return 0;
}
}
نتیجه
Square Characteristics Side: 36.84 Perimeter: 147.36 Area: 1357.1856 Press any key to continue . . .
توابع سازنده ی استاتیک
در C# میتونیم constructor رو هم مثل بعضی از توابع، به صورت Static تعریف کنیم. البته برای این کار یکسری قوانین وجود داره که باید رعایتشون کنیم. وقتی یک تابع سازنده رو به صورت static تعریف میکنیم، برای استفاده از اون خارج از کلاس نیازی به ساختن نمونه یا شیء از کلاس نداریم؛ اما باید خودمون اون رو به صورت صریح تعریف کنیم، چون کامپایلر بهصورت خودکار چنین constructorای ایجاد نمیکنه.
تابع سازندهی static باید به عنوان constructor پیشفرض استفاده بشه. یعنی باید constructorای تعریف کنیم که هیچ آرگومانی دریافت نکنه.
public class Person
{
public string firstName;
static Person()
{
}
}
وقتی یک تابع سازندهی static ایجاد میکنیم، دیگه امکان استفاده از فیلدها یا اعضای غیر static کلاس موردنظر وجود نداره.
با این حال، همچنان میتونیم به فیلدهای کلاس دسترسی داشته باشیم.
using System;
public class Person
{
public string firstName;
static Person()
{
}
}
public class Exercise
{
public static int Main()
{
Person pers = new Person();
pers.firstName = "Gertrude";
Console.WriteLine("Personal Identification");
Console.Write("Name: ");
Console.WriteLine(pers.firstName);
Console.ReadKey();
return 0;
}
}
برای استفاده از constructorای که خاصیت static داره، چند راه پیش رومون هست. اگه بخوایم یک متغیر عضوی رو داخل تابع سازندهی static مقداردهی اولیه کنیم، اول باید یک متغیر برای اون کلاس تعریف کنیم و بعد از طریق اون متغیر به عضو موردنظر دسترسی داشته باشیم.
public class Person
{
public string firstName;
static Person()
{
Person pers = new Person();
pers.firstName = "Gertrude";
}
}
در واقع یکی از کاربردهای اصلی تابع سازندهی static اینه که فیلدهای static کلاس رو مقداردهی اولیه کنیم یا عملیاتی رو انجام بدیم که بین تمام نمونههای کلاس مشترکه. بنابراین یکی دیگه از موارد استفاده از این constructor، مقداردهی اولیه متغیرهای عضو static کلاس هست. بعد از این مقداردهی، وقتی به فیلدهای static دسترسی پیدا میکنیم، میبینیم که مقدار موردنظر رو در خودشون دارن و آماده استفاده هستن.
using System;
public class Person
{
public static string firstName;
static Person()
{
firstName = "Gertrude";
}
}
public class Exercise
{
public static int Main()
{
Console.WriteLine("Personal Identification");
Console.Write("Name: ");
Console.WriteLine(Person.firstName);
Console.ReadKey();
return 0;
}
}
نتیجه
Personal Identification Name: Gertrude Press any key to continue . . .
چون تابع سازنده static هست، نمیتونیم از طریق اعلان یک متغیر برای کلاس موردنظر به اون دسترسی داشته باشیم. یک قانون دیگه هم در کار با تابع سازندهی static وجود داره و اون اینه که نباید تحت هیچ شرایطی به اون تنظیمکنندهی سطح دسترسی (access modifier) اضافه کنیم. کد زیر باعث ایجاد خطا میشه.
public class Person
{
public static Person()
{
}
}
میتونیم کلاسی داشته باشیم که هم یک تابع سازندهی static و هم یک یا چند constructor غیر static داشته باشه.
public class Person
{
public string firstName;
public string lastName;
static Person()
{
}
public Person(string first, string last)
{
firstName = first;
lastName = last;
}
}
اگه چنین کلاسی تعریف کنیم و بخوایم برای اون یک متغیر اعلان کنیم، constructor پیشفرضی برای کلاس وجود نداره یا در حال حاضر در دسترس نیست. بنابراین، برای تعریف متغیر باید از constructorای استفاده کنیم که دو پارامتر ورودی دریافت میکنه و اون متغیر رو به عنوان آرگومان میپذیره.
using System;
public class Person
{
public string firstName;
public string lastName;
static Person()
{
}
public Person(string first, string last)
{
firstName = first;
lastName = last;
}
}
public class Exercise
{
public static int Main()
{
Person pers = new Person("Gertrude", "Monay");
Console.WriteLine("Personal Identification");
Console.Write("First Name: ");
Console.WriteLine(pers.firstName);
Console.Write("Last Name: ");
Console.WriteLine(pers.lastName);
Console.ReadKey();
return 0;
}
}
نتیجه
Personal Identification First Name: Gertrude Last Name: Monay Press any key to continue . . .
با توجه به مطالبی که گفتیم، بهتره فقط زمانی constructor تعریف کنید که دلیل مشخص و خوبی برای ایجاد اون داشته باشید.
اگه میخوای مفاهیم C# رو اصولیتر یاد بگیری و در کنار مباحثی مثل کلاسها و اعضای static، مسیر یادگیری برنامهنویسی با C# رو کاملتر دنبال کنی، میتونی از دوره آموزش C# استفاده کنی و یادگیری این زبان رو مرحلهبهمرحله ادامه بدی.