سلام آقا آرشان
من تا جایی که میدونم میگم ، حالا اساتیدها تکمیل و تصحیح کنن
1) int ، نوع داده ای هه .
کلا نوع ها ، در سی شارپ 2 جور هستن . یکی نوع داده ای (که به نوعی میشه گفت مهم ترین نوع و به اصطلاح نوع پایه ای رو تشکیل میدن) و یکی هم نوع های معمولی (نمیدونم به این نوع معمولی ، دقیقا چی میگن . شاید هم به اینم نوع داده ای بگن . دقیق نمیدونم) که خودمون یا هر کس دیگه یا مایکروسافت و ... میسازیم
نوع ها (چه نوع داده ای یا نوع معمولی) ، چندین حالت میتونن داشته باشن . یا از جنس کلاس یا استراکچر یا enum یا اینترفیس یا دلیگیت میتونن باشن (همه ی نوع ها ، در ویژال استودیو 2015 یا بالاتر ، به رنگ سبز _کم رنگ یا پر رنگ_ هستن ولی توی نسخه های قبل تر ، سیاه و سفیدن). معمولا نوع داده ای (پایه ای) ، اغلب شون (نه همه مثلا 90 درصد) ، از نوع استراکچرن و معمولا هم نوع های معمولی ، اغلب شون (نه همه مثلا 70 درصد) از نوع کلاس هستن
نوع داده ای ، در جدول زیر اومد و غیر از اینها ، بقیه از نوع معمولی هستن :
Data types in C#
کلا روی نوع داده ای اگه موس رو ببرین ، جنس شو (استراکچر یا کلاس یا enum و ...) را مینویسه
2) داستان داره ولی مهمترین تفاوت شون اینه که مقدار شی استراکچرها کپی میشه ولی مقدار شی کلاس ها ، اشاره گر به آدرس حافظه هست (کلا آموزش را پیگیری کنین ، این مباحث در دوره ی شی گرایی بصورت کامل بررسی شد . قسمت 27 و 28 درباره ی کلاس و قسمت 45 و 46 درباره ی استراکچر هست)
3 و 4) بصورت پیش فرض ، بله Managed هستن . نه تنها سی شارپ ، بلکه همه ی زبان های تحت تکنولوژی دات نت ، مثل VB.Net و C++ CLI و... ، Managed هستن
یکی از کارای CLR ، علاوه بر تبدیل کد زبان سی شارپ به زبان میانی مشترک (CIL) و بعد تبدیل به زبان ماشین (زبان پردازنده) ، وظیفه ی دیگه اش ، مدیریت منابع و همینطور منابع رم (در حافظه ی هیپ و استک) و آدرس دهی (برای اشیاء و متغییر هاشون) هست . یعنی کنرل حافظه ی رم ، دست CLR هست و برنامه نویس مجبور نیست هر بار خودش بگه فلان شی را آزاد کن یا نکن (مدیریت حافظه ی رم ، توسط بخشی از CLR بنام Garbage Collector یا به اختصار GC ، انجام میشه) . ولی توی تکنولوژی هایی که GC ندارن (مثل زبان ++C غیر دات نت) ، خود برنامه نویس باید پس از استفاده از اون شی ، عملیات آزادسازی اش رو انجام بده و چون احتمال اشتباه (وسط حواس پرتی و ...) هست ، پس احتمال باگ دار بودن یا رش کردن برنامه ها در کدهای UnManaged بیشتر میشه
تکنولوژی دات نت ، چون CLR داره و بخشی از CLR هم چون مدیریت رم (آدرس دهی حافظه و آزادسازی شو) خودش بصورت اتوماتیک مدیریت میکنه (و اجازه ی دخالت برنامه نویس توی این جور مدیریت حافظه رو بصورت پیش فرض رو نمیده) ، بخاطر همین به کدهایی که تحت زبان های دات نت نوشته میشه را Unmanaged Code میگن
روی پروژه تون (نه روی سولوشن) ، کلیک راست و گزینه ی properties رو بزنین و روی سربرگ Build ، تیک گزینه ی allow unsafe code را بزنین و کد زیر رو توی یک رویدادی پیست کنین (نمونه ای از کد UnManaged در سی شارپ) :
اما دقت کنید که در کد بالا (UnManaged) ، متغییر ها و اشیاء (حتی با بستن پروژه) ، دیگه از حافظه ی رم بصورت اتوماتیک آزاد نمیشن و آزادسازی شون بر عهده ی برنامه نویس هه (بجز اینکه سیستم ریست یا خاموش و روشن شه)کد:unsafe { int int1 = 100; int* pInt1; pInt1 = &int1; // یعنی آدرس خونه ی حافظه ی متغییر int1 رو بریز توی اشاره گر pInt1 . دقت کنید که اشارهگر ها قابلیت نمایش خودشون رو ندارن یعنی مثلا اگه آدرس خونه ی حافظه ی متغییر Int1 عدد 1043 باشه ، پس این عدد با اجرای خط مقابل ، در اشاره گر pInt1 ذخیره میشه اما تفاوت اش اینه که این اشاره گر رو نمیشه نمایش داد یعنی نمیشه بصورت رشته تبدیل و در متدهایی مثل MessageBox.Show و ... نمایش داد یا در عملیات ریاضی حساب کرد اونو . بلکه فقط میشه مثل اشاره گر بقیه ی کلاس ها ، ازش در کارهای اشاره گری استفاده کرد اما محتوای اشاره گر رو میشه خوند یا تغییر داد یا در عملیات ریاضی محاسبه کرد یعنی میشه *pInt1 رو در متد MessageBox.Show نمایش داد و ... چون به محتوای اشاره گر pInt1 ، اشاره میکنه نه به آدرس حافظه اش MessageBox.Show((*pInt1).ToString()); // علامت & در اشاره گرها یعنی Address یا آدرس خانه ی حافظه و علامت * یعنی محتوای خونه ی حافظه //pInt1 = 432; // همونطور که گفته شد ، اشاره گری از جنس یک نوع ، همون نوع نیست . یعنی اشاره گری از جنس مثلا عدد ، خود عدد نیست پس نمیشه مستقیم داخلش عدد ریخت و فقط در صورتی میشه این کار رو کرد که علامت * اول اشاره گر بیاد یعنی اشاره به محتواش کنه بجای اشاره به حافظه ی خونه اش پس خط روبهرو اشتباه ولی خط زیر درست هه *pInt1 = 432; // بنابراین ، با اجرای دستور مقابل ، محتوای اشاره گر pInt1 تغییر میکنه به مقدار 432 . چون این اشاره گر ، به آدرس متغییر int1 اشاره میکرد ، پس مقدار اون هم به همین مقدار 432 تغییر میکنه . مثل قضیه ی اشاره گر در کلاس ها MessageBox.Show(int1.ToString() + "\n\n" + (*pInt1).ToString()); // علامت & در اشاره گرها یعنی Address یا آدرس خانه ی حافظه و علامت * یعنی محتوای خونه ی حافظه int[] myIntArray = new int[] { 10, 20, 30, 40 }; int*[] ptrMyIntArray; //ptrMyIntArray = &myIntArray; // آدرس یا اشاره گر یه آرایه ی Managed و یا آدرس یا اشاره گر یک کلاس ، نمیتونه در حالت دستی ای که خودمون اشاره گر درست میکنیم ، توی اشاره گر دستی ما ریخته شه چون وگرنه garbag collector با اطلاعاتی که ما در رم مدیریت میکنیم توسط اشاره گر ها ، ادغام و قاتی میشن . در کل ، مدیریت رم انواع داده ها در Managed Type ها مثل کلاس ها و آرایه ها و ... رو نمیتونیم خودمون با اشاره گرهایی که تعریف میکنیم ، کنترل شو در دست بگیریم . اشاره گرهایی که تعریف میکنیم اغلب برای کدهای Unmanaged مثل api ها و ... کاربرد دارن }
5) dll فرآیند جداگانه ای داره و exe هم جداگانه . کلا dll اگه باشه ، سر جای خودش میمونه . بقیه ی کدها به exe تبدیل میشن
6) داخل یک سولوشن ، میتونین 2 یا چند تا پروژه درست کنید






پاسخ با نقل قول
Bookmarks