سه شنبه ۲۷ شهريور ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

آموزش سی شارپ - ساختارها

در C#، یک ساختار (structure) یک نوع داده‌ای مقداری (value type) است که به شما کمک می‌کند یک متغیر واحد را دارای داده‌های مرتبط از انواع داده‌های مختلف کنید. کلمه کلیدی struct برای ایجاد یک ساختار استفاده می‌شود.

ساختارها برای نمایش یک رکورد استفاده می‌شوند. فرض کنید می‌خواهید کتاب‌های خود را در کتابخانه پیگیری کنید. شما ممکن است بخواهید ویژگی‌های زیر را در مورد هر کتاب پیگیری کنید:

  • عنوان (Title)
  • نویسنده (Author)
  • موضوع (Subject)
  • شناسه کتاب (Book ID)

تعریف یک ساختار

برای تعریف یک ساختار، شما باید از دستور struct استفاده کنید. دستور struct یک نوع داده جدید با بیش از یک عضو برای برنامه شما تعریف می‌کند.

به عنوان مثال، اینجا نحوه تعریف ساختار کتاب (Book) را می‌توانید ببینید:

struct Books {
   public string title;
   public string author;
   public string subject;
   public int book_id;
};  

برنامه زیر نحوه استفاده از ساختار (structure) را نشان می‌دهد:

using System;

struct Books {
   public string title;
   public string author;
   public string subject;
   public int book_id;
};  

public class testStructure {
   public static void Main(string[] args) {
      Books Book1;   /* Declare Book1 of type Book */
      Books Book2;   /* Declare Book2 of type Book */

      /* book 1 specification */
      Book1.title = "C Programming";
      Book1.author = "Smith"; 
      Book1.subject = "C Programming Tutorial";
      Book1.book_id = 6495407;

      /* book 2 specification */
      Book2.title = "Telecom Billing";
      Book2.author = "Sara";
      Book2.subject =  "Telecom Billing Tutorial";
      Book2.book_id = 6495700;

      /* print Book1 info */
      Console.WriteLine( "Book 1 title : {0}", Book1.title);
      Console.WriteLine("Book 1 author : {0}", Book1.author);
      Console.WriteLine("Book 1 subject : {0}", Book1.subject);
      Console.WriteLine("Book 1 book_id :{0}", Book1.book_id);

      /* print Book2 info */
      Console.WriteLine("Book 2 title : {0}", Book2.title);
      Console.WriteLine("Book 2 author : {0}", Book2.author);
      Console.WriteLine("Book 2 subject : {0}", Book2.subject);
      Console.WriteLine("Book 2 book_id : {0}", Book2.book_id);       

      Console.ReadKey();
   }
}

وقتی کد فوق کامپایل و اجرا شود، نتیجه زیر تولید می‌شود:

Book 1 title : C Programming
Book 1 author : Smith
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Sara
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

ویژگی‌های ساختارهای C#

شما قبلا از یک ساختار ساده با نام کتاب‌ها (Books) استفاده کرده‌اید. ساختارهای C# کاملا متفاوت از ساختارهای سنتی C یا C++ هستند. ساختارهای C# دارای ویژگی‌های زیر هستند:

  • ساختارها (Structures) می‌توانند دارای متدها (methods)، فیلدها (fields)، شاخص‌گذارها (indexers)، خواص (properties)، متدهای عملگری (operator methods) و رویدادها (events) باشند.

  • ساختارها می‌توانند سازنده‌های تعریف شده (defined constructors) داشته باشند، اما دیستراکتور (destructors) ندارند. با این حال، شما نمی‌توانید یک سازنده پیش‌فرض برای یک ساختار تعریف کنید. سازنده پیش‌فرض به طور خودکار تعریف می‌شود و قابل تغییر نیست.

  • برخلاف کلاس‌ها، ساختارها نمی‌توانند از ساختارهای یا کلاس‌های دیگر ارث ببرند.

  • ساختارها نمی‌توانند به عنوان پایه‌ای برای ساختارها یا کلاس‌ها دیگر استفاده شوند.

  • یک ساختار می‌تواند یک یا چند رابط (interface) را پیاده‌سازی کند.

  • اعضای ساختار نمی‌توانند به صورت abstract، virtual یا protected تعریف شوند.

  • وقتی یک شیء از نوع ساختار با استفاده از عملگر New ایجاد می‌شود، آن ایجاد می‌شود و سازنده مناسب فراخوانی می‌شود. برخلاف کلاس‌ها، ساختارها می‌توانند بدون استفاده از عملگر New نمونه‌سازی شوند.

  • اگر عملگر New استفاده نشود، فیلدها تخصیص نیافته می‌مانند و شیء قابل استفاده نیست تا زمانی که همه فیلدها مقداردهی شوند.

کلاس در مقابل ساختار (Class versus Structure)

کلاس‌ها و ساختارها تفاوت‌های پایه‌ای زیر را دارند:

  • کلاس‌ها از نوع مرجع (reference type) هستند و ساختارها از نوع مقدار (value type) هستند.
  • ساختارها از وراثت پشتیبانی نمی‌کنند.
  • ساختارها نمی‌توانند سازنده پیش فرض (default constructor) داشته باشند.

با توجه به بحث‌های گفته شده، بیایید مثال قبلی را بازنویسی کنیم:

using System;

struct Books {
   private string title;
   private string author;
   private string subject;
   private int book_id;
   
   public void getValues(string t, string a, string s, int id) {
      title = t;
      author = a;
      subject = s;
      book_id = id;
   }
   
   public void display() {
      Console.WriteLine("Title : {0}", title);
      Console.WriteLine("Author : {0}", author);
      Console.WriteLine("Subject : {0}", subject);
      Console.WriteLine("Book_id :{0}", book_id);
   }
};  

public class testStructure {

   public static void Main(string[] args) {
      Books Book1 = new Books();   /* Declare Book1 of type Book */
      Books Book2 = new Books();   /* Declare Book2 of type Book */

      /* book 1 specification */
      Book1.getValues("C Programming",
      "Smith", "C Programming Tutorial",6495407);

      /* book 2 specification */
      Book2.getValues("Telecom Billing",
      "Sara", "Telecom Billing Tutorial", 6495700);

      /* print Book1 info */
      Book1.display();

      /* print Book2 info */
      Book2.display(); 

      Console.ReadKey();
   }
}

وقتی کد فوق کامپایل و اجرا می‌شود، نتیجه زیر تولید می‌شود:

Title : C Programming
Author : Smith
Subject : C Programming Tutorial
Book_id : 6495407
Title : Telecom Billing
Author : Sara
Subject : Telecom Billing Tutorial
Book_id : 6495700