دستورات تکرار (Endless Loop) در سیشارپ
حلقه Endless Loop در سیشارپ برای اجرای مداوم دستورات به کار میرود و با شرط مانند while(true) ایجاد شده و با break متوقف کرد
25 شهریور 1405
لینک کوتاه
دستورات تکرار (Endless Loop) در سیشارپ؛ Endless Loop چیست؟
در برنامهنویسی، یکی از مفاهیم مهم و پرکاربرد، دستورات تکرار یا حلقهها (Loops) هستند.حلقهها به برنامهنویس اجازه میدهند یک یا چند دستور را چندین بار اجرا کند.
در زبان برنامهنویسی #C نیز ساختارهای مختلفی برای ایجاد حلقه وجود دارد که از مهمترین آنها میتوان به for، while، do...while و foreach اشاره کرد.
یکی از حالتهای خاص حلقهها، حلقه بینهایت (Endless Loop یا Infinite Loop) است.
همانطور که از نام آن مشخص است، حلقه بینهایت حلقهای است که شرط پایان آن هیچگاه برقرار نمیشود و در نتیجه دستورات داخل حلقه به صورت مداوم اجرا میشوند.
حلقه بینهایت همیشه به معنی اشتباه بودن برنامه نیست.
گاهی اوقات برنامهنویس عمداً از آن استفاده میکند؛ برای مثال در برنامههایی که باید دائماً منتظر دریافت درخواست یا یک رویداد باشند.
با این حال، اگر حلقه بینهایت به صورت ناخواسته ایجاد شود، میتواند باعث مصرف زیاد پردازنده، هنگ کردن برنامه یا عدم پاسخگویی آن شود.
آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
حلقه بینهایت با while در سی شارپ
یکی از سادهترین روشها برای ایجاد حلقه بینهایت در #C استفاده از while و قرار دادن مقدار true به عنوان شرط است.مثال:
while (true)
{
Console.WriteLine("این حلقه همیشه اجرا میشود.");
}
در این مثال، شرط while همیشه برابر true است؛ بنابراین برنامه هیچگاه به صورت طبیعی از حلقه خارج نمیشود.
در واقع، ساختار کلی آن به شکل زیر است:
while (true)
{
// دستورات تکرارشونده
}
تا زمانی که برنامه متوقف نشود یا مکانیزمی برای خروج از حلقه وجود نداشته باشد، دستورات داخل این حلقه اجرا خواهند شد.
حلقه بینهایت با for در سی شارپ
حلقه for نیز میتواند به شکل بینهایت اجرا شود.برای این کار میتوان بخش شرط حلقه را حذف کرد.
مثال:
for (;;)
{
Console.WriteLine("حلقه بینهایت");
}
ساختار معمول for شامل سه بخش است:
for (initialization; condition; iteration)
{
// دستورات
}
اما در مثال بالا هر سه بخش حذف شدهاند.
در #C چنین ساختاری یک حلقه بدون شرط پایان ایجاد میکند و در نتیجه اجرای آن ادامه پیدا میکند.
البته در عمل معمولاً استفاده از while (true) برای نمایش مفهوم حلقه بینهایت خواناتر است.
حلقه بینهایت با do...while در سی شارپ
ساختار do...while نیز میتواند یک حلقه بینهایت ایجاد کند:do
{
Console.WriteLine("در حال اجرا...");
}
while (true);
تفاوت مهم do...while با while این است که در do...while دستورات بدنه حداقل یک بار اجرا میشوند و سپس شرط بررسی میشود.
از آنجا که در این مثال شرط همیشه true است، حلقه پس از اولین اجرا نیز ادامه پیدا میکند.
خروج از حلقه بینهایت با break در سی شارپ
یکی از مهمترین ابزارها برای کنترل یک حلقه بینهایت، دستور break است.این دستور باعث میشود اجرای حلقه بلافاصله متوقف شود.
برای مثال:
int number = 0;
while (true)
{
number++;
Console.WriteLine(number);
if (number == 5)
{
break;
}
}
خروجی برنامه:
1
2
3
4
5
در این مثال، شرط while همیشه true است؛ اما زمانی که مقدار number به ۵ برسد، دستور break اجرا میشود و برنامه از حلقه خارج میشود.
این روش یکی از کاربردهای رایج حلقههای بینهایت است.
در واقع، برنامهنویس ممکن است عمداً حلقه را بدون شرط پایان تعریف کند و شرایط خروج را درون بدنه با استفاده از break مشخص کند.
کاربرد حلقه بینهایت در منوهای برنامه در سی شارپ
یکی از کاربردهای متداول Endless Loop در برنامههای کنسولی، ساخت منو است.برای مثال:
while (true)
{
Console.WriteLine("1. مشاهده اطلاعات");
Console.WriteLine("2. تنظیمات");
Console.WriteLine("3. خروج");
string choice = Console.ReadLine();
if (choice == "1")
{
Console.WriteLine("اطلاعات نمایش داده شد.");
}
else if (choice == "2")
{
Console.WriteLine("صفحه تنظیمات");
}
else if (choice == "3")
{
break;
}
}
در این برنامه، منو دائماً نمایش داده میشود و کاربر میتواند چندین عملیات انجام دهد.
تنها زمانی که کاربر گزینه 3 را انتخاب کند، دستور break اجرا شده و حلقه پایان مییابد.
این الگو در برنامههای تعاملی بسیار مفید است، زیرا برنامه تا زمانی که کاربر تصمیم به خروج نگرفته، به دریافت ورودی ادامه میدهد.
استفاده از حلقه بینهایت برای دریافت ورودی در سی شارپ
فرض کنید برنامهای داریم که باید تا زمان وارد شدن یک مقدار خاص، از کاربر اطلاعات دریافت کند:while (true)
{
Console.Write("یک عدد وارد کنید: ");
string input = Console.ReadLine();
if (input == "exit")
{
break;
}
Console.WriteLine("ورودی شما: " + input);
}
در این مثال، برنامه تا زمانی که کاربر عبارت exit را وارد نکند، به دریافت ورودی ادامه میدهد.
یکی از مزیتهای این روش این است که شرایط پایان حلقه در همان جایی قرار گرفته که منطق مربوط به آن بررسی میشود.
تفاوت حلقه بینهایت عمدی و ناخواسته در سی شارپ
باید میان دو نوع Endless Loop تفاوت قائل شویم.۱. حلقه بینهایت عمدی
در این حالت برنامهنویس میداند حلقه باید به صورت مداوم اجرا شود. برای مثال، یک برنامه سرویسدهنده ممکن است دائماً منتظر دریافت درخواست جدید باشد.نمونه:
while (true)
{
CheckForNewRequests();
}
در چنین برنامهای وجود حلقه دائمی ممکن است بخشی از طراحی سیستم باشد.
۲. حلقه بینهایت ناخواسته
گاهی برنامهنویس به دلیل یک اشتباه منطقی، شرط پایان حلقه را هیچگاه برقرار نمیکند.برای مثال:
int i = 0;
while (i < 10)
{
Console.WriteLine(i);
}
در اینجا مقدار i هیچگاه افزایش پیدا نمیکند.
بنابراین مقدار آن همیشه صفر باقی میماند و شرط i < 10 نیز همیشه درست خواهد بود.
برای اصلاح برنامه باید مقدار i را تغییر دهیم:
int i = 0;
while (i < 10)
{
Console.WriteLine(i);
i++;
}
این مثال نشان میدهد که بسیاری از حلقههای بینهایت ناخواسته به دلیل تغییر نکردن متغیر شرط ایجاد میشوند.
مشکلات حلقههای بینهایت
اگر یک حلقه بینهایت بدون کنترل مناسب ایجاد شود، میتواند مشکلات مختلفی ایجاد کند.یکی از مهمترین مشکلات، مصرف بالای CPU است.
اگر حلقه دائماً در حال اجرای دستورات سنگین باشد، پردازنده ممکن است مقدار زیادی از منابع سیستم را مصرف کند.
برای مثال:
while (true)
{
// عملیات سنگین
}
این نوع حلقه میتواند باعث افزایش مصرف پردازنده شود.
در برخی شرایط، بهتر است داخل حلقه از روشهایی مانند تأخیر یا عملیات غیرهمزمان استفاده شود تا برنامه بدون دلیل منابع سیستم را به طور مداوم مصرف نکند.
برای نمونه:
while (true)
{
Console.WriteLine("Checking...");
Thread.Sleep(1000);
}
در این مثال، برنامه پس از هر بار اجرای دستور، یک ثانیه صبر میکند.
استفاده از continue در حلقههای بینهایت
دستور continue نیز در حلقههای بینهایت قابل استفاده است.این دستور باعث میشود ادامه دستورات مربوط به تکرار فعلی اجرا نشود و برنامه به تکرار بعدی برود.
مثال:
int number = 0;
while (true)
{
number++;
if (number % 2 == 0)
{
continue;
}
Console.WriteLine(number);
if (number >= 10)
{
break;
}
}
در این مثال، اعداد زوج با continue نادیده گرفته میشوند و در نهایت با رسیدن مقدار number به ۱۰، حلقه توسط break پایان پیدا میکند.
حلقه بینهایت و برنامههای واقعی
در نرمافزارهای واقعی، حلقههای دائمی در برخی معماریها کاملاً طبیعی هستند.برای مثال، برنامههایی که دائماً در حال گوش دادن به درخواستها، دریافت پیامها یا بررسی وضعیت یک سیستم هستند، ممکن است یک حلقه طولانیمدت داشته باشند.
با این حال، در چنین برنامههایی معمولاً کنترل دقیق منابع، لغو عملیات و مدیریت استثنا اهمیت زیادی دارد.
در برنامههای مدرن #C، استفاده از الگوهای asynchronous و قابلیتهایی مانند CancellationToken میتواند برای کنترل بهتر عملیات طولانیمدت مفید باشد.
به عنوان نمونه، یک عملیات میتواند تا زمانی اجرا شود که یک درخواست لغو دریافت نکرده باشد:
while (!cancellationToken.IsCancellationRequested)
{
await DoSomethingAsync();
}
این روش نسبت به یک حلقه بینهایت بدون هیچ مکانیزم کنترلی، امکان مدیریت بهتر چرخه عمر عملیات را فراهم میکند.
نکات مهم هنگام استفاده از Endless Loop
هنگام استفاده از حلقههای بینهایت باید چند نکته را در نظر گرفت:- مشخص کنید حلقه واقعاً باید دائمی باشد یا خیر.
- اگر حلقه دائمی است، مکانیزمی برای توقف یا لغو آن در نظر بگیرید.
- مراقب مصرف CPU و حافظه باشید.
- در حلقههایی که عملیات ورودی/خروجی انجام میدهند، از روشهای مناسب asynchronous در صورت نیاز استفاده کنید.
- اگر از break برای پایان حلقه استفاده میکنید، مطمئن شوید شرط خروج واقعاً قابل دستیابی است.
- متغیرهایی که در شرط حلقه استفاده میشوند باید در زمان مناسب تغییر کنند؛ در غیر این صورت احتمال ایجاد حلقه بینهایت ناخواسته وجود دارد.

