تفاوت ساختار و کلاس

تفاوت بین ساختار و کلاس چیست؟

اجازه دهید تفاوت این دو را با یک مثال توضیح دهیم :

   1: using System;
   2: 
   3: struct MyStructure
   4: {
   5:     public string Message { get; set; }
   6: }
   7: 
   8: class MyClass
   9: {
  10:     public string Message { get; set; }
  11: }
  12: 
  13: class Program
  14: {
  15:     static void Main()
  16:     {
  17:         MyStructure structure1 = new MyStructure();
  18:         MyStructure structure2 = new MyStructure();
  19: 
  20:         structure1.Message = "ABC";
  21:         structure2 = structure1;
  22: 
  23:         Console.WriteLine("Showing that structure1 " +
  24:             "was copied to structure2.");
  25:         Console.WriteLine("structure2.Message = {0}", structure2.Message);
  26: 
  27:         Console.WriteLine("nModifying the value of structure2.Message...");
  28:         structure2.Message = "123";
  29: 
  30:         Console.WriteLine("nShowing that structure1 was not affected " +
  31:             "by the modification of structure2");
  32:         Console.WriteLine("structure1.Message = {0}", structure1.Message);
  33: 
  34: 
  35:         MyClass class1 = new MyClass();
  36:         MyClass class2 = new MyClass();
  37: 
  38:         class1.Message = "ABC";
  39:         class2 = class1;
  40: 
  41:         Console.WriteLine("nnShowing that class1 " +
  42:             "was copied to class2.");
  43:         Console.WriteLine("class2.Message = {0}", class2.Message);
  44: 
  45:         Console.WriteLine("nModifying the value of class2.Message...");
  46:         class2.Message = "123";
  47: 
  48:         Console.WriteLine("nShowing that class1 was also affected " +
  49:             "by the modification of class2");
  50:         Console.WriteLine("class1.Message = {0}", class1.Message);
  51:     }
  52: }
Showing that structure1 was copied to structure2.
structure2.Message = ABC

Modifying the value of structure2.Message...

Showing that structure1 was not affected by the modification of structure2
structure1.Message = ABC

Showing that class1 was copied to class2.
class2.Message = ABC

Modifying the value of class2.Message...

Showing that class1 was also affected by the modification of class2
class1.Message = 123

در بالا یک ساختار و یک کلاس ایجاد کرده‌ایم و تفاوت بین استفاده از این دو را نشان داده‌ایم. یک خاصیت به نام Message برای هر دو قرار داده‌ایم. سپس دو نمونه از هر کدام ایجاد کرده‌ایم (خطوط 18-17 و 36-35). مقداری به خاصیت Message از نمونه اول ایجاد شده از ساختار (structure1) اختصاص می‌دهیم. سپس مقدار structure1 را برابر structure2 قرار می‌دهیم، با این کار همه چیزهای داخل structure1 در structure2 کپی می‌شود.

برای ثابت کردن اینکه همه محتویات structure1 کپی شده است، مقدار خاصیت Message ،structure2 را نشان می‌دهیم و مشاهده می‌کنیم که همان مقدار خاصیت Message ،structure1 می‌باشد. برای اثبات اینکه ساختارها انواع مقداری هستند یک پیغام دیگر را به خاصیت Message ،structure2 اختصاص می‌دهیم. خاصیت Message ،structure1 تحت تأثیر قرار نمی‌گیرد چون structure2 یک کپی از structure1 می‌باشد.

حال اثبات می‌کنیم که چرا کلاس‌ها انواع مرجع هستند. کلاس‌ها وقتی با یک متغیر برابر قرار داده می‌شوند آدرس خود را ارسال می‌کنند نه مقدارشان را. بنابراین وقتی یک خاصیت از شیء، که دارای آدرس شیء اصلی است را ویرایش می‌کنید، خاصیت شیء اصلی نیز تغییر می‌کند. وقتی یک شیء را به عنوان آرگومان به متد ارسال می‌کنید، فقط آدرس شیء ارسال می‌شود. هر تغییری که در شیء داخل متد به وجود بیاید، بر شیء اصلی که آدرس آن به متد ارسال شده است نیز تأثیر می‌گذارد.