میدان دید متغیرها در دیگر ساختارها در سی شارپ

Ratings
(0)

 

یکی از نقاطی که در بخش قبلی عواقبی فراتر از میدان دید متغیر بین توابع دارد، عبارت است از اینکه، میدان های دید متغیرها، شامل بلوک های کدی است که در آن تعریف شده ند و شامل هر بلوک کد تودرتوی مستقیم نیز می شوند. شما می توانید کدی که در ادامه درباره ی آن بحث می کنیم را در کدهای دانلودی، در پوشه ی VariableScopeInLoops\Program.cs پیدا کنید. 

این همچنین به دیگر بلوک های کد، مانند آنهایی که در انشعاب گذاری(branching) و ساختارهای حلقه(looping structures) به کار می روند، اعمال می شود. کد زیر را در نظر بگیرید:

int i;
for (i = 0; i < 10; i++)
{
  string text = $"Line {Convert.ToString(i)}";
  WriteLine($"{text}");
}
WriteLine($"Last text output in loop: {text}");

در اینجا، متغیر رشته ای text در حلقه ی loop ،محلی(local) است. این کد کامپایل نمی شود، زیرا فراخوانی WriteLine() که در بیرون از این حلقه،  قرار دارد، تلاش می کند تا از متغیر text که در خارج از حلقه، در خارج از میدان دید خود قرار دارد، استفاده کند. سعی کنید کد بالا را به صورت زیر اصلاح کنید:

int i;
string text;
for (i = 0; i < 10; i++)
{
  text = $"Line {Convert.ToString(i)}";
  WriteLine($"{text}");
}
WriteLine($"Last text output in loop: {text}");

این کد نیز با شکست مواجه می شود، زیرا متغیرها قبل از اینکه مورد استفاده قرار گیرند، باید تعریف و مقداردهی اولیه(initialized) شوند ولی متغیر text تنها در حلقه ی for مقدار دهی اولیه شده است. مقدار انتساب داده شده در متغیر text وقتی که از بلوک حلقه خارج شویم، از دست می رود؛ زیرا در بیرون از این بلوک، مقداردهی اولیه نشده است. اما می توانیم تغییر زیر را انجام دهیم:

int i;
string text = "";
for (i = 0; i < 10; i++)
{
  text = $"Line {Convert.ToString(i)}";
  WriteLine($"{text}");
}
WriteLine($"Last text output in loop: {text}");

این دفعه، متغیر text در بیرون از حلقه، مقداردهی اولیه شده است و به مقدار آن دسترسی داریم. نتیجه ی این کد ساده، در تصویر 6.7 نشان داده شده است:

(تصویر 6.7)

نتیجه ی اجرای کد سی شارپ

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

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

با اینکه خود این متغیر در حلقه محلی سازی(isn’t localized) نشده است، اما مقداری که در آن قرار دارد، چنین است. اما انتساب یک مقدار در بیرون از این حلقه، تضمین می کند که این مقدار در کد اصلی، محلی(local) است و هنوز در میدان دید این حلقه قرار دارد. این یعنی اینکه این متغیر، قبل از اینکه از بلوک کد اصلی خارج شویم، از میدان دید خارج نمی شود؛ بنابراین ما به مقدار آن در بیرون از حلقه دسترسی داریم. خوشبختانه، کامپایلر سی شارپ، مشکلات میدان دید متغیرها را تشخیص می دهد و با پیغام هایی که در پاسخ به خطاها تولید می کند، مطعناً به شما کمک می کند تا بحث میدان دید را درک کنید. 

 

  • بازدید: 49

نوشتن دیدگاه

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

ارسال