PDA

مشاهده نسخه کامل : تاپیک مرجع سوال های سی شارپ



Speed Racer
07-05-20, 10:13
Only the registered members can see the link



سلام به همه دوستان عزیز و علاقه‌مندان به زبان برنامه نویسی سی شارپ


از این به بعد تمامی سوالات مربوط به زبان برنامه نویسی سی شارپ را در این تاپیک مطرح کنید.


نکته: از بحث های خارج از موضوع تاپیک خودداری کنید چون در غیر این صورت پست های مورد نظر توسط مدیران حذف خواهند شد و با کاربر مربوطه طبق قوانین انجمن رفتار خواهد شد. همچنین در هنگام گفتگو و سوال و جواب حتما ادب و اخلاق را رعایت کنید.


پی‌نوشت: هماهنگ شده با مدیریت محترم انجمن آقا M A H R A D

Speed Racer
08-05-20, 23:08
سلام استاد سجاد

آقا یک رم چند تا استک می تونه داشته باشه . چون توی قسمت تابع بازگشتی گفتی اگه تابع MessageBox.Show بیاریم هر دفعه OK بزنیم یک استک جدید براش می سازه. ولی من قبلش فکر می کردم کلا یک استک در رم داریم که توی متد بازگشتی پر می شه ولی الان با توجه یه صحبت شما فهمیدم که یک استک نداریم. کلا می شه محاسبه کرد مثلا بر حسب ظرفیت، یک رم چند استک داره

SajjadKhati
09-05-20, 01:21
سلام استاد سجاد

آقا یک رم چند تا استک می تونه داشته باشه . چون توی قسمت تابع بازگشتی گفتی اگه تابع MessageBox.Show بیاریم هر دفعه OK بزنیم یک استک جدید براش می سازه. ولی من قبلش فکر می کردم کلا یک استک در رم داریم که توی متد بازگشتی پر می شه ولی الان با توجه یه صحبت شما فهمیدم که یک استک نداریم. کلا می شه محاسبه کرد مثلا بر حسب ظرفیت، یک رم چند استک داره

استاد چیه گلپسر! سجاد صدام کن
اون استک ای که در فیلم گفتم ، یه کم متفاوت هه . البته خیلی بی راه نیست ولی یه کم (نه خیلی) داستان اش متفاوت هه . اون موقع چون تجربه ی کافی نداشتم ، دقیق نمیدونستم .


ببین ، اول اینکه استک ، حافظه ی جداگانه ای نیست (که توی فیلم ، به عنوان یه حافظه با حجم کمتر کشیده بودم) .
استک ، یک حافظه ای هه که هر متد (یا عضو یا کلا هر چیزی که نیازمند حافظه باشه) که در یک برنامه فراخونی میشه ، براش در نظر گرفته میشه .
از اون طرف هم موقع خوندن اطلاعات ، از آخرین حافظه شروع به خوندن میکنه .
دقیقا مثل گذاشتن یه گلوله توی خشاب که موقع شلیک ، از آخرین گلوله ای که در خشاب گذاشته شد ، برای اولین گلوله ی شلیک شده مورد استفاده قرار میگیره .

در متد Button4_Click در کد زیر ، یک break point بذارید و کد را اجرا کنید :



private void Button4_Click(object sender, RoutedEventArgs e)
{
this.Test1();
}


private void Test1()
{
this.Test2();
int a = 1;
}


private void Test2()
{
this.Test3();
int a = 2;
}


private void Test3()
{
int a = 3;
}



رویداد مربوط به کلیک دکمه ی Button4_Click را اجرا کنید (اون دکمه ای که به این رویداد متصل کردید را کلیک کنید) (شکل زیر) :

Only the registered members can see the linkتاپیک-مرجع-سوال-های-سی-شارپ-1-jpg

