Scope و Lifetime متغیرها
Scope و Lifetime متغیرها
بخشی از آموزش جامع C# و .NET 10
محتوای درس Scope و Lifetime متغیرها
Scope مشخص میکند یک نام در کدام بخش کد قابل دسترسی است و Lifetime مدت زنده ماندن داده را توصیف میکند. تفکیک این دو مفهوم برای جلوگیری از وابستگیهای پنهان مهم است.
۱. Local Scope
متغیر محلی فقط در بلوکی که تعریف شده و بلوکهای فرزند آن قابل دسترسی است.
مثال
static void M(){int local=10; Console.WriteLine(local);}
M();در این مثال، مفهوم «Local Scope» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۲. Block Scope
if، for، while و بلوکهای مستقل میتوانند Scope جداگانه ایجاد کنند.
مثال
int x=1;
if(x>0){int y=2; Console.WriteLine(x+y);}در این مثال، مفهوم «Block Scope» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۳. Class Scope
Fieldها در سطح Class تعریف میشوند و Lifetime آنها به نمونه یا خود Type برای اعضای static وابسته است.
مثال
class Counter { private int _value; public void Inc()=>_value++; public int Value=>_value; }
var c=new Counter(); c.Inc(); Console.WriteLine(c.Value);در این مثال، مفهوم «Class Scope» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۴. Shadowing
استفاده از نام مشابه در Scopeهای مختلف میتواند خوانایی را کاهش دهد و بهتر است تا حد امکان اجتناب شود.
مثال
int value=10;
{ int other=value+1; Console.WriteLine(other); }در این مثال، مفهوم «Shadowing» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۵. Lifetime و GC
خروج یک متغیر از Scope لزوماً به معنی آزاد شدن فوری حافظه نیست؛ GC بر اساس Reachability حافظه مدیریتشده را بازیابی میکند.
مثال
var data=new byte[1024];
Console.WriteLine(GC.GetGeneration(data));در این مثال، مفهوم «Lifetime و GC» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۶. مثالهای عملی
int count = 10;
if (count > 0)
{
string message = "Available";
Console.WriteLine(message);
}
// message is not available hereاین نمونه عملی چند مفهوم فصل را در کنار هم قرار میدهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.
class Counter
{
private int _value;
public void Increment()
{
int step = 1;
_value += step;
}
}این نمونه عملی چند مفهوم فصل را در کنار هم قرار میدهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.
۷. خطاهای رایج
• Field کردن دادهای که فقط در یک متد لازم است
• استفاده مکرر از نامهای یکسان در Scopeهای تو در تو
• فرض آزاد شدن فوری حافظه با خروج از بلوک
۸. نکات اجرایی
• نامها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.
• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.
• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.
۹. تمرین عملی
کلاسی بسازید که یک Field برای شمارنده داخلی داشته باشد و در چند متد با متغیرهای محلی متفاوت آن را مدیریت کند.
۱۰. جمعبندی
در این فصل، مبانی «Scope و Lifetime متغیرها» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصلهای بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم میکند.