آموزش سی شارپ c# درس دوازدهم

 
ارسال شده در تاریخ 1392/7/22 توسط admin در زمینه آموزش سی شارپ
 
درس دوازدهم - ساختارها در (Struct) C#
 
در این درس با ساختارها (Struct) در زبان C# آشنا میشویم . اهداف این درس بشرح زیر می باشند
• یک struct یا ساختار (Structure) چیست؟
• پی ادهسازی ساختارها (Struct)
• استفاده از ساختارها (Struct)
• نکات مهم و مطالب کمکی درباره struct ها
 
ساختار (struct) چیست؟
همانطور که با استفاده از کلاسها می توان انواع (types) جدید و مورد نظر را ایجاد نمود، با استفاده از struct ها می توان انواع مقداری (value types) جدید و مورد نظر را ایجاد نمود . از آنجائیکه struct ها بعنوان انواع مقداری در نظر گرفته می شوند، از اینرو تمامی اعمال مورد استفاده بر روی انواع مقداری را می توان برای struct ها در نظر گرفت struct . ها بسیار شبیه به کلا سها هستند و می توانند دارای فیلد، متد و property باشند . عموماً ساختارها مجموعه کوچکی از عناصری هستند که منطقی با یکدیگر دارای رابطه میباشند . برای نمونه می توان به ساختار Point موجود در Framework SDK اشاره کرد که حاوی دو property با نامهای X و Y است .
 
با استفاده از ساختارها (struct) می توان اشیایی با انواع جدید ایجاد کرد که این اشیاء می توانند شبیه به انواع موجود (int, float, ...) باشند . حال سوال اینست که چه زمانی از ساختارها (struct) بجای کلاس استفاده می کنیم؟ در ابتدا به نحوه
استفاده از انواع موجود در زبا ن C# توجه نمای ید . این انواع دارای مقادیر و عملگرهای معینی جهت کار با این مقادیر هستن د . حال اگر نیاز به شی ای دارید که همانند این انواع رفتار نمایند لازم است تا از ساختارها (struct) استفاده نمای ید . در ادامه این مبحث نکات و قوانینی را ذکر می کنیم که با استفاده از آنها بهتر بتوانید از ساختارها (struct) استفاده نمایید .
 
اعلان و پیاده سازی struct
برای اعلان یک struct کافیست تا با استفاده از کلمه کلیدی struct که بدنبال آن نام مورد نظر برای ساختار آمده استفاده کرد . بدنه ساختار نیز بین دو کروشه باز و بسته {} قرار خواهد گرفت . به مثال زیر توجه نمایید :
 
مثال : 12-1 نمونه ای از یک ساختار (Struct)
using System; struct Point
{
public int x; public int y;
public Point(int x, int y)
{
this.x = x; this.y = y;
}
public Point Add(Point pt)
{
Point newPt;
 
 newPt.x = x + pt.x; newPt.y = y + pt.y; return newPt;
}
}
///
مثالی از اعلان و ساخت یک /// struct
/// class StructExample
{
static void Main(string[] args)
{
Point pt1 = new Point(1, 1); Point pt2 = new Point(2, 2); Point pt3;
pt3 = pt1.Add(pt2);
Console.WriteLine("pt3: {0}:{1}", pt3.x, pt3.y);
}
}
 
مثال 12-1 نحوه ایجاد و استفاده از struct را نشان می دهد . به راحتی میتوان گفت که یک نوع (type) ، یک struct است، زیرا
از کلمه کلیدی struct در اعلان خود بهره می گیرد . ساختار پایه ای یک ساختار پای ه ای یک struct بسیار شبیه به یک کلاس است، ولی تفاوتهایی با آن دارد که این تفاوتها در پاراگراف بعدی مورد بررسی قرار می گیرند . ساختار Point دارای سازنده ایست که مقادیر داده شده با آنرا به فیلدهای x و y تخصیص میدهد . این ساختار همچنین دارای متد Add() می باشد که ساختار Point دیگری را دریافت میکند و آنرا به struct کنونی می افزاید و سپس struct جدیدی را باز می گرداند .
 
