مقدمه

برای حل خیلی از مسائل، باید کدی بنویسیم که بتواند در شرایط مختلف، کارهای متفاوتی انجام دهد. ساختارهای شرطی در برنامه‌نویسی، امکان پیاده‌سازی سناریوهای شرطی را فراهم می‌کنند. در C# گزاره‌های if و switch به این منظور تدارک دیده شده‌اند. یک گزاره‌ی if اجرا یا عدم اجرای یک مجموعه از دستورات را به برقرار بودن یا نبودن یک شرط، وابسته می‌کند. گزاره‌های switch هم در برخی موارد، سناریوهای شرطی را به شکل خلاصه‌تری پیاده‌سازی می‌کنند. علاوه بر اینها، یک عملگر شرطی هم داریم که تنها عملگری است که سه عملوند دارد و از این‌رو عملگر ternary یا سه‌گانه نامیده می‌شود.

گزاره‌های if

در C# یک گزاره‌ی if دارای ساختار کلی زیر است.

if (condition) 
{
  // code to run if condition be true 
} 
else 
{
  // code to run if condition be false 
}

در اینجا condition یک عبارت شرطی است که اگر مقدارش true باشد، دستورات بلاک if و اگر false باشد، دستورات بلاک else اجرا می‌شوند.

توجه داشته باشید که C# مقادیر غیر بولین را به عنوان شرط بلاک if نمی‌پذیرد. این موضوع را به‌خصوص کسانی که با زبان‌هایی مانند جاوااسکریپت و پایتون کار کرده‌اند، باید در نظر داشته باشند. در این زبان‌ها هر مقداری که به عنوان شرط بلاک if وارد شود، به طور ضمنی به مقدار بولین معادلش تبدیل می‌شود اما در C# عبارت بلاک if حتماً باید بولین باشد.

البته از بخش else می‌توان صرف‌نظر کرد که در این صورت، اگر condition برابر با true باشد، دستورات بلاک if اجرا می‌شوند و در غیر این صورت، بلاک if نادیده گرفته می‌شود.

یک پروژه‌ی جدید با نام BranchingInCsharp ایجاد کنید و کد زیر را در فایل Program.cs وارد کنید.

Copy Icon Program.cs
Console.Write("Enter Your Score: ");
double score = Convert.ToDouble(Console.ReadLine());
if (score >= 10)
{
  Console.WriteLine("Ok , You are passed");
}
else
{
  Console.WriteLine("Sorry , You are not passed");
}

کاری که این کد انجام می‌دهد این است که ابتدا از کاربر می‌خواهد که یک عدد را وارد کند. سپس، ورودی کاربر را که از نوع string است، به یک double تبدیل می‌کند. در ادامه، بسته به مقدار این عدد، پیغام مناسبی را چاپ می‌کند. دقت کنید که در گزاره‌ی دوم چطور متد ReadLine() به متد ToDouble() پاس شده تا ورودی کاربر به double تبدیل شود و در متغیری به نام score ذخیره شود.

گزاره‌های else if

وقتی بیش از یک شرط داشته باشیم، می‌توانیم از گزاره‌های else if استفاده کنیم. فرض کنید قصد داریم کدی بنویسیم که دو عدد را از کاربر دریافت کند و نتیجه‌ی مقایسه‌ی آنها را با یک پیغام مناسب، چاپ کند.

Copy Icon Program.cs
string message;
Console.Write("Enter First Number: ");
double first = Convert.ToDouble(Console.ReadLine());
Console.Write("Enter Second Number: ");
double second = Convert.ToDouble(Console.ReadLine());

if (first == second)
{
  message = $"{first} equal {second}";
}
else if (first > second)
{
  message = $"{first} greater than {second}";
}
else
{
  message = $"{first} less than {second}";
}

Console.WriteLine(message);

برنامه را اجرا کنید و آن را با مقادیر ورودی مختلف، تست کنید.

عملگر شرطی Ternary

