فصل 12 از 40 درس 1 از 1

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 متغیرها» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.