مشخصات مقاله
-
6651
-
0.0
-
11591
-
0
-
0
قفل، break و continue در سی شارپ (C# lock)
زمانی که شما به ایجاد برنامه های (کاربردی) سرویس گیرنده / سرویس دهنده یا منابع فشرده می پردازید، خواهید دانست که امکان دسترسی چندین کاربر یا بیش از یک منبع به برنامه ی شما یا انجام عملیاتی بر شئی از برنامه ی شما وجود دارد. مثال آن تلاش چندین شخص بر افزودن رکورد یا خط جدید به یک فایل یکسان است. در برخی موارد با چنین رخدادی موافق هستید ولی در برخی شرایط سعی دارید از بروز آن جلوگیری کنید. به منظور جلوگیری از دسترسی کاربر یا یک منبع به شئ از برنامه ی کاربردی مورد نظر، لازم است آن قسمت از تراکنش که عملیات در آن جایز نیست قفل ایجاد شود. برای نیل به این هدف فرمول زیر را به کارببرید.
Declare a Variable
lock(Variable)
{
// Do what you want here
}
// The variable has been released
مثال:
- فایل Management.cs را به صورت زیر اصلاح کنید.
using System;
public class Management
{
... No Change
public static int Main()
{
double amount = 0;
byte nextAction = 0;
Customer accountHolder = null;
Management registration = new Management();
Console.Title = "National Bank";
accountHolder = registration.CreateNewAccount();
Console.WriteLine("Enter the customer's initial deposit");
accountHolder.Balance = registration.GetMoney();
Console.Clear();
registration.ShowAccountInformation(accountHolder);
do
{
Console.WriteLine("What do you want to do now?");
Console.WriteLine("1 - Check account balance");
Console.WriteLine("2 - Make a deposit");
Console.WriteLine("3 - Withdraw money");
Console.WriteLine("4 - Transfer money from one account to another");
Console.Write("Enter your choice: ");
nextAction = byte.Parse(Console.ReadLine());
Console.Clear();
// Don't allow wny other operation on this section
// while this section is executing
lock (registration)
{
switch (nextAction)
{
case 1:
Console.Clear();
registration.ShowAccountInformation(accountHolder);
Console.Write("Press Enter for next operation");
Console.ReadKey();
break;
case 2:
Console.Write("Enter Deposit ");
amount = registration.GetMoney();
accountHolder.Balance = accountHolder.Balance + amount;
Console.Clear();
registration.ShowAccountInformation(accountHolder);
break;
case 3:
Console.Write("Enter Withdrawal ");
amount = registration.GetMoney();
if (amount > accountHolder.Balance)
{
Console.WriteLine("You are not allowed to withdraw more money than your account has.");
Console.ReadKey();
}
else
accountHolder.Balance = accountHolder.Balance - amount;
Console.Clear();
registration.ShowAccountInformation(accountHolder);
break;
case 4:
Console.WriteLine("Operation not available: You have only one account with us");
break;
}
}
// Other objects can access this section now
if ((nextAction < 1) || (nextAction > 4))
Console.WriteLine("Invalid Action: Please enter a value between 1 and 4");
} while ((nextAction >= 1) && (nextAction <= 4));
Console.ReadKey();
return 0;
}
}
- کلید F5 را زده تا برنامه اجرا شود.
- کلیه ی مراحل بخش پیشین را دنبال کنید.
- به محیط برنامه نویسی خود بازگردید.
ایجاد وقفه در جریان دستور شرطی
دستور break به منظور ایجاد وقفه در یک حلقه یا متوقف کردن آن به کار می رود. فرمول دستور مذکور به شرح زیر می باشد.
break;
اگرچه break از تنها یک کلمه تشکیل شده است، اما به خودی خود یک دستور کامل تلقی می گردد؛بنابراین، باید همیشه در خط مختص به خودش قرار گیرد (که به افزایش و بهبود خوانایی برنامه کمک شایانی می کند). دستور break برای نزدیک ترین دستور پیشین (دستوری که بلافاصله break پس از آن در خط بعدی قرار گرفته) به کار بسته می شود، البته منوط به اینکه دستور مذکور (پیشین) قابل اجرا باشد. دستور break در شرط while، do…while و همچنین در حلقه های for به منظور متوقف کردن عمل در حال اجرا بکار می رود. در مثال زیر تعداد طبقات یک ساختمان از 1 تا 12 شمرده می شود ولی با استفاده از دستور break حین شمارش عدد 3 برنامه متوقف می گردد.
using System;
public class Exercise
{
public static int Main()
{
for (var stories = 1; stories <= 12; stories++)
{
Console.WriteLine("Story {0}", stories);
if (stories == 3)
break;
}
return 0;
}
}
نتیجه ی زیر به دست می آید.
Story 1 Story 2 Story 3 Press any key to continue...
ادامه دادن دستور شرطی
دستور continue از فرمول زیر استفاده می کند.
continue;
هنگام پردازش حلقه، چنانچه دستور مورد نظر به مقدار نادرستی برخورد کرد، شما می توانید با استفاده از دستور continue در دستورات شرطی while، do...while و for دستور بعدی را نادیده گرفته یا از مقدار غلط و نا معتبر بولی به طور مستقیم به مقدار معتبر بعدی بروید (این برخلاف دستور break می باشد که از حلقه خارج می گردد). مشابه دستور break، کلید واژه ی continueنزدیک ترین دستور شرطی پیش از خود را تحت تاثیر قرار می دهد و باید در خطی مجزا قرار گیرد. مثال زیر باید طبقات یک ساختمان را از 1 تا 6 بشمارد، به نحوه ی استفاده از دستور continue در آن توجه کنید.
using System;
public class Exercise
{
public static int Main()
{
for (var stories = 1; stories <= 6; stories++)
{
if (stories == 3)
continue;
Console.WriteLine("Story {0}", stories);
}
return 0;
}
}
نتیجه
Story 1 Story 2 Story 4 Story 5 Story 6 Press any key to continue...
همان طور که مشاهده می کنید، compiler هنگامی که به عدد 3 می رسد آن را کاملاً نادیده گرفته و بقیه ی فرایند را ادامه می دهد.
اصلاح مقداری در حلقه
داخل حلقه، می توان علامتی گذاشت که بر تکامل یک دستور نظارت می کند، از این طریق هنگامی که تگ / دستور به مقدار معینی می رسد به جای نادیده گرفتن تنها یک مقدار (پریدن به اندازه ی یک مقدار / به جای skip کردن یک مقدار، چندین مقدار جلو برود) به مقدار دلخواه شما می پرد. برای این منظور، در حلقه به مقدار جاری توجه کنید و زمانی که به مقدار مورد نظر رسید، آن را تغییر دهید. در مثال زیر از برنامه خواسته شده از 1 تا 15 بشمارد.
using System;
public class Exercise
{
static int Main()
{
for (var story = 0; story < 15; story++)
{
if (story == 6)
story = 10;
Console.WriteLine("Elevator at: {0}", story);
}
return 0;
}
}
نتیجه
Elevator at: 0 Elevator at: 1 Elevator at: 2 Elevator at: 3 Elevator at: 4 Elevator at: 5 Elevator at: 10 Elevator at: 11 Elevator at: 12 Elevator at: 13 Elevator at: 14 Press any key to continue...
همان طور که مشاهده می کنید، به محض رسیدن به عدد 6، حلقه به طور مستقیم به مقدار 10 می پرد.
رفتن به لیبل تعیین شده
دستور goto یکی از دستورات پرش محسوب می شود که کنترل (اجرای برنامه) را به بخش (بخش نام گذاری شده / لیبل تعیین شده) دیگری از تابع همان برنامه انتقال می دهد. برای استفاده از دستور goto باید اسمی را در بخش مورد نظر در تابع درج کرد. لازم به ذکر است که با لیبل (اسم) نشان می دهیم برنامه باید کنترل را به کجا در تابع همان برنامه انتقال دهد. حال، اسم یا لیبل متشکل از تنها یک کلمه است و از همان قوانینی که برای تعیین اسم در C++ تعریف کردیم پیروی می کند. اسم مورد نظر (اسم می تواند هر چیزی باشد)، به دنبال آن دونقطه " : ". زیر مثالی را مشاهده می کنید که در آن برنامه طبقات یک ساختمان 14 طبقه ای را می شمارد.
using System;
public class Exercise
{
public static int Main()
{
for (var stories = 1; stories <= 14; stories++)
{
if (stories == 4)
goto CountUpTo3;
Console.WriteLine("Story {0}", stories);
}
CountUpTo3:
Console.WriteLine("Our homes have only up to 3 levels\n");
return 0;
}
}
نتیجه
Story 1 Story 2 Story 3 Our homes have only up to 3 levels Press any key to continue...