همونطور که در بخش call stack میبینی (بخش پایین ، سمت راست) (دقت کن که این قسمت ، شامل 3 پنجره ی call stack و exception settings و immediate window هست که باید پنجره ی call stack را انتخاب کنی) ، حافظه ی استک مربوط به برنامه که تا به حال (در اون لحظه) برای برنامه ات اختصاص داده شده را لیست میکنه که برای کدوم متد هست .

اولی ، حافظه ی External Code هست که همیشه و در همه حال ثابت هست و حافظه ی استک ای هست که سیستم عامل ، فایل اجرایی برنامه ات را فراخونی کرد (در واقع همون متد Main در کلاس Program هست) .
دومی ، یعنی رویداد یا متد Button4_Click هست ، حافظه ی مربوط به این رویداد هه که اجرا شد (تا با اجرای کنترل در این رویداد ، کدهای درون این رویداد و متد را اجرا کنه) .

حالا دکمه ی F11 (را در ویژال استودیو) بزن تا کنترلر ، روی متد Test1 بره . در این لحظه ، میبینی که Test1 هم به لیست پنجره ی call stack هم اضافه میشه . به این معنا که برای این متد ، حافظه ی استک اختصاص داده شد (تا با اجرای کنترل در این متد ، کدهای درون این رویداد و متد را اجرا کنه) .

حالا باز هم دکمه ی F11 را بزن تا به کد this.Test2 (که در متد Test1 هست) برسی . در اینجا اگه F11 را مجددا بزنی ، ادامه ی کدهای درون متد Test1 را اجرا نمیکنه تا اینکه اول بره متد Test2 (ای که توسط کد this.Test2 فراخونی کردی) را اجرا کنه و بعد از تمام شدن کدهای درون متد Test2 ، تازه میاد ادامه ی کدهای متد Test1 را (که کد int a = 1 هست) اجرا میکنه .



توی هر متد هم که برسی ، اون متد ، به لیست پنجره ی Call Stack اضافه میشه .
بنابراین اگه تا متد Test3 را پیگیری کنی ، روند پنجره ی Call Stack ، به ترتیب از پایین به بالا ، میشه :

External Code>Button4_Click>Test1>Test2>Test3

و بعد از اینکه به کدهای درون متد Test3 رسیدی ،حالا مجددا همینطور F11 را بزنی ، از آخر به اول برمیگرده (همون قضیه ی خشاب اسلحه که گفتم) . یعنی بعد از اینکه کدهای متد Test3 را اجرا و تمام کرد (در این لحظه ، در پنجره ی Call Stack ، آخرین حافظه ی استک که مربوط به متد Test3 بود ، از حافظه ی استک که بهش اختصاص داده شده بود و همچنین از این پنجره ، حذف میشه)، به ادامه ی کدهای متد Test2 میاد تا ادامه ی کدهای این متد را اجرا کنه و این روند معکوس ، همینطور ادامه داره تا کدهای داخل رویداد Button4_Click تمام بشه .

در قسمت 25 ، این قضیه را توضیح دادم منتها یه اشتباه جزئی اش اینه که حافظه ی استک را جدای از بقیه ی حافظه ها رفتم اما از نظر واقعی ، این حافظه ، در بخش مجزایی وجود نداره .
حالا اینکه محاسباتی باشه یا نه را نمیدونم .
پر شدن حافظه ی استک و ارور stack overflow هم شاید به این دلیل نباشه که قطعا حافظه پر شده باشه .
کما اینکه در کد زیر که ارور stack overflow میده :



private void Button3_Click(object sender, RoutedEventArgs e)
{
this.StackMethod();
}


private void StackMethod()
{
this.StackMethod();
}


شما نمیبینین که رم تون پر شده باشه .
احتمال داره که سیستم عامل یا clr ، کدها را (متد StackMethod در کد بالا) را مثلا هزار بار یا چند هزار بار پی در پی اجرا کرده باشه (که دقیقا میتونید در همون پنجره ی Call Stack ببینید چند بار اجرا شده) و سنجیده باشه که این کد بی نهایت هست یا نه و بنابراین ارور stack overflow را داده باشه (دقیقا نیدونم ماجرای دقیقش چجوری هه) .

