در قسمت های قبل با کلاس ها آشنا شدیم. یک کلاس یک reference type است. سی شارپ دارای نوعی از value type است که ساختار (struct) نامیده می شود. ساختار (struct) یک value type بوده که میتواند شامل سازنده ها ، ثابت ها ، فیلد ها ، متد ها ، صفات ، شاخص ها ، عملگرها ، رویدادها و ... باشد.
ساختار ها (struct)
سی شارپ دارای نوعی از value type
است که ساختار (struct
) نامیده می شود. یک ساختار (struct
) می تواند با استفاده از کلمه رزرو شده struct
تعریف شود.
در زیر تعریفی از یک ساختار آورده شده است :
public struct Discounts
{ public int Cloths { get; set; } public int HomeDecor { get; set; } public int Grocery { get; set; }
}
همانطور که میتوان یک متغیر ساده و یا کلاس را مقدار دهی کرد ، یک ساختار را میتوان با و یا بدون استفاده از کلمه new
مقداردهی اولیه کرد . بعد از آن می توانید به سادگی مقادیری را به اعضای یک ساختار انتساب دهید. در نمونه مثال زیر این انتساب نشان داده شده است :
using System;
public class Program
{
public static void Main()
{
Discounts saleDiscounts = new Discounts();
saleDiscounts.Cloths = 10;
saleDiscounts.HomeDecor = 5;
saleDiscounts.Grocery = 2;
Console.WriteLine(saleDiscounts.Cloths);
Console.WriteLine(saleDiscounts.HomeDecor);
Console.WriteLine(saleDiscounts.Grocery);
}
}
public struct Discounts
{ public int Cloths { get; set; } public int HomeDecor { get; set; } public int Grocery { get; set; }
}
خروجی :
10 5
2
یک ساختار یک value type
بوده و بنابراین سریع تر از یک کلاس است. از ساختارها در مواردی که می خواهید تنها یک داده را ذخیره کنید استفاده کنید. عموماً ساختار ها برای برنامه نویسی بازی ها مناسب هستند. با این حال انتقال یک کلاس ، ساده تر از انتقال یک ساختار است. بنابراین در مواردی که نیاز به انتقال داده بین کلاس ها را دارید از ساختار ها استفاده نکنید.
در نمونه مثال زیر یک ساختار و انواع مختلفی را که میتوان در آن قرار داد ، نشان داده شده است :
struct Point
{ private int _x, _y;
public int x, y;
public static int X, Y;
public int XPoint { get { return _x; }
set { _x = value; PointChanged(_x); } }
public int YPoint { get { return _y; } set { _y = value; PointChanged(_y); } }
public event Action<int> PointChanged;
public void PrintPoints() { Console.WriteLine(" x: {0}, y: {1}", _x, _y); }
public static void StaticMethod() { Console.WriteLine("Inside Static method"); }
}
ساختار نشان داده شده در نمونه مثال بالا شامل انواع مختلفی از صفات و رویدادهاست. این ساختار شامل فیلد های خصوصی _x
و _y
، فیلد های عمومی x
و y
، فیلد های استاتیک X
و Y
، صفات عمومی XPoint
و YPoint
و رویداد PointChanged
است.
آن همچنان دارای متد های استاتیک و غیر استاتیک است. دقت داشته باشید که ما رویداد PointChanged
را هنگامی که XPoint
و YPoint
تغییر میکند فراخوانی می کنیم. در نمونه مثال زیر ما ساختار Point
ذکر شده در بالا را با کلمه رزرو شده new
مقدار دهی کرده و سپس رویداد PointChanged
را مدیریت میکنیم.
class Program
{ static void StructEventHandler(int point) { Console.WriteLine("Point changed to {0}", point); }
static void Main(string[] args) { Point.StaticMethod();
Point p = new Point(); p.PointChanged += StructEventHandler; p.XPoint = 123; p.PrintPoints(); }
}
خروجی :
Inside Static Method Point changed to 123 X: 123, y: 0
توجه داشته باشید که اگر بخواهیم از صفات ، متد ها و رویدادهای یک ساختار استفاده کنیم ، باید ساختار مورد نظر را با کلمه رزرو شده ی new
مقدار دهی کنیم. نمونه مثال زیر باعث ایجاد خطا در زمان کامپایل خواهد شد :
Point pto;
pto.XPoint = 100; // compile time error
ویژگی های یک ساختار(struct)
- ساختار ها می توانند شامل سازنده ها ، ثابت ها ، فیلد ها ،متدها ، صفات ، شاخص ها ، عملگرها ، رویدادها و انواع تودرتو باشند.
- یک ساختار نمی تواند شامل یک سازنده و یا مخرب پیش فرض باشد.
- ساختارها میتوانند اینترفیس ها را پیاده سازی کنند.
- ساختار ها نمیتوانند از یک کلاس یا ساختاری دیگر ارث بری کنند.
- اعضای یک ساختار نمی توانند
abstract
،virtual
و یاprotected
باشند. - به منظور استفاده از اعضای یک ساختار از جمله صفات ، متد ها و رویدادها باید آن ساختار با کلمه رزرو شده
new
مقدار دهی اولیه شود.
تفاوت بین ساختار و کلاس
- کلاس یک
reference type
است در حالی که ساختار یکvalue type
است. - ساختار نمی تواند دارای سازنده و مخرب پیشفرض باشد با این حال ساختارها می توانند دارای سازندههای پارامتر دار باشند.
- ساختار را میتوان بدون استفاده از کلمه new نمونهسازی کرد. با این حال در این صورت نمیتوان از اعضای آن استفاده کرد.
به خاطر داشته باشید که
- ساختار یک value type است و با استفاده از کلمه رزرو شده struct تعریف می شود.
- ساختارها می توانند با و یا بدون کلمه رزرو شده new نمونهسازی شوند.
- اگر بخواهید اعضای یک ساختار برای شما در دسترس باشد باید از کلمه رزرو شده ی new برای نمونه سازی آن استفاده کنید .