کلاس ها و ساختارها (Struct) دو تا از زیربناهای اساسی سیستم نوع عمومی (common type system) در دات نت فریم وورک می باشند. هرکدام دراصل یک ساختار داده است که یک مجموعه از داده ها و رفتارهایی که باهم در ارتباط هستند را تحت یک واحد منطقی کپسوله (یعنی در یک واحد مشترک قرار دادن) قرار می دهد. داده ها و رفتارها ، در واقع "اعضای" کلاس و struct هستند و شامل متدها، پراپرتی ها، رویدادها و غیره می شوند؛ که هر یک از این موارد شرح داده خواهند شد.
اعلان یک کلاس یا ساختار مانند یک طرح اولیه (بلوپرینت) است که برای ساختن نمونه ها یا اشیاء در زمان اجرا بکار می رود. اگر شما یک کلاس یا ساختار به نام Person تعریف کنید، Person نام آن نوع است. چندین نمونه از Person را می توان تولید کرد، و هر نمونه می تواند مقادیر مختلفی در پراپرتی ها و فیلدهایش داشته باشد.
کلاس یک نوع مرجع است. وقتی یک شیئ از نوع کلاس ساخته می شود، متغیری که شیئ به آن انتساب داده شده است، تنها یک ارجاع به حافظه را در خود نگهداری می کند. وقتی که ارجاع شیئ به یک متغیر دیگر انتساب داده می شود، متغیر جدید به شیئ اصلی اشاره می کند. تغییراتی که در یک متغیر ایجاد می شود در متغیر دیگر هم منعکس می شود زیرا آنها هردو به داده هایی مشابه اشاره دارند.
struct یک نوع مقداری می باشد. وقتی یک struct ساخته می شود، متغیری که struct به آن انتساب داده شده است، مقادیر واقعی داده های ساختار را در خود نگهداری می کند. وقتی آن ساختار به متغیری جدید انتساب داده می شود، آن ساختار کپی برداری می شود. بنابراین متغیر جدید و متغیر اصلی دو کپی جداگانه از داده هایی مشابه هستند. تغییراتی که در یکی از کپی ها بوجود می آوریم بر روی بقیه تأثیری ندارد.
عموما" ، کلاس ها برای مدلسازی رفتارها و داده های پیچیده تری که قرار است بعد از ساخته شدن شیئی از آن کلاس، ویرایش شوند، مورد استفاده قرار می گیرند. struct ها مناسب ترین نوع برای ساختارهای داده ای کوچکی هستند که حاوی مقادیری اصولی بوده و قرار نیست بعد از اینکه struct ساخته شد تغییر کنند.
در مثال زیر، MyCustomClass با سه عضو در بالاترین سطح فضای نام ProgrammingGuide تعریف شده است. یک نمونه (شیئ) از MyCustomClass در متد Main موجود در کلاس Program ساخته شده، متدهای این شیئ و پراپرتی ها آن با استفاده از نقطه (.) قابل دسترسی اند.
کپسوله سازی
کپسوله سازی در برخی مواقع به عنوان اولین ستون قائده برنامه نویسی شیئ گرا مطرح می شود. بر اساس قائده کپسوله سازی، یک کلاس یا ساختار می تواند چگونگی قابل دسترس بودن هرکدام از اعضایش را از طریق کدهای بیرون کلاس یا ساختار را مشخص کند. متدها و متغیرهایی را که قصد نداریم از بیرون کلاس یا اسمبلی (اسمبلی یعنی:مجموعه ای از فضاهای نام که خود شامل کلاس ها هستند و در داخل یک یا چند فایل قرار داده شده اند) مورد استفاده قرار گیرند را می توان برای محدود شدن پتانسیل خطاهای کدنویسی یا سوء استفاده های مخرب ، مخفی کرد.
اعضا
همه متدها، فیلدها، ثابت ها، پراپرتی ها، و رویدادها باید در داخل یک نوع(مانند کلاس یا ساختار)، اعلان شوند؛ به اینها "اعضای" کلاس یا ساختار می گویند. در سی شارپ، متغیرها یا متدهای سراسری، (بصورتی که در برخی زبان های برنامه نویسی دیگر وجود دارد) موجود نیست. حتی نقطه ورودی (entry point) یک برنامه (متد Main) باید در داخل یک کلاس یا ساختار اعلان شود. لیست زیر حاوی همه انواع اعضایی است که ممکن است در یک کلاس یا ساختار اعلان شوند:
- فیلدها
- ثابت ها
- پراپرتی ها
- متدها
- سازنده ها
- مخرب ها
- رویدادها
- ایندکسر ها
- عملگرها
- زیر نوع ها (nested types)
دستیابی پذیری
برخی متدها و پراپرتی هایی را که قصد دارید از بیرون کد کلاس یا ساختارتان به آنها دسترسی داشته باشید یا آنها را فراخوانی کنید، کدهای بیرون کلاس یا ساختار به نام Client code شناخته می شوند. بقیه متدها و پراپرتی ها ممکن است فقط برای استفاده در خود کلاس یا ساختار باشند. محدود کردن دستیابی پذیری کدهای نوشته شده توسط شما بسیار مهم است درنتیجه فقط کلاینت کدهای مورد نظر شما می توانند به آنها دسترسی داشته باشند. شما نحوه دسترسی پذیری کلاینت کدها به نوع هایی که اعلان کرده اید و اعضای آن نوع ها را با استفاده از اصلاحگرهای دسترسی public، protected، internal، protected internal و private تعیین می کنید. دسترسی پذیری پیش فرض private است.
ارث بری
کلاس ها (نه ساختارها) از مفهوم ارث بری پشتیبانی می کنند. یک کلاس که از کلاسی دیگر (کلاس پایه) مشتق شده، بصورت اتوماتیک حاوی همه ی اعضای public ، protected و اعضای internal کلاس پایه (بجز سازنده ها و مخرب ها) می باشد.
کلاس ها ممکن است بصورت abstract اعلان شوند که این یعنی یکی (یا بیشتر) از متدها دارای پیاده سازی نمی باشد. همچنین کلاس های abstract را نمی توان بصورت مستقیم نمونه سازی کرد، اینگونه کلاس ها به عنوان کلاس پایه برای کلاس های دیگری که دارای پیاده سازی ناموجود هستند، مورد استفاده قرار می گیرند. کلاس ها همچنین می توانند بصورت saled اعلان شوند، در این صورت از ارث بری دیگر کلاس ها از این کلاس جلوگیری بعمل خواهد آمد.
رابط ها
کلاس ها و ساختارها می توانند از چندین رابط ارث بری کنند. ارث بری کردن از یک رابط به این معنی است که نوع موردنظر (نوعی عمل ارث بری را انجام می دهد)، همه ی متدهای تعریف شده در رابط را پیاده سازی می کند.
نوع های عمومی (Generic)
کلاس ها و ساختارها این قابلیت را دارند که به همراه یک یا چند پارامتر نوع اعلان شوند. کلاینت کد در زمانی که می خواهد یک نمونه از اینگونه نوع بسازد، پارامتر نوع را تعیین می کند. برای مثال کلاس <List<T در فضای نام System.Collections.Generic تعریف شده و دارای یک پارامتر نوع می باشد. کلاینت کد یک نمونه از<List<String یا <List<int برای تعیین نوعی که لیست می تواند نگهداری کند، می سازد.
نوع های تودرتو
یک کلاس یا ساختار می تواند بصورت تودرتو در داخل کلاس یا ساختاری دیگر اعلان شود.
نوع های ناتمام (partial)
شما می توانید قسمتی از کلاس، ساختار یا متد را در یک فایل کد و قسمتی دیگر را در فایل کد جداگانه ای تعریف کنید.
مقداردهی اولیه کننده های اشیاء
شما می توانید اشیاء یا کلکسیونی از اشیاء مربوط به کلاس ها و ساختارها را بدون فراخوانی -تابع- سازنده آنها، نمونه سازی و مقداردهی اولیه کنید.
نوع های بی نام
در موقعیت هایی که ساختن یک کلاس نام دار لازم نیست و یا اینکه کار ساده ای نیست، برای مثال وقتی که می خواهید لیستی را با ساختارهایی از داده پر کنید که قصد ندارید آن ساختار ها را به متدی دیگر ارسال کنید، از نوع های بی نام استفاده می کنید.
متدهای گسترش یافته (Extension Methods)
شما می توانید با ساختن یک نوع جداگانه که متدهای آن بتوانند در صورت مرتبط بودن با کلاس اصلی فراخوانی شوند، یک کلاس را بدون ساختن یک کلاس مشتق شده "گسترش" دهید.
متغیرهای محلی نوعدار ضمنی
شما می توانید در داخل یک متد از کلاس یا ساختار، از نوع دهی ضمنی استفاده کنید. با این کار به کمپایلر دستور می دهید که نوع صحیح را در زمان کامپایل تعیین کند.