حالا منتظر جواب دوستان هم باشید .

Speed Racer
09-05-20, 22:44
آقا سجاد الان توی کد زیر متد بازگشتی کدومه؟ این بازگشت رو من متوجه نمیشم که کجاش بازگشت می کنه و کاربردش چیه


private void button1_Click(object sender, EventArgs e){
Method3(5);
}


void Method3(int par)
{
MessageBox.Show(par.ToString());
par++;
if (par > 10)
return;


Method3(par);
}

SajjadKhati
09-05-20, 23:53
آقا سجاد الان توی کد زیر متد بازگشتی کدومه؟ این بازگشت رو من متوجه نمیشم که کجاش بازگشت می کنه و کاربردش چیه


private void button1_Click(object sender, EventArgs e){
Method3(5);
}


void Method3(int par)
{
MessageBox.Show(par.ToString());
par++;
if (par > 10)
return;


Method3(par);
}


هر متدی که از توی خودش ، خودش را فراخونی کنه ، به متد بازگشتی معروف هه .
متد Method3 ، در داخل بدنه و در خط آخرش ، مجددا خودش را فراخونی کرد . پس این متد ، متد بازگشتی هست .

کاربرد متدهای بازگشتی ، معمولا در حل مسائلی که بصورت درخت هستند ، کاربرد داره . مثلا فرض کنید یه شی TreeView دارید :

Only the registered members can see the link


و میخواید اطلاعات همه ی بخش ها و گره هاش را بخونید و جستجو کنید . در صورتی که هر گره اش ، شامل زیر گره های متفاوتی هست (البته من هنوز چندان با شی درخت کار نکردم) .
به عبارتی ، در عملیاتی که نمیدونم تا کجا ادامه داره (اما شرط گذاشتن در درون بدنه ی این توابع ، مهمه که در فیلم هم اشاره شد وگرنه تابع ، بسیار زیاد اجرا میشه و ارور stack overflow میده) ، میشه از توابع بازگشتی استفاده کرد .


البته استفاده از توابع بازگشتی ، از لحاظ منابع سخت افزاری ، مناسب نیست و توصیه نمیشه . چون همونطور که اشاره شد ، هر بار تابعی که فراخونی میشه (چه یک تابع دیگه باشه یا اینکه از درون خود همون تابع بازگشتی، همون تابعِ خودش را مجددا فراخونی کنه) ، حافظه ی جدیدی براش در نظر گرفته میشه و همچنین سوئیچ بین تابع ها ، برای پردازنده ، میتونه سربار هم داشته باشه .
کلا تابع بازگشتی (مخصوصا اگه زیاد فراخونی بشه) ، منابع سخت افزاری از جمله رم و پردازنده را درگیر میکنه . بجای استفاده از تابع بازگشتی ، استفاده از حلقه ی while توصیه میشه (اگه امکانش باشه . البته در جاهایی ممکنه امکان استفاده از حلقه ی while بجای توابع بازگشتی ، نباشه) .

Speed Racer
10-05-20, 19:56
همچنین سوئیچ بین تابع ها ، برای پردازنده ، میتونه سربار هم داشته باشه .
آقا سجاد این سربار چیه و در چند جا مدام گفتی ولی مشخص نکردی سربار چیه. کلا سربار برای پردازنده به وجود میاد یا برای رم هم به وجود میاد.
آیا منظورت از سربار همون پر شدن stack و پیام stackoverflow هستش. چرا حافظه Heap هیچ وقت پر نمی شه که Exception بده.
فرض کن من 8 گیگ رم و یک پردازنده قوی 4 هسته ای دارم و برنامه ای که می نویسم روی سیستم خودم هیچ Exception نمیده اما چه تضمینی هست که روی یک سیستم با پردازنده دو هسته ای و 4 گیگ رم exception بده.
فقط توضیح بده چون مثالی اگه بزنی که من کدش رو نخونده باشم متوجه نمیشم مثل مثال قبل که this آورده بودی که تا الان توضیح ندادی.

