سلام .برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط Arshan935 برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
خاری برار؟ برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید اولا ، لازم نیست عکسِ کد را بذاری . خود کد رو بذار دیگه . این جوری که راحت تره . دوما دیگه نداره برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
1) اگه منظورت اینه که وقتی Method6 را اجرا میکنیم (کد در خط اول) ، کدوم خط ، آخر اجرا میشه ، جواب ، Method6 هست (در واقع بلاک ای که Method6 تمام میشه ، هست) . اگه منظورت این باشه وقتی متد IntoMethod اجرا میشه ، خط پایانش کجاست ، جواب ، همون بلاکِ پایانِ IntoMethod یا در واقع ، خطِ بعد از MessageBox) هست .
در خط اول ، یعنی اونجایی که Method6 را فراخونی میکنی ، یه break point بذار و وقتی کد ، در اون خط متوقف شد ، دکمه ی F11 را بزن (تا داخل متد ای که فراخونی شد بره) و به این ترتیب ، میتونی ترتیبِ اجرایِ کدها را ببینی .
2) فرقی نداره .
دقت کن که یک متد را در داخلِ متد یا رویدادِ دیگه ای تعریف کردن ، اصلا اصولی نیست . (من فقط خواستم بگم که سی شارپ ، همچین قابلیتی هم داره وگرنه این کار اصولی نیست و در حد اطلاعات عمومی خواستم که کاربر بدونه . بنابراین استفاده از همچین متدی رو اصلا توصیه نمیکنم . توی فیلم هم فکر کنم گفتم) .
اینکه گفتم اصولی نیست ، منظورم ، فراخونیِ یک متد ، از داخلِ متدِ دیگه نیست ها . منظورم ، تعریفِ یک متد ، در داخلِ متد دیگه هست .
3) منظورت نوعِ خروجیِ متد هست که استراکچر باشه؟
اولا ، استاد (علی) تصحیح کردن که مدیریت کننده ی حافظه در سی شاپ و کلا دات نت ، GC هست و بنابراین اینکه چه چیزی ، در چه نوع حافظه ای قرار میگیره را خود GC فقط مدیریت میکنه (هر چند ، من توی منابع خارجی ، دیدم که این دو حافظه را توی سی شارپ هم جدا کردن ولی بصورت خیلی واضح ، منظور استاد را متوجه نشدم). بنابراین ، بهتره دیگه بجای حافظه ی استک و هیپ ، کلا از اصطلاح "حافظه" استفاده کنیم .
قضیه ی دوما ، باشه . چون میخواستم بگم که GC ، اتوماتیک ، هر وقت خواست ، میتونه حافظه را جابجا کنه (حتی بین رم و پیج فایل) و ... که زیاد ربطی به سئوالت نداره و ممکنه گمراه کننده باشه برات .
برگردیم به جوابِ اصلی سئوالِ 3 ات . اگه منظورت نوعِ خروجیِ متد هست که استراکچر باشه ، وقتی که یه شیِ استراکچر برگردونده میشه مثل کد زیر :
اولا اینکه استراکچر global که از نوع int هست و میدونی که 32 بیت (4 بایت) ، حافظه اشغال میکنه .کد:int global = 5; int ReturnStruct() { return global; } private void Button1_Click(object sender, EventArgs e) { int number = ReturnStruct(); }
دوما وقتی که کد ، در رویداد Button1_Click ، اجرا میشه (یا به عبارت دیگه ، کد return global در متد ReturnStruct اجرا میشه) ، چون مقدار استراکچر را return کرد و برگردوند ، هر چقدر که متغییری را که از نوع استراکچر بود ، حافظه اشغال کرده بود (یعنی متغییر global که 32 بیت هست) ، به همون اندازه از حافظه (یعنی 32 بیت) در حافظه ی جدیدی براش فضا اشغال میکنه . در واقع ، حافظه کپی میشه و 2 تا میشه . بنابراین در کد بالا ، یه حافظه ی 32 بیت برای متغییر سراسریِ global و یه حافظه ی 32 بیتِ دیگه هم برای متغییر محلیِ number داریم .
بدنه هم ربطی به نوع بازگشتی نداره . وقتی هر بار که متدی را فراخونی میکنیم (حتی اگه از درون همون متد ، همون متد را مجددا فراخونی کنیم) ، یه حافظه ی جدیدی براش در نظر گرفته میشه که با تمام شدنِ بلاکِ متد ، از بین میره
Bookmarks