گزاره‌های شرطی ساده را می‌توان به جای if else با استفاده از عملگر شرطی ternary به شکل خلاصه‌تری نوشت. از این عملگر به فرم زیر استفاده می‌شود.

condition ? first_expression : second_expression;

اگر condition برابر با true باشد، عبارت بعد از علامت سؤال و اگر false باشد، عبارت بعد از دونقطه برگردانده می‌شود. مثال زیر را ببینید.

Copy Icon Program.cs
int i = 8; 

string result = i % 2 == 0 ? "even" : "odd"; // even

در اینجا مقدار even در متغیر result ذخیره می‌شود اما اگر یک عدد فرد را به i بدهیم، مقدار odd در result ذخیره خواهد شد.

توجه داشته باشید که عملگر ternary را فقط می‌توان در گزاره‌های تخصیص به کار گرفت و بنابراین، نوع مقادیر بعد از علامت سؤال و بعد از دونقطه باید یکی باشد.

گزاره‌ها و عبارات switch

یکی دیگر از ساختارهای شرطی C# گزاره‌ی switch است که به ما امکان می‌دهد یک متغیر یا یک عبارت را با مجموعه‌ای از مقادیر مقایسه کنیم تا بر اساس آن، کدی که باید اجرا شود، مشخص شود. گاهی اوقات استفاده از یک گزاره‌ی switch به جای چندین گزاره‌ی else if، انتخاب به‌صرفه‌تری است. ساختار کلی یک گزاره‌ی switch به صورت زیر است.

switch (expression)
{
  case value1:
    // Code to execute if expression equals value1
    break;
  case value2:
    // Code to execute if expression equals value2
    break;
  default:
    // Code to execute if no case matches
    break;
}

عبارت switch که در اینجا با expression مشخص شده، با مقادیری که بعد از case آورده شده مقایسه می‌شود و با هر کدام که برابر باشد، دستورات همان case اجرا می‌شود. اگر expression با هیچ‌یک از این مقادیر یکسان نباشد، دستورات بعد از default اجرا می‌شود. استفاده از default اختیاری است اما هر case باید با break; به پایان برسد. مثال زیر را ببینید.

Copy Icon Program.cs
Console.Write("Your rank: ");
int rank = Convert.ToInt32(Console.ReadLine());
            
switch (rank)
{
  case 1:
    Console.WriteLine("Gold Medal");
    break;
  case 2:
    Console.WriteLine("Silver Medal");
    break;
  case 3:
    Console.WriteLine("Bronze Medal");
    break;
  default:
    Console.WriteLine("No Medal");
    break;
}

اگر چند case کد یکسانی داشته باشند، می‌توانیم آنها را با هم ترکیب کنیم تا از تکرار بی‌مورد کدها جلوگیری شود. مثال زیر را ببینید.

Copy Icon Program.cs
Console.Write("Your rank: ");
int rank = Convert.ToInt32(Console.ReadLine());
            
switch (rank)
{
  case 1:
  case 2: 
  case 3:
    Console.WriteLine("You get a medal");
    break;
  default:
    Console.WriteLine("You don't get a medal");
    break;
}

عبارات switch

از C# 8 به بعد، امکان استفاده از switch به عنوان عبارت (expression) وجود دارد. یک عبارت switch مثل هر عبارت دیگر، یک مقدار برمی‌گرداند و این به ما امکان می‌دهد که در گزاره‌های تخصیص و یا در هر جایی که انتظار یک مقدار (value) می‌رود، از یک عبارت switch استفاده کنیم. در کد زیر، مثال بالا را با استفاده از یک عبارت switch به جای یک گزاره‌ی switch نوشته‌ایم که مختصرتر و تر و تمیزتر به نظر می‌رسد.

Copy Icon Program.cs
Console.Write("Your rank: ");
int rank = Convert.ToInt32(Console.ReadLine());
            
string result = rank switch 
{
  1 => "Gold Mrdal", 
  2 => "Silver Medal", 
  3 => "Bronze Medal", 
  _ => "No Medal"
};
            
Console.WriteLine(result);