SajjadKhati
11-05-20, 00:13
آقا سجاد این سربار چیه و در چند جا مدام گفتی ولی مشخص نکردی سربار چیه.


سلامی مجدد
سربار یا Overhead ، را این جور میشه گفت که عملیات های اضافی ای هست که پردازنده انجام میده (طبق دستوراتی که برنامه نویس بهش داد) و باعث میشه سرعت نهایی اجرای کد ، دیرتر پردازش بشه اما برنامه نویس میتونست اون عمل را با طرح الگوریتم متفاوت ، کاری کنه که Overhead در پردازنده را به حداقلِ میزانِ خودش برسونه و بنابراین سرعت پردازش cpu برای اون کدهای خودش را به بالاترین حد خودش برسونه .

---------------------------------------------------------------------------------------------

مثال اگه بخوام بزنم ، مثل این میمونه که وقتی توی یک نیسون ، 2000 کیلو (2 تُن) بارِ میوه میزنی و میخوای از تهران ببری بندر عباس ، اون نیسون همون اول که همه ی کارهاش رسیده نیست و آماده به دستت بدن و بگن فقط رانندگی کن .
اول باید نیسون را بگیری ببری میدون بار (مثلا 10 دقیقه تا اینجا وقتت را میگیره) و تازه صاحب حجره ی میدون بار بهت میگه صبر کن این دو نفری که داریم توی ماشین شون بار میزنیم را تکمیل کنیم (مثلا 20 دقیقه اینجا معطل میشی) و بعد نوبت ماشین تو میشه و کارگرها حدود 15 دقیقه طول میکشن تا ماشی ات را تکمیل کنن .
بعد هم 5 دقیقه طول میکشه تا حساب کتاب و فاکتور را با صاحب حجره طی کنی که تا اینجا ، 50 دقیقه از وقتت گذشت که در واقع کل این 50 دقیقه جزء وقت پِرتی ات محسوب میشه چون در عمل ، حتی یک قدم هم به هدفت (که ارسال محموله به سمت بندر عباس بود) ، نزدیک نشدی .
اما به این معنا نیست که نباید این کارها را انجام میدادی . اتفاقا این کارها باید انجام میگرفت وگرنه ماشین خالی رفتن به بندر عباس ، معنا نداشت .
حالا بعد از 50 دقیقه اتلاف وقت (اگه دست شویی و این جور چیزها را هم رفتی و اینها :Love-ssa~! (1):) ، تازه شروع به حرکت به سمت بندر عباس میکنی .
مثلا 20 ساعت توی راه (تهران تا بندر عباس) هستی . توی این 20 ساعت هم ، از این 20 ساعت ، حدود 2 ساعتش را باز بین راه برای نماز و غذا و استراحت و کارهای شخصی و ... تلف میکنی (نمیتونی این 2 ساعت اتلاف وقتت را نادیده بگیری چون باید برای زنده موندن و خسته نشدن و کاهش احتمال تصادف و هر علت دیگه ، این کارها را باید انجام بدی که منجر به اتلاف وقت میشه) .
بندر عباس که رسیدی ، باز 15 دقیقه کارگرهاش طول میکشه بار ماشین رو خالی کنن .
بنابراین از اول کار تا اینجا 3 ساعت و 5 دقیقه ، اتلاف وقت داشتی . اما حدود 18 ساعت کار مفید داشتی . بالاخره خروجی کلی کار مهم هه که کلا 21 ساعت و 5 دقیقه شد .

