آموزش گام به گام #C (جلسه دوازدهم: ساختار یا structها)
1398/01/11 14:25 , میلاد صاحب نظر

آموزش گام به گام #C (جلسه دوازدهم: ساختار یا structها)

ساختار یا struct چیزی شبیه به کلاس است که خاصیت‌ها و تفاوت‌های آن با کلاس باعث شده تا در کدهای کتابخانه‌های NET Framework. از آن استفاده شود و شما به عنوان یک برنامه‌نویس باید با آنها آشنا باشید. با ما همراه باشید.

جلسه اول: آغاز کار با #C جلسه ششم: namespaceها جلسه یازدهم: اندیس گذار یا indexerها جلسه شانزدهم: استفاده از اتریبیوت‌ها جلسه بیست و یکم: متدهای بی‌نام یا anonymous
جلسه دوم: عملگرها، نوع‌ها و متغیرها جلسه هفتم: مقدمه‌ای بر کلاس‌های #C جلسه دوازدهم: ساختار یا structها جلسه هفدهم: enumها جلسه بیست و دوم: موضوعاتی در مورد نوع در #C
جلسه سوم: عبارات کنترلی - گزینشی جلسه هشتم: وراثت کلاس در #C جلسه سیزدهم: واسط یا interfaceها جلسه هجدهم: عملگرهای overloading جلسه بیست و سوم: کار با نوع‌های nullable
جلسه چهارم: عبارات کنترلی - حلقه‌ها جلسه نهم: چندریختی جلسه چهاردهم: مقدمه‌ای بر delegateها و رویدادها جلسه نوزدهم: کپسوله‌سازی  
جلسه پنجم: متدها جلسه دهم: ویژگی یا propertyها جلسه پانزدهم: مقدمه‌ای بر کنترل خطا یا exception جلسه بیستم: مقدمه‌ای بر generic collectionها  

در این جلسه به صحبت در مورد ساختار یا Structهای #C می‌پردازیم. اهداف ما در این جلسه عبارت‌اند از:

  • درک هدف ساختارها
  • پیاده‌سازی یک ساختار
  • استفاده از یک ساختار

ساختار یا Struct چیست؟

Struct یک نوع value یا مقداری است. برای کمک به درک بهتر struct، بهتر است آن را با کلاس‌ها (که در جلسه هفتم در مورد آن‌ها صحبت شد) مقایسه کنیم. اگرچه Struct یک نوع مقداری است، اما کلاس یک نوع رفرنسی یا ارجاعی است.

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

اگر شما یک Struct را کپی کنید، #C یک کپی جدید از شیء ایجاد می‌کند و کپی شیء را به یک نمونه (instance) مجزا از Struct اختصاص می‌دهد.

در حالی که، اگر شما یک کلاس را کپی کنید، #C یک کپی جدید از رفرنس یا آدرس به سمت شیء ایجاد کرده و کپی رفرنس را به یک نمونه کلاس جدید اختصاص می‌دهد. structها نمی‌توانند destructor داشته باشند، اما کلاس‌ها می‌توانند داشته باشند.

تفاوت دیگر بین یک struct و کلاس این است که، struct نمی‌تواند وراثت را پیاده‌سازی کند، اما کلاس می‌تواند (برای اطلاعات بیشتر به جلسه هشتم مراجعه کنید).

اگرچه یک struct نمی‌تواند وراثت را پیاده‌سازی کند، اما می‌تواند از واسط (interface) ارث‌بری کند (که در جلسه سیزدهم در این مورد صحبت خواهد شد).

در جلسه بیست و دوم بیشتر در مورد تفاوت‌های بین نوع‌های مقداری و رفرنسی صحبت خواهد شد، در آن جلسه کدهایی وجود دارند که مفاهیم بیان شده در اینجا را خیلی بهتر توضیح می‌دهند.

NET Framework. نوع‌های زیادی دارد که بسیاری از آن‌ها ساختار یا Struct هستند، بسیاری از این نوع‌ها از جمله نوع‌های پیش ساخته یا Built – in هستند.

برای مثال، System.Int32 یک int در #C، System.single یک float در #C و System.Bool یک Bool در #C هستند.

نوع‌های پیش ساخته #C نام‌های مستعار یا alias‌هایی برای نوع‌های NET Framework. هستند و برای شما syntax خاص زبان را فراهم می‌کنند.

اگر به سند هر کدام از این نوع‌های NET Framework. توجه کنید، مشاهده خواهید کرد که آن‌ها به عنوان Struct تعریف شده‌اند.

این بدان معنا است که شما وقتی یک نوع Struct را می‌بینید باید بتوانید آن را شناسایی کنید. در قسمت بعدی با نشان دادن نحوه ایجاد یک نوع Struct سفارشی مخصوص به خودتان، شناسایی Structها برای شما ساده‌تر خواهد شد.

