در این مقاله به معرفی کلاسها در سی شارپ و structها میپردازیم. در سی شارپ classها و structها تقریبا شبیه به هم هستند ولی یکی از آنها value type (نوع مقداری) است و یکی دیگر reference type (نوع ارجاعی) است. در زبان سی شارپ، کلاسها از نوع ارجاعی و structها از نوع مقداری هستند. در ادامه به معرفی Struct میپردازیم با ما همراه باشید.
Struct (ساختار)
structها شبیه به classها هستند اما در پشت پرده تفاوتهایی نیز با هم دارند. یکی از این تفاوتها در ارثبری است یعنی در structها ارثبری وجود ندارد، اما نحوه تعریف آن مانند classها میباشد و میتوان در ساختار آن فیلد، متد و خصوصیت نیز تعریف کرد، البته به این موضوع توجه کنید که برای یادگیری کلاس ها و ساختارها در سی شارپ علاوه بر خواندن این مقاله می توانید از دوره آموزش سی شارپ که در سایت قرار داده ایم نیز استفاده کنید، با ما همراه باشید در ادامه میخواهیم به مزیت های ساختار ها و کلاس ها بپردازیم.
structها چه مزیتی دارند؟
struct یک جایگزین سبک حجم برای کلاسها به حساب میآیند. به بیان دیگر اگر بخواهیم نسخههای زیادی از یک داده را مقداردهی کنیم از ساختارها استفاده میکنیم. نمونههایی که از یک ساختار ساخته میشوند به صورت stack ذخیره شده، اما نمونهای که از یک کلاس ساخته میشود بر روی حافظه در یک ساختار درختی (heap) قرار میگیرند.
public struct Test
{
private int x , y;
public Test(int x, int y)
{
this.x = x;
this.y = y;
}
}
ساختارها را میتوانیم بدون تعریف آن مقداردهی اولیه کنیم و مقادیر را به راحتی به اعضای ساختار انتساب دهیم. اما اگر بخواهیم اعضای یک ساختار برای ما قابل دسترس باشند باید از کلمه new برای نمونهسازی آن استفاده کرد.
Test testStruct; or // Test testStruct = new Test();
testStruct.x = 10;
testStruct.y = 50;
در قسمت بالا گفتیم که ساختار از نوع value type بوده و به همین خاطر سریعتر از کلاسها هستند. سعی کنید از ساختارها زمانی استفاده کنید که میخواهید یک داده را ذخیرهسازی کنید. بنابراین اگر نیاز به انتقال داده دارید از ساختارها استفاده نکنید، بهتر است که از کلاسها استفاده بشود.
ویژگی ساختارها (struct)
-
در ساختارها میتوان از سازنده، ثابتها، متدها، فیلدها، شاخصها، صفات، عملگرها، رویدادها و انواع تو در تو استفاده کرد.
-
برای دسترسی به اعضای ساختار باید از کلمه رزرو شده new استفاده کرد.
-
ساختارها نمیتوانند دارای مخرب و سازنده پیشفرض باشند.
-
ساختارها نمیتوانند مانند کلاسها ارث بری در سی شارپ را داشته باشند.
-
قابلیت پیادهسازی اینترفیسها در ساختارها وجود دارد.
-
در ساختارها اعضای آن میتوانند virtual، abstract، protected باشند.
Class (کلاس)
بزارید اینجوری شروع کنم: یک کلاس در واقع مانند نقشهای کامل از یک شی مشخص است. در جهان واقعی هر شی، دارای یکسری خصوصیات مانند رنگ، شکل و نوع عملکرد است.
مثلا شما یک اتومبیل فراری را در نظر بگیرید. فراری یک شی از نوع اتومبیل است و اتومبیل در اینجا نقش کلاس را دارد. خود این کلاس یعنی اتومبیل میتواند دارای خصوصیات معینی مانند سرعت، رنگ و شکل باشد. پس هر شرکت خودروسازی که یک اتومبیل را با ویژگیهای مورد نظرش تولید کند، شیای از یک اتومبیل را ساخته است.
اما کلاسها در بحث برنامهنویسی دارای فیلد، صفت، رویداد و متدها هستند که نوع داده و عملکرد اشیا را مشخص میکنند. کلاسها را در زبان برنامهنویسی سی شارپ با استفاده از کلمه رزرو شده class تعریف میکنیم:
public class Test
{
// fields , properties , methods and events ……..
}
در مثال بالا ابتدا سطح دسترسی کلاس را مشخص میکنیم و سپس از کلمه رزرو شده class استفاده کرده و یک نام برای آن به صورت دلخواه انتخاب میکنیم. داخل براکتها بدنه کلاس را پیادهسازی میکنیم.
زمانی که ما بخواهیم به اعضای کلاس دسترسی داشته باشیم باید یک شی از آن کلاس در قسمت main برنامه که پیکر اصلی کدنویسی میباشد، تعریف کنیم:
Test test = new Test();
زمانی که نمونهای از کلاس ساخته میشود ارجاع آن به یک شی توسط برنامهنویس انجام میگیرد. در کلاسها هم میتوانیم سازندههای پارامتردار یا بدون پارامتر داشته باشیم که سازندهها هنگامی که ما داریم شیای از کلاس را تعریف میکنیم فراخوانی میشوند.
مثالی از کلاس در سی شارپ:
public class Test
{
//Fields
public string Name = "Morteza";
//Constructor
public Test()
{
}
//Method or Function
public void TestMethod(int x, int y)
{
Console.WriteLine("First Parameter {0}, second parameter {1}",x , y);
}
//Auto-Implemented Property
public int TestAutoImplementedProperty { get; set; }
//Property
public int TestPropertyVar;
public int TestProperty
{
get { return TestPropertyVar; }
set { TestPropertyVar = value; }
}
}
آشنایی با اجزای داخلی کلاس ها در سی شارپ:
-
تابع سازنده (constructor)
سازنده همنام با نام کلاس میباشد و به طور پیشفرض public است. هنگام تعریف یک نمونه یا یک شی از کلاس پارامترهای آن پر میشود. وظیفه اصلی آن ساخت و برگرداندن نمونه جدید از کلاس است. برای استفاده از سازندهها (constructor)ابتدا باید سطح دسترسی آن مشخص شود که به صورت public است و سپس نام آن را باید همنام با نام کلاس کنید که هیچ خروجی برنمیگرداند ولی دارای ورودی است.
زمان که ما یک شی از کلاس را در برنامه ایجاد میکنیم، تابع سازنده بهطور خودکار فراخوانی و اجرا میشود و اگر ما سازنده را برای کلاس تعریف نکنیم کامپایلر به طور پیشفرض خودش یک متد سازنده بدون پارامتر برای کلاس در نظر میگیرد.
public class Test
{
public Test()
{
}
}
-
فیلد (Field)
-
پراپرتی (Property)
پراپرتیها در سی شارپ برای دسترسی به اعضای خصوصی یا فیلدهایی با دسترسی private میباشند. هر پراپرتی شامل دو بخش میباشد
-
Set: بخش set برای مقدار دهی میباشد.
-
Get: بخش get برای دسترسی به مقدار است
پراپرتیها را به صورت public تعریف میکنیم تا در کلاسهای دیگر هم قابل دسترسی باشند.
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
زمانیکه یک پراپرتی شامل get باشد read only به حساب میآید و اگر فقط شامل set باشد write only است.
هنگامی که در کدنویسی نیازی نیست داخل get و set شرط خاصی قرار دهیم و بررسی کنیم و فقط میخواهیم مقدار فیلد را در پراپرتی قرار داده (get) یا مقدار آن را بگیریم (set) از تعریف ساده پراپرتیها بدون هیچ بدنهای استفاده میکنیم. نیازی نیست دیگر فیلدها را خصوصی تعریف کنیم همان به صورت عمومی تعریف میشود.
public string Name { get; set; }
زمانیکه فیلد ها را به صورت بالا تعریف میکنیم کامپایلر خودش یک فیلد به صورت خصوصی برای آن پراپرتی تعریف میکند و get set را به صورت خودکار پیادهسازی میکند. به این روش پراپرتی خودکار (Automatic Properties) میگویند.
متدها یا توابع:
برای تعریف متدها ابتدا باید سطح دسترسی آن مشخص شود. آنها میتوانند برای ما یک مقدار از هر نوع دادهای را بازگردانند یا مقداری برنگرداند که از نوع void تعریف میشود. بعد از مشخص شدن نوع آن ما یک اسم برای متد انتخاب میکنیم و در جلوی آن پرانتز قرار میدهیم.
اگر میخواهید درباره تابع در سی شارپ بیشتر بدانید، مطلب ما درباره این موضوع را از دست ندهید.
public void TestMethod(int x, int y)
{
Console.WriteLine(“First Parameter {0}, second parameter {1}”,x , y);
}
در برنامه اصلی ما میتوانیم متدها یا توابع را فراخوانی کنیم. به این صورت ما نام شیای از کلاس را که تعریف شده، میآوریم و بعد از آن دات(.) گذاشته و حالا میتوانیم به توابع آن کلاس دسترسی داشته باشیم.
تفاوت بین کلاس و ساختار
-
کلاسها از نوع refrence type و ساختارها از نوع value type هستند. در نتیجه چون کلاس از فیلد رفرنس استفاده میکند بنابراین حافظه بیشتری اشغال میکند. ولی Struct چون از فیلد رفرنس استفاده نمیکند حافظه کمتری اشغال میکند.
-
ساختارها را میتوانیم بدون کلمه new آن را فراخوانی کرد اما دیگر از اعضای آن نمیتوانیم استفاده کنیم.
-
ساختارها نمیتوانند سازنده و مخرب پیشفرض داشته باشند اما سازنده پارامتردار میتوانند داشته باشند.
-
در class به محض ساخته شدن شی فضایی به آن اختصاص داده میشود ولی در Struct حتی با وجود ساخته شدن شی فضایی به آن اختصاص داده نمیشود تا زمانی که مقداری داخل آن فیلد قرار گیرد.
-
کلاس میتواند وراثت داشته باشد امّا Struct نمیتواند وراثت داشته باشد.
امیدواریم مطالب بالا برای شما کاربردی باشد و آشنایی و اطلاعات زیادی در مورد کلاسها و ساختارها بدست آورده باشید. به همین دلیل ما برای آشنایی کامل شما عزیزان دوره آموزشی را به صورت کاملا کاربردی و جامع در سایت قرار دادیم که از آن استفاده کنید. در این دوره تمامی آنچه که در مباحث مقدماتی یک زبان نیاز دارید، گفته شده است. همچنین مبحث کلاسها نیز به طور کامل برایتان آورده شده است. با نظرات و پیشنهادات خود، ما در پیشرفت سایت همراهی کنید.
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.