به این 3 ساعت و 5 دقیقه از زمانت که اولا پِرتی بود اما لازم بود برای رسیدن به مقصدت و نمیشد انجام شون ندی و دوما این زمان ، در طول پروسه ی کاری ات بود (یعنی 3 ساعت و 5 دقیقه ، یکجا و پی در پی نبودن) ، پردازنده هم دقیقا همین روال را داره که بهش سربار یا overhead میگن . همونطور که میبینی ، همه ی کارهای واقعی ، همینطورند . هیچ کاری بدون وقت پِرتی نیشه . فقط میشه مقدار این وقت پِرتی را کمتر کرد اما نمیشه صفر اش کرد . پردازنده هم همینطوره . هر کدی که پردازنده اجرا میکنه ، وقت پِرتی یا در واقع سربار براش داره . این سربار ، هیچ وقت صفر نمیشه اما میشه برنامه نویس جوری الگوریتم اش را طراحی کنه که سربار کدش به حداقل ترین میزان خودش برسه و به این ترتیب ، وقتی پردازنده ، کدهای برنامه ی اون برنامه نویس را اجرا میکنه ، در بالاترین حالت بازدهی و در کمترین حالت سرباری که ممکنه ، اجرا کنه و بنابراین سرعت اجرای پردازنده برای برنامه اش ، به بهینه ترین حالت ممکن برسه .


خوب ، اون تجارتی که به بندر عباس برده بودی ، برات هم از لحاظ زمانی سود داشت . چون 18 ساعت کار مفید در مقابل 3 ساعت و 5 دقیقه ، پِرتی داشتی و هم نمیدونم چقدر پولشو گرفتی :Love-ssa~! (1):
حالا چند تا حالت را فرض کن :
1) اون بازی که به بندر عباس برده بودی ، حالا خانواده ات را هم با خودت ببری . قطعا وقت پِرتی ات به 1.5 برابر حداقل افزایش پیدا میکنه (چون اونها هم کارهایی دارند تا انجام بدن و باید منتظر بمونی تا کارهاشون تمام بشه . چه قبل از مسافرت چه در حین مسافرت . مثل نقی شون که در بخش 2 ، داستان آهو و اینها پیش اومد :Love-ssa~! (1):) .
بنابراین تو با بردن خانواده ات ، برای صاحب کار ، همون مقدار 2 تِن بار را بردی اما در خروجی نهایی ، بجای اینکه در 21 ساعت و 5 دقیقه که قبلا طول کشیده بود ، بار را براش ببری ، در طول مثلا 22 ساعت و 30 دقیقه براش میبری .
پس در واقع زمان پرتی ات بیشتر شد که باعث شد در خروجی نهایی ، کارت را دیرتر انجام بدی .


2) حالا فرض کن یه باری به پستت بخوره که از نزدیکی برج میلاد تا نزدیکی میدان آزادی که 10 کیلومتر هست ، بخوای ببری .
اون قضیه ی 50 دقیقه (رفتن به میدونبار و بار زدن) از وقتت تلف میشه .
بعد ، مسافت 10 کیلومتر را (بدون ترافیک) ، ظرف 10 دقیقه میری .
و بعد 15 دقیقه باید صبر کنی تا در مقصد (حوالی میدان آزادی) ، بارت را خالی کنن .
عملا 1 ساعت و 5 دقیقه وقت پِرتی داشتی و فقط 10 دقیقه وقت مفید داشتی .

3) حالا فرض کن وقتی از نزدیکی برج میلاد تا نزدیکی میدان آزادی میخوای بری ، ترافیک سنگین هم باشه و عملا زمانی را که ظرف 10 دقیقه ای میرفتی را تبدیل به 1 ساعت کنه .
در این حالت ، با وقت های پرتی قبلی ، عملا 1 ساعت و 55 دقیقه ، وقت پرتی ات میشه .

------------------------------------------------------------------------------------------------------------------