ایجاد یک نوع Struct سفارشی

اگرچه رفتار نوع‌های کلاس و Struct بسیار متفاوت است، اما syntax آن‌ها مشابه است. در هر دو نوع، شما نوع و اعضای آن را تعریف می‌کنید. اصلی‌ترین تفاوت ظاهری این است که Struct از کلیدواژه Struct و کلاس از کلیدواژه Struct استفاده می‌کنند.

مثال لیست ۱-۱۲ چگونگی تعریف یک Struct سفارشی را نشان می‌دهد. در این مثال، Struct یک مستطیل (rectangle) با propertyهای width و height می‌باشد، درست همانند روشی که برای نشان دادن شکل یک مستطیل در یک صفحه استفاده می‌کنید.

لیست ۱-۱۲. تعریف یک Struct

همان‌طور که مشاهده می‌کنید، Rectangle Struct در لیست ۱-۱۲ شباهت خیلی زیادی به یک کلاس با دو property دارد، به استثنای اینکه Struct از کلیدواژه Struct استفاده کرده است( به جای کلیدواژه class) تا تعریف کند که Rectangle یک Struct است.

استفاده از یک Struct

برای استفاده از یک Struct، باید Struct را نمونه‌سازی کنید و درست همانند یک کلاس از آن استفاده کنید. لیست ۲-۱۲ چگونگی نمونه‌سازی Rectangle Struct و دسترسی به Property‌های آن را نشان می‌دهد.

لیست ۲-۱۲. استفاده از یک Struct

کد درون متد Main از لیست ۲-۱۲، یک Rectangle Struct جدید نمونه‌سازی می‌کند و Propertyهای Height  Width تنظیم و تعریف شده‌اند. تجربه کار با Struct دقیقا همانند استفاده از کلاس است. خروجی به این صورت است:

یک روش جایگزین برای نمونه‌سازی یک Struct و مشخص کردن propertyهای آن از طریق مقدار‌دهی اولیه شیء است که در کد زیر مشاهده می‌کنید:

توجه کنید که تابع مقداردهی اولیه شیء از آکولاد استفاده کرده است و Propertyها را از طریق یک لیست مجزا شده توسط ویرگول از جفت‌های نام / مقدار مشخص کرده است.

Overload کردن constructorهای Struct

دو مثال قبلی از نمونه‌سازی یک Struct (یک مثال فقط از طریق constructor  یک مثال از طریق تابع مقداردهی اولیه شیء) از constructor پیش‌فرض(بدون پارامتر) از struct استفاده کردند. Constructor پیش‌فرض به صورت ضمنی توسط #C تعریف شده است و شما نمی‌توانید خودتان Constructor پیش‌فرض را پیاده‌سازی کنید.

Constructor‌پیش‌فرض همه فیلد‌های struct را با مقادیر پیش‌فرض مقداردهی اولیه می‌کند. یعنی intها برابر با صفر، floatها برابر با 0.0 و boolean ها برابر با False. اگر به overloadهای سفارشی constructor نیاز داشتید، تا زمانی که یک یا تعداد بیشتری پارامتر داشته باشید، می‌توانید constructorهای جدید اضافه کنید.

لیست ۳-۱۲ نحوه سفارشی‌سازی Rectangle Struct از لیست ۱-۱۲ را نشان می‌دهد که شامل یک constructor overload می‌باشد.
لیست ۳-۱۲. Overload کردن یک struct constructor

بخش هایلایت و بولد شده از کد در لیست ۳-۱۲ یک constructor overload است. Constructorها دارای نام یکسان با Struct خود هستند (که در این مثال rectangle است).

این constructor overload از Rectangle دارای دو پارامتر است، که به حافظه‌های ذخیره شده (که توسط propertyها برای فراخوانی کد کپسوله شده‌اند) اختصاص داده شده‌اند.

لیست ۴-۱۲ مثالی از چگونگی استفاده از constructor overload موجود در لیست ۳-۱۲ برای نمونه‌سازی یک Rectangle جدید را نشان می‌دهد.

لیست ۴-۱۲: نمونه‌سازی یک struct از طریق یک Vonstructor overload

کد در متد Main از لیست ۴-۱۲ یک Rectangle Struct را نمونه‌سازی کرده و مقادیر مشخص شده از طریق constructor overload را نمایش می‌دهد. وقتی rect2 نمونه‌سازی می‌شود، کد مقادیر ۵ و ۷ را به عنوان آرگومان منقل می‌کند.

از constructor موجود در لیست ۳-۱۲، می‌توانید مشاهده کنید که width یا عرض در rect2 برابر با ۵ و height یا ارتفاع در Rect2 برابر با ۷ قرار می‌گیرد. خروجی لیست ۴-۱۲ به این شکل است:

