Struct در سی شارپ

در این جلسه میخواهیم با Struct آشنا شویم و بفهمیم که تفاوت آن با Class چی هست و چطور ساختاری دارد، بنابراین در قالب یک مثال با Struct در سی شارپ آشنا می شویم.

Struct در سی شارپ یک جایگزین سبک حجم برای کلاس ها هستند. پس زمانی که می خواهیم نسخه های زیادی از یک داده را مقداردهی کنیم از Struct در سی شارپ استفاده می کنیم. تو این قسمت در مورد مفهوم Struct حرف بزنیم و این که Struct چه فرقی با Class دارد، برای ایجاد Struct ابتدا یک Class اضافه می کنیم

class ClassA

{

}

بعد از ایجاد کلاس نام کلیدی کلاس را پاک می کنیم و می توانیم نامی که برای کلاسمان در نظر گرفتیم هم پاک کنیم و نام دلخواه خودمان بگذاریم.

struct MyStruct

{

}

و مثل کلاس می توانیم فیلد و تابع داشته باشیم:

using System.Windows.Forms;

//—————————————–

struct MyStruct

{

public int id;
public void Show()
{

MessageBox.Show(id.ToString());

}

}

داخل پنجره فرم شده و از Struct نمونه می سازیم:

private void button1_Click(object sender, EventArgs e)

{

MyStruct S = new MyStruct();
S.id = 10;
S.Show();

}

سوال:اگر Struct تمام قابلیت های Class را دارد و هر دو مساوی هستند چرا هر دو را داخل زبان سی شارپ گذاشتند؟

این دو تا یک تفاوت هایی با هم دارند که الان با هم بررسی می کنیم:

  • در Struct لازم نیست برای ایجاد شی جدید از دستور new استفاده کنیم، می توانم مثل متغیر ساده int آن را تعریف کنم و بعد به آن مقدار بدهیم:

private void button1_Click(object sender, EventArgs e)

{

MyStruct S ;
S.id = 10;

}

  • فیلدها را در struct نمی توان مقدار دهی کرد. پس اینجا را خوب دقت کنید تا به id مقدار ندهیم ، فضایی داخل حافظه به آن اختصاص نمی دهد.

الان یک کلاس هم می نویسیم بالای Struct تا با هم مقایسه کنیم:

class MyClass

{

public int id;

}

struct MyStruct

{

public int id;

}

خوب دقت کنید class از نوع Reference Type است اما Struct  از نوع Value Type است .

یعنی اگر من دو تا کلاس داشته باشم داخل یکی از آنها تغییر اعمال کنم داخل آن یکی کلاس هم اعمال می شود. با یک مثال بیشتر متوجه می شویم:

داخل پنجره فرم شده تا با نوشتن یک کد تفاوت class و Struct در سی شارپ را بفهمیم:

private void button1_Click(object sender, EventArgs e)

{

MyClass C1=new MyClass () ;
C1.id = 10;
MyClass C2 = C1;
C2.id = 20;
MessageBox.Show(C1.id.ToString());

}

private void button2_Click(object sender, EventArgs e)

{

MyStruct C1 ;
C1 .id = 10;
MyStruct C2 = C1;
C2.id = 20;
MessageBox.Show(C1.id.ToString());

}

برنامه را اجرا می کنیم و روی button1 کلیک می کنیم انتظار می رود عدد 10 را نمایش دهد.

Struct در سی شارپ

امّا مشاهده می کنیم که عدد 20 را نمایش می دهد چون class رفرنسی است یعنی می رود به آدرسش نگاه می کند و چون خاصیت ارث بری هم دارد مقدار خودش را به آدرسش می دهد .

این بار برنامه را اجرا می کنیم و روی button2 کلیک می کنیم تا کد Struct اجرا شود:

 

Struct در سی شارپ

مشاهده می کنیدکه عدد 10 را نمایش می دهد چون Struct از نوع Value تایپ است یعنی در Struct هر کدام مقدار خودشان را نمایش می دهند.

تفاوت Struct و class

  1. در class به محض ساخته شدن شی فضایی به آن اختصاص داده می شود ولی در Struct حتی با وجود ساخته شدن شی فضایی به آن اختصاص داده نمی شود تا زمانی که مقداری داخل آن فیلد قرار گیرد.
  2. در Struct لازم نیست که برای شی از کلمه ی new استفاده شود.
  3. class رفرنس تایپ است اما Struct , value تایپ است در نتیجه چون کلاس از فیلد رفرنس استفاده می کند بنابراین حافظه بیشتری اشغال می کند. ولی Struct چون از فیلد رفرنس استفاده نمی کند حافظه کمتری اشغال می کند .
  4. کلاس می تواند وراثت داشته باشد امّا Struct نمی تواند وراثت داشته باشد .
  5. Struct نمی تواند تابع مخرب داشته باشد.

شباهت Struct و class

هر دو می توانند تابع سازنده داشته باشند.( البته خود Struct دارای تابع سازنده پیش فرض می باشد ولی اگر برای آن یک تابع سازنده تعریف کردیم باید تمام فیلدها را در آن مقداردهی اولیه کنیم. و تابع سازنده در Struct باید حداقل یک پارامتر داشته باشد.)

امیدواریم از این آموزش راضی بوده باشید . در جلسه بعد به مفاهیم ref و out همراه با مثال در سی شارپ می پردازیم.

اگر سوال یا انتقادی دارید زیر همین پست در قسمت دیدگاه ها ثبت کنید.