سربار پردازنده هم ، دقیقا مثل مثال هایی که زده شد ، هست .
همونطور که گفته شد ، همونطور که در انجام کارهای واقعی ، هیچ وقت نمیشه زمان پِرتی را نادیده گرفت ، در پردازنده هم کدی بدون صرف زمان اضافه برای سربار نداریم . منتها مثل دنیای واقعی ، این سربارها ، بسته به کدها و الگوریتم های برنامه نویس ، میتونه خیلی کم یا خیلی زیاد باشه .
کد بهینه ، کدی هه که پردازنده براش کمترین سربار ممکن را صرف کنه .


حالا اگه بخوایم سربار پردازنده برای توابع بازگشتی ، شبیه مثال های گفته شده در نظر بگیریم ، سربار توابع بازگشتی ، بیشتر به حالت مثال سوم (یعنی مثال ترافیک) شبیه هست .
چون هر بار که متدی فراخونی میشه (چه خود همون تابع ، خودش را فراخونی کنه ، یا اینکه تابع دیگه ای را فراخونی کنه) ، باید ادامه ی اجرای متد فعلی را متوقف کنه و برای متد جدید ، حافظه ای (همون استک ای که در پست 3 توضیح داده شد) ، در نظر بگیره و نوشتن حافظه ی جدید و روند کارهاش ، زمانی را میطلبه .




کلا سربار برای پردازنده به وجود میاد یا برای رم هم به وجود میاد.


برای رم ، نمیدونم . گمان نکنم ، چندان معنایی داشته باشه . اما از دوستان بپرسید .
مثل این میمونه که بگم وقتی باری که قراره بزنی و ببره به بندر عباس ، اون بار تا زمانی که توی انبار اون حجره هست ، یا زمانی که اون کارگر داره بارت را از حجره ، وارد ماشین ات میکنه ، واسه ی کارگر یا اون انبار ، اتلاف وقت محسوب میشه؟

در صورتی که اون اتلاف وقت ، در نهایت به پای شما نوشته میشه (چون شما به کارگر دستور دادی که برات بار بزنن) و صاحب کار ، در نهایت ، شما را میشناسه .
کارگر ، طبق دستوری که شما دادی ، مجبور به اطاعت هست و قطعا هم باید زمانی را برای اجرای کار شما ، صرف کنه .
مثل همین ، سربار ، بیشتر برای پردازنده معنا داره و تاخیری هم اگه در رم و ... اتفاق بیافته ، به پای سربار پردازنده نوشته میشه . چون رم که از خودش عملیات خاصی را انجام نمیده تا پردازنده به رم دستور خوندن یا نوشتن ای نده .

حالا باز از بقیه ی دوستان سئوال کنید . دقیق نمیدونم .




آیا منظورت از سربار همون پر شدن stack و پیام stackoverflow هستش.
چرا حافظه Heap هیچ وقت پر نمی شه که Exception بده.


نه .
مثل این میمونه که بگی انبار اون حجره دار ، پر شد .
خوب پر بشه . به شما که دستوری برای اجرا نرسید (تا بار را به جایی ببری) .

درباره ی قضیه ی حافظه ی استک و هیپ و ارور stackoverflow ، از دوستان و اساتیدها سئوال کن . چون دقیقا از ریز جزئیاتش مطلع نیستم .



فرض کن من 8 گیگ رم و یک پردازنده قوی 4 هسته ای دارم و برنامه ای که می نویسم روی سیستم خودم هیچ Exception نمیده اما چه تضمینی هست که روی یک سیستم با پردازنده دو هسته ای و 4 گیگ رم exception بده.
فقط توضیح بده چون مثالی اگه بزنی که من کدش رو نخونده باشم متوجه نمیشم مثل مثال قبل که this آورده بودی که تا الان توضیح ندادی.


