مشخصات مقاله
-
4438
-
0.0
-
30602
-
0
-
0
کلاس و شی گرایی در سی شارپ (C# class, OOP)
اگه تازه وارد دنیای برنامهنویسی شیگرا شده باشی، خیلی زود با مفاهیمی مثل کلاس و شیء روبهرو میشی. کلاس یکی از مفاهیم پایهای و مهم در C# هست و بهت کمک میکنه ساختار و ویژگیهای اشیایی رو که توی برنامه بهشون نیاز داری مشخص کنی. به زبان ساده، میتونیم کلاس رو مثل یه الگو در نظر بگیریم که اشیا بر اساس اون ساخته میشن.
توی این مقاله قراره با مفهوم کلاس در C#، روش ایجاد و مدیریت کلاس، نحوه ساخت شیء، فیلدها، سطح دسترسی اعضای کلاس، نوعهای ناشناس، مدیریت حافظه و چند قابلیت کاربردی دیگه آشنا بشیم. اگه میخوای مفاهیم پایه برنامهنویسی با C# رو اصولی یاد بگیری، این مباحث بخش مهمی از مسیر آموزش C# رو تشکیل میدن.
تقریباً توی همه زبانهای برنامهنویسی شیگرا، قبل از اینکه بتونیم اشیا رو بسازیم، باید یه الگو برای ساخت اونها داشته باشیم. «کلاسها» همون الگوهایی هستن که برای ساخت اشیا استفاده میشن و در زبان C# هم دقیقاً همین کاربرد رو دارن. توی C# میتونیم چند متغیر رو کنار هم قرار بدیم و با استفاده از اونها یه شیء کامل و پیچیده بسازیم. هر زبان برنامهنویسی امکان استفاده از انواع مختلف متغیرها و همچنین توابعی رو که برنامهنویس تعریف میکنه در اختیارمون قرار میده. کلاس در واقع پایهای برای ساخت یک متغیر پیچیدهتره و میتونه شامل انواع متغیرهای پایه، توابع و حتی نمونههایی از کلاسهای دیگه باشه. برای ایجاد یک کلاس هم کافیه اول کلیدواژه class رو بنویسیم، بعد اسم کلاس رو قرار بدیم و در نهایت بدنه کلاس رو داخل بلوک {} تعریف کنیم.
برای تعریف متغیر میتونیم از کلیدواژه var یا یک نوع داده ساده و مشخص استفاده کنیم. مثلاً اگه بخوایم متغیری برای مشخص کردن تعداد اتاقخوابهای یک خونه داشته باشیم، میتونیم از نوع int استفاده کنیم.
همونطور که گفتیم، در C# میتونیم چند متغیر رو کنار هم قرار بدیم و یک شیء کامل و پیچیده بسازیم. در واقع کلاس خودش میتونه از مجموعهای از متغیرها تشکیل شده باشه و پایهای برای ایجاد متغیرهای پیچیدهتر فراهم کنه. برای ایجاد کلاس، اول کلیدواژه class رو مینویسیم، بعد نام کلاس رو قرار میدیم و بدنه اون رو داخل {} قرار میدیم.
نحوه وارد کردن کلاس
- Microsoft Visual Studio رو اجرا کنید.
- به main menu برید و برای ساخت یک app جدید، گزینههای File -> New Project رو انتخاب کنید.
- از فهرست میانی، روی گزینه Empty Project کلیک کنید.
- اسم پروژه رو به DepartmentStore1 تغییر بدید.
- حالا روی OK کلیک کنید.
نامگذاری کلاس
درست مثل متغیرها، هر کلاس هم باید یک نام داشته باشه. نامگذاری کلاس تقریباً همون قوانینی رو داره که برای نامگذاری متغیرها داریم. البته میتونید برای پروژه خودتون قواعد مشخصی هم در نظر بگیرید. در این درسها، وقتی نام کلاس فقط از یک کلمه تشکیل شده باشه، حرف اول اون رو با حروف بزرگ مینویسیم؛ مثل Identification، Vehicle و Student. اگه نام کلاس از چند کلمه تشکیل شده باشه، حرف اول همه کلمات با حروف بزرگ نوشته میشه؛ برای مثال DrivingRecord، GeometricShape و SocialSecurityInformation.
مدیریت کلاسها
Microsoft Visual Studio ابزارها و امکانات مختلفی برای مدیریت کلاسها در اختیار برنامهنویس قرار میده. این امکانات باعث میشن کارهایی مثل نامگذاری یا تغییر نام کلاسها راحتتر و سریعتر انجام بشه.
پنجره Class View
یکی از راههای مناسب برای مدیریت کلاسها، استفاده از پنجره Class View هست. اگه این پنجره از قبل باز نیست، از main menu گزینه View -> Class View رو انتخاب کنید. اگه پنجره از قبل باز باشه، فقط کافیه روی tab مربوط به اون کلیک کنید. پنجره Class View از شش بخش جداگانه تشکیل شده. همونطور که در تصویر زیر میبینید، ظاهر و نوار عنوان اون شباهت زیادی به Solution Explorer داره.
بخش دوم نوار عنوان، نوار ابزار یا همون toolbar هست.
همونطور که از اسمش مشخصه، گزینه New Folder به شما اجازه میده یک فولدر جدید بسازید و به پروژه اضافه کنید. دکمههای Back و Forward هم برای جابهجا شدن بین کلاسها استفاده میشن. درست زیر toolbar، یک نوار دیگه قرار داره که شامل یک combo box و یک دکمه هست و از طریق اونها میتونید جستجو کنید. بدنه اصلی پنجره Class View هم از دو بخش اصلی تشکیل شده. اولین گره در قسمت بالایی، نام پروژه رو نمایش میده. زیر گره پروژه، اسم کلاسها قرار میگیره و قسمت پایینی پنجره هم اعضای کلاس انتخابشده رو نشون میده.
ایجاد کلاس
برای ساختن یک کلاس راههای مختلفی وجود داره. اگه با برنامههای ویرایش متن مثل Notepad کار میکنید، میتونید یک فایل جدید بسازید، کلیدواژه class رو بنویسید، بعد نام کلاس موردنظر رو قرار بدید و بدنه کلاس رو داخل علامتهای {} بنویسید.
مثال:
حالا فایل رو با پسوند .cs ذخیره کنید. لازم نیست اسم فایل حتماً با اسم کلاس یکی باشه. فقط باید فایل رو در همون پوشهای ذخیره کنید که فایلهای دیگه پروژه قرار دارن. کلاس داخل یک code file ایجاد میشه؛ بنابراین حتی میتونید اون رو در اولین فایل پروژه خودتون ذخیره کنید.
Microsoft Visual C# 2010 Express یا Microsoft Visual Studio کار ایجاد کلاس رو خیلی راحتتر میکنه. در درس 1 دیدیم که چطور میشه یک code file ایجاد کرد. بعد از ساخت code file، فقط کافیه کد مربوط به کلاس رو داخل اون وارد کنید. بعد از انتخاب گزینه Add New Item از Solution Explorer یا main menu، میتونید نوع فایل موردنظر، از جمله فایل کلاس، رو انتخاب کنید. برای ایجاد یک کلاس جدید، از main menu روی Project -> Add Class... کلیک کنید. یک راه دیگه اینه که در پنجره Add New Item از مسیر Project -> Add New Item گزینه class رو انتخاب کنید. در Solution Explorer هم میتونید روی نام پروژه راستکلیک کنید، نشانگر موس رو روی Add ببرید و بعد class رو انتخاب کنید. در پنجره Class View هم همین کار رو میتونید انجام بدید؛ روی نام پروژه راستکلیک کنید، نشانگر موس رو روی Add ببرید و گزینه class رو انتخاب کنید. بعد از انجام این کارها، پنجره Add New Item باز میشه و گزینه class در اون انتخاب شده. اگه Add New Item رو از main menu یا Solution Explorer باز کرده باشید، فقط کافیه روی class کلیک کنید. بعد میتونید نام پیشفرض رو در کادر Name تغییر بدید یا همون نام رو نگه دارید. در نهایت، فایل جدیدی با نام انتخابی شما و پسوند .cs به پروژه اضافه میشه. علاوه بر این، برای ایجاد کلاس میتونید از skeleton code هم استفاده کنید. در Code Editor روی جایی که میخواید کلاس جدید قرار بگیره راستکلیک کنید، Insert Snippet رو انتخاب کنید، بعد روی Visual C# دوبار کلیک کنید و از فهرست نمایشدادهشده روی class دوبار کلیک کنید.
اگه کد رو از قبل نوشته باشید و حالا بخواید اون رو داخل یک کلاس قرار بدید، کافی هست کد موردنظر رو انتخاب کنید، روی اون راستکلیک کنید و گزینه Surround With رو بزنید.
در این حالت، یک کلاس با نام پیشفرض MyClass ساخته میشه.
مبانی کلاسها (قسمت دوم) - وارد کردن کلاس
- به main menu برید و روی Project -> Add New Item... کلیک کنید.
- در فهرست میانی Add New Item، روی Code File کلیک کنید.
- اسم فایل رو به StoreItem تغییر بدید.
- روی Add کلیک کنید.
- داخل فایل زیر، این عبارت رو تایپ کنید.
- در main menu، گزینههای View -> Solution Explorer رو انتخاب کنید.
- برای ایجاد یک code file دیگه، در Solution Explorer روی DepartmentStore1 راستکلیک کنید، نشانگر موس رو روی Add ببرید و گزینه New Item... رو انتخاب کنید.
- در فهرست میانی پنجره Add New Item، روی Code File کلیک کنید.
- اسم موردنظر رو به DepartmentStore تغییر بدید.
- روی Add کلیک کنید.
- داخل فایل خالی، عبارات زیر رو تایپ کنید.
نحوه دستیابی به کلاس
همونطور که گفتیم، میتونید هر تعداد کلاس که برای پروژه نیاز دارید ایجاد کنید. همچنین میتونید هر کلاس رو در فایل مخصوص خودش نگه دارید یا همه کلاسها رو داخل یک فایل قرار بدید. برای دسترسی به کلاسها هم چند روش مختلف وجود داره:
- در بخشی که tabهای Code Editor قرار دارن، روی tab مربوط به فایل کلاس موردنظر کلیک کنید. بعد به combo box سمت چپ Code Editor برید و کلاس موردنظر رو انتخاب کنید.
- در Solution Explorer، زیر نام پروژه روی فایل حاوی کلاس دوبار کلیک کنید. اگه فایل شامل چند کلاس باشه، میتونید از combo box سمت چپ Code Editor کلاس موردنظر رو انتخاب کنید.
- در پنجره Class View، زیر نام پروژه روی نام کلاس دوبار کلیک کنید.
- در combo box پنجره Class View، روی کلاس موردنظر راستکلیک کنید و گزینه Go To Definition رو انتخاب کنید.
تغییر نام کلاس
اگه از اسم یک کلاس راضی نیستید، میتونید اون رو تغییر بدید. سادهترین راه اینه که اسم کلاس رو در Code Editor یا برنامهای مثل Notepad پیدا کنید و مستقیماً ویرایشش کنید. البته در این روش باید همه جاهایی که نام کلاس استفاده شده رو هم پیدا کنید؛ کاری که هم وقتگیر هست و هم احتمال خطا رو بیشتر میکنه. Microsoft Visual C# 2010 Express و Microsoft Visual Studio راهکار بهتری برای این کار در اختیارتون قرار میدن. برای تغییر نام کلاس در Microsoft Visual Studio یا Microsoft Visual C# میتونید از روشهای زیر استفاده کنید.
- در Code Editor روی نام کلاس راستکلیک کنید، نشانگر موس رو روی Refactor ببرید و بعد گزینه Rename... رو انتخاب کنید.
- در پنجره Class View روی نام کلاس راستکلیک کنید و Rename... رو انتخاب کنید.
- در Class View کلاس موردنظر رو انتخاب کنید، بعد به main menu برید و گزینههای Refactor -> Rename... رو انتخاب کنید.
با انجام هرکدوم از روشهای بالا، پنجره Rename باز میشه. در کادر New Name میتونید نام جدید کلاس رو وارد کنید. برای اینکه مشخص کنید Code Editor نام کلاس رو داخل commentها یا stringها هم تغییر بده یا نه، میتونید از checkboxها استفاده کنید. بعد از کلیک روی OK، پنجره Preview Changes – Rename نمایش داده میشه. در این پنجره همه بخشهایی که نام موردنظر در اونها استفاده شده فهرست میشن و با کلیک روی Apply میتونید تغییرات رو اعمال کنید.
ابزار جانبی زبان سی شارپ - کد ناامن
یکی از دلایلی که زبان C# طراحی شد، این بود که تا حد ممکن از بعضی محدودیتها و مشکلات زبانهای C/C++ دور بشه. استفاده از اشارهگر (pointer) یکی از همین موارد هست. زبانهای C و C++ از اشارهگرها برای ارجاع به محل قرارگیری یک مقدار در حافظه استفاده میکنن. در مقابل، C# تا جای ممکن از استفاده مستقیم از اشارهگرها دوری میکنه و مدیریت حافظه رو خودش بر عهده میگیره؛ یعنی بخش زیادی از این مسئولیت از دوش برنامهنویس برداشته میشه. البته اگه واقعاً نیاز داشته باشید، در C# امکان استفاده از اشارهگر هم وجود داره. از اونجا که compiler زبان C# مدیریت حافظه و مقادیر ذخیرهشده در اون رو انجام میده، استفاده از اشارهگر معمولاً توصیه نمیشه. با این حال، اگه بخواید در برنامه کاربردی خودتون از pointer استفاده کنید، باید قبل از نام متدهایی که از کد ناامن استفاده میکنن، کلیدواژه unsafe رو قرار بدید. به مثال زیر توجه کنید.
قبل از اینکه برنامه رو compile کنید، هنگام استفاده از ابزار مترجم C# باید مشخص کنید که برنامه شامل unsafe code یا کد ناامن هست. برای این کار از modifier مربوط به /unsafe استفاده میشه.
مثال:
برای فعال کردن این قابلیت در Microsoft Visual Studio، main menu رو باز کنید و روی Project -> Project Properties... کلیک کنید. بعد در قسمت Build، گزینه Allow Unsafe Code رو فعال کنید.
جداسازی نواحی کد به کمک Region Delimiters
Microsoft Visual Studio امکانات مختلفی برای نوشتن و مدیریت بهتر کد در اختیار برنامهنویس قرار میده. این امکانات شامل رنگی کردن کلمات، توگذاری خودکار (intuitive indentation)، IntelliSense، مشخص کردن محدوده کدها و موارد دیگه میشن.
همونطور که در تصویر میبینید، کنار بعضی از خطوط برنامه و در سمت چپ، دکمههایی قرار دارن. با استفاده از این دکمهها میتونید بخشهایی از کد رو که فعلاً بهشون نیاز ندارید جمع یا مخفی کنید. برای این کار روی دکمه (-) کلیک کنید تا علامت اون به (+) تغییر کنه.
دکمه (+) هم به شما اجازه میده بخش مخفیشده کد رو دوباره باز کنید. این قابلیت یکی از امکانات Code Editor در Microsoft Visual Studio هست و در خیلی از محیطهای برنامهنویسی دیگه هم کاربرد داره. Code Editor برای ایجاد این بخشها از قوانین مشخصی پیروی میکنه. علاوه بر بخشهایی که به صورت پیشفرض در کد وجود دارن، خودتون هم میتونید sectionهای دلخواه ایجاد کنید. برای این کار، اگه با برنامههای ویرایش متن مثل WordPad یا Code Editor برنامه Microsoft Visual C# 2010 Express کار میکنید، فایل موردنظر رو با عبارت زیر شروع کنید.
بعد از اون، برای پایان دادن به این بخش، از عبارت زیر استفاده کنید.
اگه با Microsoft Visual C# 2010 Express یا Microsoft Visual Studio کار میکنید و میخواید یک section خالی ایجاد کنید، روی خطی که میخواید section از اونجا شروع بشه راستکلیک کنید و Insert Snippet... رو انتخاب کنید. بعد روی Visual C# دوبار کلیک کنید.
مبانی کلاسها (قسمت سوم)
اگه میخواید بخشی ایجاد کنید که داخلش کد قرار داشته باشه، کافیه کد موردنظر رو در Code Editor انتخاب کنید. بعد روی بخش انتخابشده راستکلیک کنید و گزینه Insert Snippet رو بزنید.
روی صفحه Visual C# دوبار کلیک کنید. در فهرستی که نمایش داده میشه، روی گزینه #region کلیک کنید. با این کار یک ناحیه با نام پیشفرض ایجاد میشه.
هر زمان و هر جایی که بخواید یک ناحیه جدید بسازید، به عبارت #region نیاز دارید. میتونید در سمت راست این عبارت هر متنی که دوست دارید بنویسید. برای پایان دادن به ناحیه هم از عبارت #endregion استفاده کنید و اگه خواستید میتونید در سمت راست اون هم متنی قرار بدید. به مثال زیر توجه کنید.
لازم نیست حتماً در سمت راست #endregion چیزی بنویسید. بعد از ایجاد ناحیه، Code Editor یک دکمه (-) در سمت چپ #region نمایش میده و خطی ایجاد میشه که تا سمت چپ عبارت #endregion ادامه پیدا میکنه.
با استفاده از این دکمه میتونید هر زمان که خواستید بخش موردنظر رو باز یا بسته کنید.
همونطور که گفتیم، لازم نیست در سمت راست #endregion چیزی بنویسید و میتونید اون قسمت رو خالی بذارید. در مثال بالا، مستطیلی رو میبینید که با خطهای خاکستری، رشته رو احاطه کرده و بعد از #region قرار گرفته. این مستطیل رشتهای رو که بعد از #endregion میاد دربرنمیگیره. به عبارت دیگه، اگه در سمت راست #endregion چیزی نوشته نشه، بخش سمت راست خط #region هم نمایش داده نمیشه.
مبانی نحوه استفاده از کلاس - ایجاد (یک) شی
برای اینکه بتونید از یک کلاس در برنامه استفاده کنید، اول باید یک متغیر برای اون تعریف کنید. به فرایند تعریف متغیر برای یک کلاس، ایجاد شیء (creating an object) یا ایجاد نمونهای از کلاس (instance of class) گفته میشه.
برای تعریف متغیر یک کلاس میتونید از کلیدواژه var استفاده کنید و بعد اسم متغیر رو بنویسید. مثلاً اگه بخوایم برای کلاس خانهای که در مثال اول درس داشتیم یک متغیر تعریف کنیم، میتونیم به شکل زیر عمل کنیم:
یا
متغیرهای از نوع مقدار (value types) و از نوع ارجاع (reference type)
در درسهای 3 و 4 با نحوه تعریف متغیرهای نوع عادی آشنا شدیم. همچنین گفتیم که بعد از مقداردهی اولیه این متغیرها، compiler مقدار اونها رو در بخشهایی از حافظه که از قبل برایشان در نظر گرفته شده ذخیره میکنه. نوع دادههایی (data type) که برای این متغیرها استفاده میشن، نوع مقدار (value type) نام دارن. برای ذخیره مقدار این متغیرها، compiler بخشی از حافظه رو به نام پشته (stack) در نظر میگیره. بخش دیگه حافظه که heap نام داره، برای ذخیرهسازی متغیرهای کلاسها استفاده میشه.
بعد از اینکه یک متغیر رو با استفاده از کلاس تعریف کردید، باید از compiler بخواید بخشی از حافظه heap رو به اون اختصاص بده. برای انجام این کار از عملگری به نام new استفاده میشه.
مثال:
به جای استفاده از کلیدواژه var میتونید متغیر رو با نام کلاس هم معرفی کنید. همونطور که در مورد نوع مقدار گفتیم، وقتی از var استفاده میکنید باید بلافاصله حافظه به متغیر اختصاص داده بشه. اما اگه نام کلاس رو برای تعریف متغیر به کار ببرید، میتونید متغیر رو در یک خط تعریف کنید و در یک خط دیگه با استفاده از عملگر new حافظه رو به اون اختصاص بدید.
مثال:
در برنامههای Visual Basic و C#، اگه یک کلاس رو در هرکدوم از فایلهای مربوط به یک پروژه واحد ایجاد کنید، اون کلاس برای فایلهای دیگه همون پروژه قابل دسترسی خواهد بود.
تعریف متغیر نوع کلاس
در بدنه Main، عبارات زیر رو تایپ کنید.
ایجاد شی تهی (Null Object)
برای استفاده از امکانات (behavior) و مقدارهایی که یک کلاس در اختیارمون قرار میده، باید یک متغیر تعریف کنیم. همچنین دیدیم که قبل از استفاده از کلاس، باید مقدارهای لازم برای فیلدهای اون رو مشخص کنیم. این کار به compiler اجازه میده حافظهای که به متغیر اختصاص داده شده رو با مقادیر دلخواه پر کنه. اما ممکنه همیشه موقع تعریف متغیر، مقدارهای لازم رو آماده نداشته باشیم.
متغیری که برای یک کلاس تعریف شده ولی هنوز مقدار لازم برای فیلد رو دریافت نکرده، شی تهی (null object) نامیده میشه. برای ایجاد چنین متغیری، اول نام کلاس و بعد نام متغیر رو مینویسیم و سپس مقدار null رو به اون اختصاص میدیم.
متغیری که برای یک کلاس تعریف شده ولی هنوز مقدار لازم برای فیلد رو دریافت نکرده، شی تهی (null object) نامیده میشه. برای این کار، ابتدا نام کلاس و بعد نام متغیر رو مینویسیم و کلیدواژه null رو به اون اختصاص میدیم.
قبلاً گفتیم برای تعریف متغیری با مقدار تهی (null) میشه علامت سؤال (?) رو به اون اضافه کرد. اما در مورد کلاس، نباید ? رو به نام کلاس اضافه کنید.
اگه یک متغیر کلاسی از قبل تعریف و مقداردهی اولیه شده باشه، ولی به هر دلیلی مقدارهای اون پاک بشن، این متغیر هم شی تهی (null object) محسوب میشه.
به اشتراکگذاری کلاس
برخلاف زبانهای C و C++ که از زبانهای پیشرو و والد C# به حساب میان، زبان C# طوری طراحی شده که بتونه در کنار زبانهای برنامهنویسی دیگه مثل C++/CLI، Visual Basic و F# هم کار کنه. یعنی میشه با استفاده از کد هرکدوم از این زبانها، کدهای یک برنامه کاربردی نوشتهشده با C# رو خوند. برای اینکه این اتفاق ممکن باشه، کلاس C# باید به عنوان یک شی عمومی (public object) تعریف بشه. اگه میخواید کدهای نوشتهشده با زبانهای بالا به کلاس شما دسترسی داشته باشن، هنگام ایجاد کلاس باید قبل از کلیدواژه class، کلیدواژه public رو قرار بدید.
مثال:
چگونگی اعمال به اشتراکگذاری یک کلاس
- main menu رو باز کنید و روی گزینه View -> Class View کلیک کنید.
- در پنجره Class View روی DepartmentStore1 دوبار کلیک کنید تا باز و بزرگ بشه.
- در قسمت بالایی بدنه اصلی پنجره Class View، روی StoreItem راستکلیک کنید و بعد گزینه Go To Definition رو انتخاب کنید.
- کلید Home رو بزنید، public رو تایپ کنید و بعد دکمه space رو فشار بدید. فایل به شکل زیر تغییر میکنه.
زبالهروبی (garbage collection)
وقتی متغیری رو با استفاده از کلیدواژه new تعریف میکنید، در واقع بخشی از حافظه heap رو به اون اختصاص میدید. وقتی دیگه به اون متغیر نیازی نداشته باشید، مثلاً زمانی که برنامه بسته میشه، متغیر از بین میره و حافظهای که به اون اختصاص داده شده باید دوباره در اختیار متغیرها یا برنامههای دیگه قرار بگیره. به این فرایند زبالهروبی یا garbage collection گفته میشه. در زبانهای برنامهنویسی C/C++ این موضوع یکی از چالشهای مهم برای برنامهنویس بود، چون برنامهنویس باید متغیرها یا اشارهگرها (pointer) رو به صورت دستی پاک میکرد و حافظه رو آزاد میساخت.
چهارچوب کاری .NET Framework این فرایند رو مدیریت میکنه و حافظه رو به صورت خودکار از متغیرهایی که دیگه استفاده نمیشن آزاد میکنه.
فیلدهای کلاس
بخشی که داخل علامتهای {} قرار میگیره، بدنه یک کلاس نام داره. اجزای مختلف کلاس هم داخل همین بدنه قرار میگیرن. این اجزا با عنوان متغیرهای عضو یا member variableهای یک کلاس شناخته میشن. در زبان C#، متغیری که داخل بدنه کلاس ایجاد میشه، فیلد نام داره. هر فیلد هم مثل متغیرهای معمولی با یک نام و نوع داده تعریف میشه.
برای مثال، در کد زیر ویژگیهای مختلف یک خانه به عنوان اعضای کلاس تعریف شدن و هرکدوم به شکل یک متغیر در نظر گرفته میشن.
اگه بخواید مشخص کنید که یک متغیر از نوع اولیه میتونه مقدار تهی (null value) داشته باشه، کافیه علامت سؤال رو به اون اضافه کنید.
بعد از اضافه کردن علامت سؤال، باید قوانین خاص مربوط به اون رو رعایت کنید. متغیرهایی که داخل بدنه یک کلاس تعریف میشن، متغیر عضو (member variable) نام دارن و هر متغیر عضو در نهایت یک فیلد محسوب میشه. فیلدهای یک کلاس میتونن از هر نوع دادهای که تا اینجا معرفی کردیم تشکیل شده باشن.
از این بخش به بعد، برای اشاره به فیلدی که متعلق به یک کلاس هست از ساختار زیر استفاده میکنیم.
به زبان ساده، FieldName فیلدی هست که عضو کلاس ClassName محسوب میشه.
سطح دسترسی اعضای کلاس (access modifiers of a class)
اعضایی که داخل یک کلاس تعریف میشن باید سطح دسترسی مشخصی داشته باشن. منظور از سطح دسترسی، محدودهای هست که در اون میتونیم به خود کلاس یا اعضای اون دسترسی پیدا کنیم. برای این کار، سطوح و حالتهای مختلفی وجود داره که در ادامه باهاشون آشنا میشیم.
اعضای خصوصی یک کلاس
بخشهای یک شیء رو میشه به دو گروه اصلی تقسیم کرد: بخشهایی که بهشون دسترسی داریم و بخشهایی که دسترسی به اونها امکانپذیر نیست. مثلاً ماشینی که کنار خیابون پارک شده رو میتونیم ببینیم و لمس کنیم، اما موتور اون برای ما قابل مشاهده و دسترسی مستقیم نیست. در یک کلاس هم به بخشهایی که از دید و دسترسی عمومی خارج هستن، private گفته میشه.
اعضای عمومی یک کلاس
بخشهایی از کلاس که برای دسترسی عمومی در نظر گرفته شدن، public هستن و بخشهایی که از دید و دسترسی عمومی پنهان میمونن، private محسوب میشن. در زبان C# بعضی از اعضای کلاس در اختیار کلاسهای دیگه قرار میگیرن و بعضی دیگه از دسترس اونها خارج هستن. برای محدود کردن دسترسی به یک بخش یا عضو کلاس و خصوصی نگه داشتن اون، از کلیدواژه private استفاده میکنیم. برای در دسترس قرار دادن بخشی از کلاس که قرار نیست خصوصی باشه هم میتونیم از کلیدواژه public استفاده کنیم. به public و private، سطح دسترسی (access level) هم گفته میشه. به صورت پیشفرض، متغیرهای عضوی که سطح دسترسی اونها رو مشخص نکرده باشید، private در نظر گرفته میشن و اعضای خارج از کلاس نمیتونن به اونها دسترسی داشته باشن. بنابراین اگه میخواید یک عضو از خارج کلاس قابل دسترسی باشه، باید اون رو با کلیدواژه public تعریف کنید. همچنین میتونید در یک کلاس، ترکیبی از اعضای خصوصی و عمومی داشته باشید و ترتیب خاصی برای قرار گرفتن اونها وجود نداره.
مثال:
فقط یادتون باشه اگه سطح دسترسی یک عضو کلاس رو مشخص نکنید، اون عضو به صورت خودکار خصوصی یا private در نظر گرفته میشه. برای اینکه احتمال بروز خطا کمتر بشه، بهتره سطح دسترسی اعضای کلاس رو به صورت مشخص تعیین کنید.
تعیین سطح دسترسی به اعضای کلاس
کلاس StoreItem رو به شکل زیر اصلاح کنید.
مبانی کلاسها (قسمت چهارم) - اعضای داخلی کلاس
دیدیم که کلیدواژه public به اشیای خود برنامه و برنامههای دیگه اجازه میده به عضو عمومی یک کلاس دسترسی داشته باشن، در حالی که با استفاده از کلیدواژه private فقط اعضای خود کلاس میتونن به اعضای خصوصی دسترسی داشته باشن. اگه بخواید عضوی ایجاد کنید که تنها برای اعضا و اشیای همون کلاس قابل دسترسی باشه، باید اون رو با کلیدواژه internal علامتگذاری کنید. تفاوت بین این کلیدواژهها در جدول زیر توضیح داده شده.
مقداردهی اولیه شی - عملگر نقطه (.)
برای اینکه بتونید از طریق یک کلاس دیگه به عضو یک کلاس دسترسی پیدا کنید، اول باید یک متغیر از اون کلاس تعریف کنید. بعد از اون، برای دسترسی به عضو موردنظر از عملگر "." استفاده میکنید. بعد از اینکه یک نمونه از کلاس ساختید، میتونید به اعضای اون دسترسی داشته باشید و مقدار دلخواهتون رو به اونها اختصاص بدید. به مثال زیر توجه کنید.
یادتونه که دادههای نوع اولیه (primitive types) میتونن علامت سؤال داشته باشن.
بعد از مقداردهی اولیه فیلد یک کلاس، میتونید با استفاده از عملگر "." به اون دسترسی پیدا کنید و مقدارش رو بخونید.
در نتیجه، خروجی زیر به دست میاد.
بهکاربردن فیلدهای یک کلاس
در بالاترین قسمت Code Editor روی DepartmentStore.cs کلیک کنید تا وارد فایل بشید. بعد فایل رو به شکل زیر اصلاح کنید.
حالا برنامه رو اجرا کنید. نتیجه زیر نمایش داده میشه.
در نهایت کادر پیام (message box) رو ببندید.
بهکاربردن نوع ناشناس
همونطور که قبلتر گفتیم، برای استفاده از یک کلاس معمولاً اول باید متغیری برای اون تعریف و بعد اون رو مقداردهی اولیه کنیم. با این حال، برای ساخت و مقداردهی اولیه یک شیء همیشه لازم نیست از یک کلاس استفاده کنیم. میتونیم متغیری شبیه نمونه یک کلاس تعریف کنیم و بعد اون رو به شکل دلخواه مقداردهی اولیه کنیم. به این نوع، anonymous type یا نوع ناشناس گفته میشه. برای استفاده از نوع ناشناس، کافیه متغیر موردنظر رو با کلیدواژه var تعریف کنیم و برای اختصاص حافظه از عملگر new استفاده کنیم. به جای نام کلاس، ابتدا علامتهای {} رو قرار میدیم و بعد new رو مینویسیم. داخل {} برای هرکدوم از اعضا یک نام انتخاب میکنیم؛ درست مثل زمانی که نام اعضای کلاس رو تعریف میکنیم. بعد هر عضو رو با value دلخواه مقداردهی اولیه میکنیم و در نهایت تعریف رو با ; به پایان میرسونیم.
مثال:
بعد از مقداردهی اولیه نوع ناشناس، میتونید با نوشتن نام متغیر، عملگر نقطه و نام عضو، به تکتک اعضای اون دسترسی داشته باشید.
مثال:
در نتیجه، خروجی زیر به دست میاد.
یادتون باشه اینکه تعریف رو در چند خط مینویسیم فقط برای خواناتر شدن کد هست و میتونید تمام جزئیات رو در یک خط هم قرار بدید.
مدیریت فیلدهای کلاس
برای اینکه کار با فیلدهای یک کلاس راحتتر باشه، Code Editor دو combo box در اختیارمون قرار میده.
combo box سمت چپ، کلاسهای موجود در فایل فعلی رو نمایش میده و combo box سمت راست، اعضای کلاسی رو که از combo box سمت چپ انتخاب کردید نشون میده.
نحوه دسترسی به فیلد
برای دسترسی به یک فیلد چند راه مختلف دارید. میتونید فایل حاوی کلاس رو باز کنید و فیلد رو مستقیماً در همون فایل ببینید. راه دیگه اینه که به main menu برید و گزینههای Edit -> Quick Find رو انتخاب کنید، بعد نام فیلد موردنظر رو وارد کنید و روی Find Next کلیک کنید. البته در این روش باید نام دقیق فیلد رو از قبل بدونید. یک روش دیگه اینه که در قسمت بالایی بدنه پنجره Class View روی نام کلاسی که فیلد داخل اون قرار داره کلیک کنید. فهرست اعضای کلاس در قسمت پایینی پنجره نمایش داده میشه و میتونید روی فیلد موردنظر دوبار کلیک کنید. همچنین میتونید در قسمت بالایی Class View روی نام کلاس کلیک کنید، بعد در قسمت پایینی روی فیلد راستکلیک کنید و گزینه Go To Definition رو انتخاب کنید.
تغییر نام فیلد
میتونید نام فیلد رو به هر نام دلخواهی تغییر بدید. برای این کار میتونید فیلد رو در فایل موردنظر پیدا کنید و با استفاده از ویرایش متن (text editing) نام اون رو تغییر بدید. همچنین بعد از باز کردن فایل حاوی کلاس، میتونید از main menu گزینه Edit -> Quick Replace رو انتخاب کنید، نام فیلد رو وارد کنید و بعد Find Next یا Replace رو بزنید. این روش برای پیدا کردن قسمتهایی که نام فیلد در اونها استفاده شده کاربردی هست. محیط برنامهنویسی Visual Studio هم ابزارهای مناسبی برای انجام این کار در اختیار شما قرار میده.
به منظور تغییر اسم در محیط Visual Studio
فایل حاوی کلاس رو باز کنید. بعد میتونید کلیدهای Ctrl + H رو بزنید یا از main menu گزینه Quick Replace رو انتخاب کنید. در قسمت Find What، نام فیلد رو وارد کنید و Replace All رو بزنید. یک راه دیگه اینه که فایل حاوی کلاس رو باز کنید و روی فیلد موردنظر کلیک کنید تا caret روی اون قرار بگیره. بعد Ctrl + H رو بزنید یا از main menu گزینه Quick Replace رو انتخاب کنید. در combo box مربوط به Find What، نام فیلد انتخابشده رو وارد کنید و روی Replace All کلیک کنید. روش دیگه اینه که در قسمت بالایی پنجره Class View روی نام کلاس کلیک کنید. در قسمت پایینی پنجره روی فیلد راستکلیک کنید و Rename رو انتخاب کنید. بعد در کادر New Name نام دلخواه فیلد رو وارد کنید. برای اینکه مشخص کنید نام فیلد داخل commentها و stringها هم تغییر کنه یا نه، میتونید از checkboxها استفاده کنید. بعد از انجام این مراحل روی OK کلیک کنید. در پنجره Preview Changes – Rename، فهرستی از بخشهایی که فیلد در اونها استفاده شده نمایش داده میشه. در نهایت گزینه Apply رو انتخاب کنید.
اگه با مفاهیم کلاس، شیء، فیلد و سطح دسترسی آشنا شدی و میخوای این مباحث رو در کنار سایر مفاهیم C# منسجمتر و اصولیتر یاد بگیری، میتونی مسیر یادگیریت رو با یک آموزش ساختاریافته ادامه بدی. دوره آموزش C# میتونه قدم بعدی مناسبی برای ادامه یادگیری برنامهنویسی با سیشارپ باشه.