توجه نمایید که ساختار Point جدیدی درون متد Add() تعریف شده است . توجه کنید که در اینجا همانند کلاس، نیازی به استفاده از کلمه کلیدی new جهن ایجاد یک شیء جدید نمی باشد . پس از آنکه نمونه جدیدی از یک ساختار ایجاد شد، سازنده پیش فرض ) یا همان سازنده بدون پارامترش ( برای آن در نظر گرفته می شود . سازنده بدون پارامتر کلیه مقادیر فیلدهای ساختار
را به مقادیر پیش فرض تغییر می دهد . بعنوان مثال فیلدهای صحیح به صفر و فیلدهای Boolean به false تغییر می کنند . تعریف سازنده بدون پارامتر برای یک ساختار صحیح نمی باشد ) . یعنی شما نم یتوانید سازنده بدون پارامتر برای یک struct تعریف کنید (.
 
ساختارها (structs) با استفاده از عملگر new نیز قابل نمونه گیری هستند ) هر چند نیازی به استفاده از این عملگر نیست (. در مثال pt1 12-1 و pt2 که ساختارهایی از نوع Point هستند، با استفاده از سازنده موجود درون ساختار Point مقداردهی می شوند . سومین ساختار از نوع Point ، pt3 است و از سازنده بدون پارامتر استفاده می کند زیرا در اینجا مقدار آن اهمیتی ندارد . سپس متد Add() از ساختار pt1 فراخوانده می شود و ساختار pt2 را بعنوان پارامتر دریافت میکند . نتیجه به pt3 تخصیص داده می شود، این امر نشان می دهد که یک ساختار می تواند همانند سایر انواع مقداری مورد استفاده قرار گیرد . خروجی مثال 12-1 در زیر نشان داده شده است :
pt3 : 3 : 3
 
یکی دیگر از تفاوتهای ساختار و کلاس در اینست که ساختارها نمی توانند دارای تخریب کننده (deconstructor) باشند . همچنین ار ث بری در مورد ساختارها معنی ندارد . البته امکان ار ثبری بین ساختارها و interface ها وجود دارد . یک interface
 
www.cporoje.ir
نوع مرجعی زبان C# است ک ه دارای اعضایی بدون پیاده سازی است . هر کلاس و یا ساختاری که از یک interface ارث بری نماید باید تمامی متدهای آنرا پیاده سازی کند . درباره interface ها در آینده صحبت خواهیم کرد .
 
خلاصه :
هم اکنون شما با چگونگی ایجاد یک ساختار آشنا شدی د . هنگامیکه قصد دارید نوعی را بصورت ساختار یا کلاس پی ادهسازی کنید، باید به این نکته توجه کنید که این نوع چگونه مورد استفاده قرار می گیرد . اگر می خواهید سازند های بدون پارامتر داشته باشید، در اینصورت کلاس تنها گزینه شماست . همچنین توجه نمایید از آنجائیکه یک ساختار بعنوان یک نوع م قداری در نظر گرفته میشود، در پشته (Stack) ذخیره میشود و حال آنکه کلاس در heap ذخیره میگردد .
 
نکات مهم و مطالب کمکی
 
.1 تفاوتهای اصلی بین کلاس و ساختار در چیست؟
همانطور که بطور مختصر در بالا نیز اشاره شد، از نظر نوشتاری struct (syntax) و کلاس بسیار شبیه به یکدیگر هستند اما دارای تفاوتهای بسیار مهمی با یکدیگر می باشند .
همانطور که قبلاً نیز اشاره شد شما نمی توانید برای یک struct سازند ه ای تعریف کنید که بدون پارامتر است، یعنی برای ایجاد سازنده برای یک struct حتماً باید این سازنده دارای پارامتر باشد . به قطعه کد زیر توجه کنید :
struct Time
{
خطای زمان کامپایل رخ می دهد public Time() { ... } //
 
}
پس از اجرای کد فوق کامپایلر خطایی را ایجاد خواهد کرد بدین عنوان که سازنده struct حتماٌ باید دارای پارامتر باشد . حال اگر بجای struct از کلمه کلیدی calss استفا ده کرده بودیم این کد خطایی را ایجاد نمی کرد . در حقیقت تفاوت در اینست که در مورد struct ، کامپایلر اجازه ایجاد سازنده پیش فرض جدیدی را به شما نمی دهد ولی در مورد کلاس چنین نیست . هنگام اعلان کلاس در صورتیکه شما سازنده پیش فرضی اعلان نکرده باشید، کامپایلر سازن ده ای پیش فرض برای آن در نظر می گیرد ولی در مورد struct تنها سازنده پیش فرضی معتبر است که کامپایلر آنرا ایجاد نماید نه شما !
یکی دیگر از تفاوتهای بین کلاس و struct در آن است که، اگر در کلاس برخی از فیلدهای موجود در سازنده کلاس را مقداردهی نکنید، کامپایلر مقدار پیش فرض صفر، false و یا null را برای آن فیلد در نظر خواهد گرفت ولی در struct تمامی فیلدهای سازنده باید بطور صریح مقداردهی شوند و درصورتیکه شما فیلدی را مقداردهی نکید کامپایلر هیچ مقداری را
برای آن در نظر نخواهدگرفت و خطای زمان کامپایل رخ خواهد داد . بعنوان مثال در کد زیر اگر Time بصورت کلاس تعریف شده بود خطایی رخ نم یداد ولی چون بصورت struct تعریف شده خطای زمان کامپایل رخ خواهد داد :
struct Time
{
public Time(int hh, int mm)
{
hours = hh; minutes = mm;
: seconds not initialized خطای زمان کامپایلی بدین صورت رخ می دهد } //
 
 
 
private int hours, minutes, seconds;
}
 
تفاوت دیگر کلاس و struct در اینست که در کلاس می توانید در هنگام اعلان فیلدها را مقداردهی کنید حال آنکه در struct چنین عملی باعث ایجاد خطای زمان کامپایل خو اهد ش د . همانند کدهای فوق، در کد زیر اگر از کلاس بجای struct استفاده شده بود خطا رخ نمی داد :
 
struct Time
{
 
کامپایل رخ میدهد خطای زمان private int hours = 0; //
private int minutes; private int seconds;
}
 
آخرین تفاوت بین کلاس و struct که ما به آن خواهیم پرداخت در مورد ار ثبری است . کلاسها می توانند از کلاس پایه خود ارث بری داشته باشند در حالیکه ار ث بری در struct ها معنایی ندارد و یک struct تنها می تواند از واسطها (interface) ار ثبری داشته باشد .
.2 پس از ایجاد یک ساختار چگونه می توان از آن استفاده نمود؟
همانطور که گفتیم، ساختارها روشی برای ایجاد انواع جدید مقدار (Value Types) هستند . از اینرو پس از ایجاد یک ساختار می توان از آن همانند سایر انواع مقداری استفاده نمود . برای استفاده از یک ساختار ایجاد شده کافیست تا نام آنرا قبل از متغیر مورد نظر قرار دهیم تا متغیر مورد نظر از نوع آن ساختار خاص تعریف شود .
struct Time
{
 
private int hours, minutes, seconds;
}
 
class Example
{
public void Method(Time parameter)
{
Time localVariable;
 
}
private Time field;
}
 
آخرین نکته ای که در مورد ساختارها برای چندمین بار اشاره می کنم انست که، ساختارها انواع مقداری هستند و مستقیماً مقدار را در خود نگه میدارند و از اینرو در stack نگهداری می شوند . استفاده از ساختارها همانند سایر انواع مقداری است .

www.cporoje.ir

Copyright © 2014 icbc.ir