بستگی به طراحی برنامه و الگوریتم ات داره .
مثلا فرض کن توی یه متد ، دوباره دو تا متد را فراخونی میکنی . نیاز داری متد اولی را که فراخونی میکنی ، ظرف حداکثر 100 میلی ثانیه اجرا بشه تا متد دومی را که بعدش فراخونی میشه ، بتونه کارش را درست انجام بده .
به این معنا که اگه بعد از شروع به اجرای متد اول ، بیش از 100 میلی ثانیه که بگذره ، و حالا متد دوم بخواد اجرا بشه ، دیگه متد دوم ات خوب کار نمیکنه و ممکنه خطا بده .

اگه برنامه ات همچین طراحی ای داره (که خیلی کم پیش میاد حداقل در سطح کاربرای عادی ، همچین برنامه ای طراحی کنن) ، خوب سرعت فرکانس پردازنده برات مهمه و باید بسنجی که حداقل سرعت فرکانس پردازنده ای که قراره برنامه ات را اجرا کنه ، چقدر باید باشه و به کاربر اعلام کنی . مثل خیلی از نرم افزارها که فرضا اعلام میکنن که حداقل سرعت برای اجرای این نرم افزار باید توی پردازنده ی مثلا فرکانس 1.8ghz یا بالاتر باشه .

اما اگه همچین طراحی ای نداره (که خیلی از نرم افزارها هم این طور نیستن) ، سرعت اجرای پردازنده ، مهم نیست . چه سرعتش 5ghz باشه یا 0.8ghz ، فقط توی سرعت اجراشون فرق دارن .

--------------------------------------------

در اون مثال ، کلمه ی کلیدی this و private را بردار . هر چیز ناشناخته ای هم که میبینی را در نظر نگیر .
کلیات مثال را تا جایی که بلدی ، مثال زدم.

SajjadKhati
11-05-20, 10:01
سلامی مجدد
این را هم بگم که معمولا کدهایی که باعث سوئیچ کردن پردازنده بشن ، باعث ایجاد سربارِ بیشتر (و گاها بسیار بیشتر) نسبت به بقیه ی کدهای دیگه در پردازنده میشه . مخصوصا اگه کدهایی که پردازنده در هر سوئیچ بخواد اجرا کنه ، کم هم باشن .

سوئیچ کردن هم به این معناست که یه کدی باعث بشه که پردازنده ، اجرای اون کد را رها کنه و کد جدید دیگه ای که بهش سپرده میشه را بخواد اجرا کنه . سوئیچ کردن ، بیشتر برای نخ ها مفهوم داره ولی در توابع ها هم میتونه مفهوم داشته باشه . چون وقتی از درون تابعی ، هر تابع دیگه ای فراخونی میشه (چه میخواد همون تابع باشه که به عنوان متد بازگشتی محسوب میشه یا هر تابع دیگه ای) ، پردازنده باید ادامه ی اجرای کدهای تابع اولی که در حال اجرا بود را متوقف کنه و حافظه ی جدیدی (استک) برای تابعی که فراخونی قراره بشه در نظر بگیره و بره اون تابع را اجرا کنه .


در متدهای بازگشتی ، مخصوصا اگه بسیار زیاد فراخونی بشن و مخصوصا اگه کدهایی که قراره اجرا کنه ، در اون تابع بسیار کم باشه (مثل تابع StackMethod در پست 3 که کد داده شد) ، سربار زیادی برای پردازنده خواهد داشت .
اگه در این نوع متدها ، کدی باشه که باعث توقف اجرا بصورت موقت هم بشه (مثل Thread.Sleep که البته هنوز به این کد نرسیدی و توی فیلم هم گفته نشد) ، علاوه بر سوئیچ بین متدها ، سوئیچ اجباری و حتمی بین نخ ها هم خواهد بود که این سربار را به بیشترین میزان خودش میرسونه (مثل قضیه ی همون ترافیکی که قرار بود بار از حوالی برج میلاد تا حوالی میدان آزادی بره) .