ساختار (Struct)

ساختارها یا struct انواع داده‌ای هستند که توسط کاربر تعریف می‌شوند (user-define) و می‌توانند دارای فیلد و متد باشند. با ساختارها می‌توان نوع داده‌ای خیلی سفارشی ایجاد کرد. فرض کنید می‌خواهیم داده‌ای ایجاد کنیم که نه تنها نام شخص را ذخیره کند بلکه سن و حقوق ماهیانه او را نیز در خود جای دهد. برای تعریف یک ساختار به صورت زیر عمل می‌کنیم :

struct StructName
{
   member1;
   member2;
   member3;
   ...
   member4;
}

برای تعریف ساختار از کلمه کلیدی struct استفاده می‌شود. برای نامگذاری ساختارها از روش نامگذاری struct استفاده می‌شود. اعضا در مثال بالا (member1-5) می‌توانند متغیر باشند یا متد. در زیر مثالی از یک ساختار آمده است :

   1: using System;
   2: 
   3: public struct Employee          
   4: {                               
   5:     public string name;         
   6:     public int age;             
   7:     public decimal salary;      
   8: }                               
   9: 
  10: public class Program
  11: {
  12:     public static void Main()
  13:     {
  14:         Employee employee1;
  15:         Employee employee2;
  16: 
  17:         employee1.name = "Jack";  
  18:         employee1.age = 21;       
  19:         employee1.salary = 1000;  
  20: 
  21:         employee2.name = "Mark";  
  22:         employee2.age = 23;       
  23:         employee2.salary = 800;   
  24: 
  25:         Console.WriteLine("Employee 1 Details");
  26:         Console.WriteLine("Name  : {0}",   employee1.name);
  27:         Console.WriteLine("Age   : {0}",   employee1.age);
  28:         Console.WriteLine("Salary: {0:C}", employee1.salary);
  29: 
  30:         Console.WriteLine(); //Seperator
  31: 
  32:         Console.WriteLine("Employee 2 Details");
  33:         Console.WriteLine("Name  : {0}",   employee2.name);
  34:         Console.WriteLine("Age   : {0}",   employee2.age);
  35:         Console.WriteLine("Salary: {0:C}", employee2.salary);
  36:     }
  37: }
Employee 1 Details
Name  : Jack
Age   : 21
Salary: $1000.00

Employee 2 Datails
Name  : Mike
Age   : 23
Salary: $800.00

برای درک بهتر، کد بالا را شرح می‌دهیم. در خطوط 8-3 یک ساختار تعریف شده است. به کلمه Public در هنگام تعریف توجه کنید. این کلمه کلیدی نشان می‌دهد که Employee در هر جای برنامه قابل دسترسی و استفاده باشد و حتی خارج از برنامه. Public یکی از سطوح دسترسی است که توضیحات بیشتر در مورد آن در درسهای آینده آمده است. قبل از نام ساختار از کلمه کلیدی struct استفاده می‌کنیم. نام ساختار نیز از روش نامگذاری پاسکال پیروی می‌کند. در داخل بدنه ساختار سه فیلد تعریف کرده‌ایم. این سه فیلد مشخصات Employee (کارمند) مان را نشان می‌دهند. مثلاً یک کارمند دارای نام، سن و حقوق ماهانه می‌باشد. همچنین هر سه فیلد به صورت Public تعریف شده‌اند بنابراین در خارج از ساختار نیز می‌توان آنها را فراخوانی کرد. در خطوط 14 و 15 دو نمونه از ساختار Employee تعریف شده است. تعریف یک نمونه از ساختارها بسیار شبیه به تعریف یک متغیر معمولی است. ابتدا نوع ساختار و سپس نام آن را مشخص می‌کنید. در خطوط 17 تا 23 به فیلدهای مربوط به هر Employee مقادیری اختصاص می‌دهید. برای دسترسی به فیلدها در خارج از ساختار باید آنها را به صورت Public تعریف کنید. ابتدا نام متغیر را تایپ کرده و سپس علامت دات (.) و در آخر نام فیلد را می‌نویسیم.
وقتی که از عملگر دات استفاده می‌کنیم این عملگر اجازه دسترسی به اعضای مخصوص آن ساختار یا کلاس را به شما می‌دهد. در خطوط 25 تا 35 نشان داده شده که شما چطور می‌توانید به مقادیر ذخیره شده در هر فیلد ساختار دسترسی یابید. ساختارها انواع مقداری هستند. این بدین معنی است که اگر مثلاً در مثال بالا Employee2 را برابر Employee1 قرار دهید، Employee2 همه مقادیر صفات Employee1 را به جای اینکه به آنها مراجعه کند، کپی برداری می‌کند. کلاس یک ساختار ساده است ولی از انواع مرجع به حساب می‌آید. در مورد کلاس در درسهای آینده توضیح خواهیم داد. می‌توان به ساختار، متد هم اضافه کرد. مثال زیر اصلاح شده مثال قبل است.

   1: using System;
   2: 
   3: public struct Employee
   4: {
   5:     public string name;
   6:     public int age;
   7:     public decimal salary;
   8: 
   9:     public void SayThanks()                         
  10:     {                                               
  11:         Console.WriteLine("{0} thanked you!", name);
  12:     }                                               
  13: }
  14: 
  15: public class Program
  16: {
  17:     public static void Main()
  18:     {
  19:         Employee employee1;
  20:         Employee employee2;
  21: 
  22:         employee1.name = "Jack";
  23:         employee1.age = 21;
  24:         employee1.salary = 1000;
  25: 
  26:         employee2.name = "Mark";
  27:         employee2.age = 23;
  28:         employee2.salary = 800;
  29: 
  30:         Console.WriteLine("Employee 1 Details");
  31:         Console.WriteLine("Name  : {0}",   employee1.name);
  32:         Console.WriteLine("Age   : {0}",   employee1.age);
  33:         Console.WriteLine("Salary: {0:C}", employee1.salary);
  34: 
  35:         employee1.SayThanks();
  36: 
  37:         Console.WriteLine(); //Seperator
  38: 
  39:         Console.WriteLine("Employee 2 Details");
  40:         Console.WriteLine("Name  : {0}",   employee2.name);
  41:         Console.WriteLine("Age   : {0}",   employee2.age);
  42:         Console.WriteLine("Salary: {0:C}", employee2.salary);
  43: 
  44:         employee2.SayThanks();
  45:     }
  46: }
Employee 1 Details
Name  : Jack
Age   : 21
Salary: $1000.00
Jack thanked you!

Employee 2 Details
Name  : Mike
Age   : 23
Salary: $800.00
Mike thanked you!

در خطوط 9 تا 12 یک متد در داخل ساختار تعریف شده است. این متد یک پیام را در صفحه نمایش نشان می‌دهد و مقدار فیلد name را گرفته و یک پیام منحصر به فرد برای هر نمونه نشان می‌دهد. برای فراخوانی متد، به جای اینکه بعد از علامت دات نام فیلد را بنویسیم، نام متد را نوشته و بعد از آن همانطور که در مثال بالا مشاهده می‌کنید (خطوط 35 و 44) پرانتزها را قرار می‌دهیم و در صورتی که متد به آرگومان هم نیاز داشت در داخل پرانتز آنها را می‌نویسیم.