آشنایی با چند مفهوم مرتبط با متغیر

متغیر در چه قسمت‌هایی از کد قابل دسترسی است؟ بلاک کد، محدوده، و طول عمر متغیر مفاهیمی هستند که به این سؤال مهم و پرکاربرد پاسخ می‌دهند. در این فصل با این مفاهیم آشنا می‌شویم. 

بلاک کد

به تمام دستوراتی که بین {} (آکولاد باز و بسته) قرار می‌گیرند یک بلاک کد (Code Block) می‌گویند که این بلاک کد می‌تواند شامل یک یا چند دستور باشد. درواقع، بلاک‌های کد روشی برای گروه‌بندی دستورات است. این بلاک‌های کد را در دستورات if, switch, for, while دیده‌ایم. در مثال زیر دو بلاک کد داریم:

double playerHealth = 12.5;

if(playerHealth > 0)
{
    Console.WriteLine("Player is Alive");
    Console.WriteLine("Continue…");
}
else
{
    Console.WriteLine("Game Over!");
}

بلاک کد تو در تو

بلاک‌های کد می‌توانند به‌صورت تو در تو باشند. به این معنی که یک بلاک کد می‌تواند شامل یک یا چند بلاک کد دیگر نیز باشد. در قطعه کد زیر در حلقۀ while یک دستور if نوشته‌ایم که این یک بلاک کد تو در تو است.

int taskCount = 40;
bool isRunning = true;
while(isRunning == true)
{
    Console.WriteLine("A lot of tasks are running...");
    taskCount = taskCount - 1;
    if(taskCount < 10)
    {
        isRunning = false;
    }
}

در ادامۀ مسیر با نمونه‌های بیشتری از بلاک‌های کد تو در تو آشنا می‌شویم.

محدوده متغیر

هر بلاک کد محدودۀ متغیر (Variable Scope) را تعریف می‌کند، یعنی دسترسی‌پذیری و مشاهده‌پذیر بودن متغیر را در کد مشخص می‌کند. به این معنی که متغیر تعریف‌شده در این محدوده فقط در خود این محدوده و بلاک‌های کد تو در توی آن قابل دسترسی است و خارج از این محدوده نمی‌توان به متغیر دسترسی داشت.

برای مثال قطعه کد زیر را در نظر بگیرید:

int age = 15;
if(age <= 18)
{ // شروع محدوده
  Console.WriteLine("The Individual is Under 18");
  bool isUnder18 = true; //فقط در این محدوده قابل دسترسی است
} // پایان محدوده

Console.WriteLine("Age is " + age);

// این خط کد، خطا دارد 
Console.WriteLine("Is the Individual under18?" + isUnder18); 

از متغیر age می‌توانیم در دستور if استفاده کنیم، چون بلاک if به‌صورت تو در تو در همین بلاکی که age تعریف شده است تعریف شده، اما چون متغیر isUnder18 در بلاک مربوط به if تعریف شده است، پس بیرون از این بلاک قابل دسترسی نیست.

قوانین تعریف متغیر مربوط به بلاک کد

در یک بلاک کد یک متغیر با یک نام نمی‌تواند بیش از یک‌بار تعریف شود. 

قطعه کد زیر را در نظر بگیرید که نامعتبر است:

int itemCount = 10;
Console.WriteLine("We have " + itemCount + " Items");
int itemCount = 20;

همچنین، اگر در بلاک کدی یک متغیر تعریف شد، در بلاک کدهای داخلی آن نمی‌توان یک متغیر با همان نام تعریف کرد.

قطعه کد زیر را در نظر بگیرید که نامعتبر است:

int itemCount = 10;
for(int i = 0; i < 5; i = i + 1)
{
    int itemCount = i;
    Console.WriteLine("We have " + itemCount + " Items");
}

دقت کنید که امکان تعریف یک متغیر در دو محدودۀ مجزا وجود دارد. قطعه کد زیر را در نظر بگیرید:

for(int i = 0; i < 5; i = i + 1)
{
    Console.WriteLine("i is " + i);
}

for(int i = 0; i < 5; i = i + 1)
{
    Console.WriteLine ("i is " + i);
}

در قطعه کد بالا، با توجه به این‌که هر حلقۀ for یک محدودۀ مجزا را تعریف می‌کند، پس می‌توان متغیر i را در هر دو حلقه تعریف کرد.

مفهوم محدودۀ متغیر بسیار مهم و کاربردی است.

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

قطعه کد زیر را در نظر بگیرید:

for(int i = 0; i < 10; i = i + 1)
{
    int newVaraible = 1;
    Console.WriteLine("value is " + newVaraible);
    newVaraible = newVaraible + 1;
}

در این قطعه کد 10 بار عبارت "value is 1" نوشته می‌شود. در تکرار اول این حلقه مقدار newVariable برابر 1 مقداردهی می‌شود و در تکرار دوم، چون دوباره این متغیر تعریف شده است، متغیر جدیدی ساخته می‌شود و مقدار آن دوباره 1 می‌شود. در صورتی ‌که بخواهیم مقادیر متفاوتی را نشان دهیم، باید کد بالا را به کد پایین تبدیل کنیم:

int newVaraible = 1;
for(int i = 0; i < 10; i = i + 1)
{
    Console.WriteLine("value is " + newVaraible);
    newVaraible = newVaraible + 1;
}

در این حالت متغیر newVariable را در بلاک کد بیرونی تعریف کرده‌ایم تا هربار مقدار آن جایگزین نشود، درنتیجه مقدار newVariable هربار یک واحد اضافه می‌شود.

  1. قطعه کد زیر اشتباه است. آن را به گونه‌ای درست کنید که عبارت "سبد خرید خالی نیست" هم در کنسول نمایش داده شود.

    int itemCount = 3;
    if(itemCount > 0)
    {
     Console.WriteLine("تعدادی محصول در سبد خرید موجود است");
     bool isEmptyShoppingCart = false;
    }
    if(isEmptyShoppingCart == false)
     Console.WriteLine("سبد خرید خالی نیست");

  2. آیا قطعه کد زیر درست است؟

    for(int i = 0; i < 5; i = i + 1)
    {
     Console.WriteLine("i is " + i);
    }
    int i = 10;
    for(int i = 0; i < 5; i = i + 1)
    {
     Console.WriteLine("i is " + i);
    }

طول عمر متغیر

هر متغیری که تعریف می‌کنیم، طول عمر (lifetime) مشخصی دارد. یعنی مدت زمانی که متغیر در حافظه وجود دارد. به‌طور معمول، متغیر‌هایی که در هر محدوده تعریف می‌شوند، طول عمری معادل همان محدوده دارند. متغیر‌هایی که در متد تعریف می‌شوند، طول عمر برابر با زمان اجرای متد دارند و هنگامی‌که اجرای کدهای متد پایان یافت، طول عمر متغیر‌ها هم پایان می‌یابد. متغیر کنترلی که در حلقۀ for تعریف می‌شود، طول عمر برابر همان حلقه دارد، یعنی وقتی حلقه شروع می‌شود، عمر متغیر هم شروع می‌شود و وقتی حلقه تمام می‌شود، عمر متغیر هم پایان می‌یابد.