افزودن متد به یک struct

همه مثال‌ها تا الان نشان داده‌اند که چگونه می‌توانید propertyها و constructorها را به یک struct اضافه کنید، اما شما همچنین می‌توانید متدها را نیز به یک struct اضافه کنید. تعریف یک متد در یک struct، مشابه تعریف یک متد در یک کلاس است. لیست ۵-۱۲ Rectangle struct را با یک متد به نام Add نشان می‌دهد.

لیست ۵-۱۲: افزودن یک متد به یک struct

کد هایلایت و بولد شده در لیست ۵-۱۲ یک متد به نام Add است. شاید اضافه کردن دو Rectangle Struct به صورت هم‌زمان منطقی باشد شاید هم نباشد، اما این مثال نشان می‌دهد که چگونه می‌توان یک متد در یک struct تعریف کرد.

در این مثال، متد Add مقادیر Height و Width از نمونه Rectangle فعلی را با افزودن Height و Width در پارامترهای rect افزایش خواهد داد. نتیجه متد یک Rectangle جدید با propertyهای اضافی است.

فراخوانی یک متد struct

می‌توانید متد Add را از لیست ۵-۱۲ از طریق نمونه‌ای از یک Rectangle Struct فراخوانی کنید. لیست ۶-۱۲ چگونگی نمونه‌سازی دو Rectangle Struct را نشان می‌دهد. این کد، متد Add را فراخوانی می‌کند و نتیجه فراخوانی متد Add را به یک Rectangle Struct دیگر اختصاص می‌دهد.

لیست ۶-۱۲: فراخوانی یک متد struct

در متد Main از لیست ۶-۱۲، کدها Rect1 و rect2 را نمونه‌سازی می‌کنند، که هر دو structهای Rectangle می‌باشند و مقادیر را به Propertyهای Height و Width اختصاص می‌دهد.

دیگر باید با مثال‌های نمونه‌سازی struct آشنا شده باشید، چون همه با هم یکسان هستند. چیزی که در لیست ۶-۱۲ مفید است آن کد‌های هایلایت و بولد شده‌ای هستند که چگونگی فراخوانی متد Add از Retangle Struct را نشان می‌دهند.

کد این لیست، متد Add از نمونه rect1 را فراخوانی کرده و rect2 را به عنوان Rectangle Struct انتقال می‌دهد تا به Rect1 اضافه شود. متد Add در لیست ۵-۱۲ نشان می‌دهد که وقتی این کد اجرا می‌شود، چه اتفاقاتی می‌افتد.

در لیست ۶-۱۲، مقدار بازگشتی از متد Add به Rect3 اختصاص یافته است، که یک مستطیل بزرگ است که هر کدام از اضلاع آن برابر با جمع ضلع‌های rect1 و rect2 است. خروجی به این صورت است:

خلاصه

در این جلسه struct را تعریف کردیم و چندین تفاوت بین کلاس و struct بیان کردیم. چگونگی ایجاد یک Struct را آموختید. یاد گرفتید که یک  struct را یا از طریق یک constructor‌ پیش‌فرض یا یک constructor overload‌ سفارشی که خودتان می‌نویسید، می‌توان نمونه‌سازی کرد.

همچنین مشاهده کردید که چگونه می‌توان propertyها و متدها را در structها پیاده‌سازی کرد.

منبع: C#-Station 

جلسه بعد                                                                جلسه قبل

 مطالب مرتبط

 مقدمه ای بر زبان برنامه نویسی #C و پلتفرم NET Framework.
7 دلیل منطقی برای آموختن #C
 طبقه بندی زبان های برنامه نویسی
به دست آوردن Exceptionها در #C و یافتن همه خطاها
 LINQ(زبان جستجوی یکپارچه)
برنامه نویسی شیءگرا چیست؟

از آخرین دوره های آموزشی و تخفیف ها مطلع شوید

با تکمیل فرم زیر ، از اخبار و اطلاعات به روز برنامه نویسی و تکنولوژی عقب نمانید

آخرین مطالب

آموزش جامع SQL Server (جلسه ۱۲)
آموزش جامع SQL Server (جلسه ۱۲)

دستور UPDATE در SQL Server برای تغییر داده‌های موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

آموزش جامع SQL Server (جلسه ۱۵)
آموزش جامع SQL Server (جلسه ۱۵)

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفاده‌ای ندارد را حذف کنید. برای ...

آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)
آموزش جامع SQL Server (جلسه ۳۵: Window Functionها – بخش ۲)

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...

آخرین دیدگاه ها

دیدگاه خود را درباره این پست بنویسید

فرم ارسال نظرات