PDA

مشاهده نسخه کامل : چند سوال درباره سی شارپ



Speed Racer
04-01-18, 18:52
سلام




1- int کلاسه، نوع داده ایه یا استراکته


2- استراکت چیه و چه تفاوتی با نوع داده ای یا کلاس داره (تفاوت این سه تا چیه)


3- آیا همه کدهای سی شارپ managed شده هستن. یک نمونه کد unmanaged مثال می زنید. چه مزایا و معایبی داره اگه کد managed شده باشه


4- یکی از کارهای CLR مدیریت خطاهای زمان اجراست اگه ما کدی بنویسیم که کامپایلر اعلام کنه هیچ خطایی نداره چه نیازی به CLR هست


5- وقتی یک پروژه کامپایل می شه کدوم قسمت ها به exe و کدوم قسمت ها به dll تبدیل میشن


6- می شه یک مثال از نرم افزاری بزنید که دو یا چند پروژه داشته باشه. چون به نظر من هر برنامه بیشتر از یک پروژه نباید داشته باشه چون تو همون یک پروژه می شه به تعداد دلخواه فرم ایجاد کرد. ممکنه دو یا چند پروژه شدن برنامه برای مدیریت بهتر برنامه باشه

SajjadKhati
04-01-18, 20:44
سلام آقا آرشان
من تا جایی که میدونم میگم ، حالا اساتیدها تکمیل و تصحیح کنن

1) int ، نوع داده ای هه .
کلا نوع ها ، در سی شارپ 2 جور هستن . یکی نوع داده ای (که به نوعی میشه گفت مهم ترین نوع و به اصطلاح نوع پایه ای رو تشکیل میدن) و یکی هم نوع های معمولی (نمیدونم به این نوع معمولی ، دقیقا چی میگن . شاید هم به اینم نوع داده ای بگن . دقیق نمیدونم) که خودمون یا هر کس دیگه یا مایکروسافت و ... میسازیم
نوع ها (چه نوع داده ای یا نوع معمولی) ، چندین حالت میتونن داشته باشن . یا از جنس کلاس یا استراکچر یا enum یا اینترفیس یا دلیگیت میتونن باشن (همه ی نوع ها ، در ویژال استودیو 2015 یا بالاتر ، به رنگ سبز _کم رنگ یا پر رنگ_ هستن ولی توی نسخه های قبل تر ، سیاه و سفیدن). معمولا نوع داده ای (پایه ای) ، اغلب شون (نه همه مثلا 90 درصد) ، از نوع استراکچرن و معمولا هم نوع های معمولی ، اغلب شون (نه همه مثلا 70 درصد) از نوع کلاس هستن
نوع داده ای ، در جدول زیر اومد و غیر از اینها ، بقیه از نوع معمولی هستن :

Data types in C# (Only the registered members can see the link)

کلا روی نوع داده ای اگه موس رو ببرین ، جنس شو (استراکچر یا کلاس یا 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 در سی شارپ) :



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 ها و ... کاربرد دارن

}


اما دقت کنید که در کد بالا (UnManaged) ، متغییر ها و اشیاء (حتی با بستن پروژه) ، دیگه از حافظه ی رم بصورت اتوماتیک آزاد نمیشن و آزادسازی شون بر عهده ی برنامه نویس هه (بجز اینکه سیستم ریست یا خاموش و روشن شه)

5) dll فرآیند جداگانه ای داره و exe هم جداگانه . کلا dll اگه باشه ، سر جای خودش میمونه . بقیه ی کدها به exe تبدیل میشن

6) داخل یک سولوشن ، میتونین 2 یا چند تا پروژه درست کنید

Speed Racer
04-01-18, 21:26
سپاسگزارم استاد عزیزم:11():