ساختمان ها Structures
چهارشنبه 10 آذر 1389 10:18 PM
همانطور كه با استفاده از كلاسها ميتوان انواع (types) جديد و مورد نظر را ايجاد نمود، با استفاده از struct ها ميتوان انواع مقداري (value types) جديد و مورد نظر را ايجاد نمود. از آنجائيكه struct ها بعنوان انواع مقداري در نظر گرفته ميشوند، از اين رو تمامي اعمال مورد استفاده بر روي انواع مقداري را ميتوان براي struct ها در نظر گرفت. struct ها بسيار شبيه به كلاسها هستند و ميتوانند داراي فيلد، متد و property باشند. عموماً ساختارها مجموعه كوچكي از عناصري هستند كه منطقي با يكديگر داراي رابطه ميباشند. براي نمونه ميتوان به ساختار Point موجود در Framework SDK اشاره كرد كه حاوي دو property با نامهاي X و Y است.
با استفاده از ساختارها (struct) ميتوان اشيايي با انواع جديد ايجاد كرد كه اين اشياء ميتوانند شبيه به انواع موجود (int, float, …) باشند. حال سوال اين است كه چه زماني از ساختارها(struct) بجاي كلاس استفاده ميكنيم؟ در ابتدا به نحوه استفاده از انواع موجود در زبان C# توجه نماييد. اين انواع داراي مقادير و عملگرهاي معيني جهت كار با اين مقادير هستند. حال اگر نياز به شياي داريد كه همانند اين انواع رفتار نمايند لازم است تا از ساختارها (struct) استفاده نماييد. در ادامه اين مبحث نكات و قوانيني را ذكر ميكنيم كه با استفاده از آنها بهتر بتوانيد از ساختارها (struct) استفاده نماييد.
اعلان و پيادهسازي struct
براي اعلان يك struct كافيست تا با استفاده از كلمه كليدي 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);
}
}
مثال 9-2-1-2 نحوة ايجاد و استفاده از struct را نشان ميدهد. به راحتي ميتوان گفت كه يك نوع(type) ، يك struct است، زيرا از كلمه كليدي struct در اعلان خود بهره ميگيرد. ساختار پايهاي يك ساختار پايهاي يك struct بسيار شبيه به يك كلاس است، ولي تفاوتهايي با آن دارد كه اين تفاوتها در پاراگراف بعدي مورد بررسي قرار ميگيرند. ساختار Point داراي سازنده ايست كه مقادير داده شده با آنرا به فيلدهاي x و y تخصيص ميدهد. اين ساختار همچنين داراي متد Add() ميباشد كه ساختار Point ديگري را دريافت ميكند و آنرا به struct كنوني ميافزايد و سپس struct جديدي را باز ميگرداند.
توجه نماييد كه ساختار Point جديدي درون متد Add() تعريف شده است. توجه كنيد كه در اينجا همانند كلاس، نيازي به استفاده از كلمه كليدي new جهن ايجاد يك شيء جديد نميباشد. پس از آنكه نمونة جديدي از يك ساختار ايجاد شد، سازندة پيش فرض (يا همان سازندة بدون پارامترش) براي آن در نظر گرفته ميشود. سازندة بدون پارامتر كليه مقادير فيلدهاي ساختار را به مقادير پيش فرض تغيير ميدهد. بعنوان مثال فيلدهاي صحيح به صفر و فيلدهاي Boolean به false تغيير ميكنند. تعريف سازندة بدون پارامتر براي يك ساختار صحيح نميباشد. (يعني شما نميتوانيد سازندة بدون پارامتر براي يك struct تعريف كنيد.)
ساختارها (structs) با استفاده از عملگر new نيز قابل نمونهگيري هستند (هر چند نيازي به استفاده از اين عملگر نيست.) در مثال 9-2-1-2 pt1 و pt2 كه ساختارهايي از نوع Point هستند، با استفاده از سازندة موجود درون ساختار Point مقداردهي ميشوند. سومين ساختار از نوع Point، pt3 است و از سازندة بدون پارامتر استفاده ميكند زيرا در اينجا مقدار آن اهميتي ندارد. سپس متد Add() از ساختار pt1 فراخوانده ميشود و ساختار pt2 را بعنوان پارامتر دريافت ميكند. نتيجه به pt3 تخصيص داده ميشود، اين امر نشان ميدهد كه يك ساختار ميتواند همانند ساير انواع مقداري مورد استفاده قرار گيرد. خروجي مثال 9-2-1-2 در زير نشان داده شده است :
يكي ديگر از تفاوتهاي ساختار و كلاس در اين است كه ساختارها نميتوانند داراي تخريب كننده (deconstructor) باشند. همچنين ارثبري در مورد ساختارها معني ندارد. البته امكان ارثبري بين ساختارها و interface ها وجود دارد.
يك interface نوع مرجعي زبان C# است كه داراي اعضايي بدون پيادهسازي است. هر كلاس و يا ساختاري كه از يك interface ارثبري نمايد بايد تمامي متدهاي آنرا پيادهسازي كند. دربارة interface ها در آينده صحبت خواهيم كرد.
هم اكنون شما با چگونگي ايجاد يك ساختار آشنا شديد. هنگاميكه قصد داريد نوعي را بصورت ساختار يا كلاس پيادهسازي كنيد، بايد به اين نكته توجه كنيد كه اين نوع چگونه مورد استفاده قرار ميگيرد. اگر ميخواهيد سازندهاي بدون پارامتر داشته باشيد، در اينصورت كلاس تنها گزينه شماست. همچنين توجه نماييد از آنجائيكه يك ساختار بعنوان يك نوع مقداري در نظر گرفته ميشود، در پشته (Stack) ذخيره ميشود و حال آنكه كلاس در heap ذخيره ميگردد.