جمعبندی
Endless Loop یا Infinite Loop به حلقهای گفته میشود که به صورت مداوم اجرا میشود و شرط پایان آن به طور طبیعی برقرار نمیشود. در #C میتوان چنین حلقهای را با ساختارهای while، for و do...while ایجاد کرد.سادهترین نمونه آن while (true) است:
while (true)
{
// دستورات
}
حلقههای بینهایت میتوانند کاربردهای مفیدی مانند ساخت منوهای تعاملی، پردازش مداوم درخواستها و اجرای سرویسهای طولانیمدت داشته باشند.
با این حال، استفاده نادرست از آنها ممکن است باعث مصرف بیش از حد منابع و عدم پاسخگویی برنامه شود.
دستور break یکی از مهمترین روشها برای خروج از حلقه است و continue نیز برای عبور از تکرار فعلی کاربرد دارد.
بنابراین، برنامهنویس #C باید علاوه بر شناخت نحوه ایجاد حلقههای بینهایت، نحوه کنترل و پایان دادن صحیح به آنها را نیز یاد بگیرد.



کاربران ما
شما هم نظرتون با ما دریاره “دستورات تکرار (Endless Loop) در سیشارپ” اشتراک بزارید
برای ارسال نظر لطفا ورود یا ثبت نام کنید