در این مقاله، به بررسی محدوده متغیر در سی شارپ«#Scope of Variables in C» پرداخته و نحوه تعریف و دسترسی به متغیرها در هر یک از این سطوح توضیح داده میشود. با درک این مفاهیم، برنامهنویسان میتوانند کدی پاکتر، کارآمدتر و قابل نگهداریتر بنویسند.
در زبان برنامهنویسی سی شارپ #C، متغیرها «Variables» ابزارهایی برای ذخیرهسازی دادهها هستند که نوع داده، مقدار و محدوده دسترسی آنها بر اساس تعریف مشخص میشود. هر متغیر باید قبل از استفاده با یک نوع داده مشخص مانند int ،string ،bool و غیره تعریف شود. در برنامهنویسی، یکی از مفاهیم اساسی که بر روی ساختار و سازماندهی کد تاثیر زیادی دارد، محدوده متغیرها «Variable Scope» است.
مقدمه
در زبانهای مختلف برنامهنویسی، از جمله #C، مفهوم محدوده متغیرها اهمیت زیادی دارد و بر نحوه عملکرد برنامه تأثیرگذار است. محدوده متغیر «Scope of the variable» تعیین میکند که یک متغیر در کدام بخشهای برنامه قابل دسترسی و استفاده است.
یک متغیر «variable» میتواند در کلاس، متد، حلقه و غیره تعریف شود. در زبانهای C و ++C، تمام شناسهها دارای محدوده لغوی «Lexically» یا ایستا «Statically» هستند، یعنی محدوده یک متغیر در زمان کامپایل تعیین میشود و وابسته به پشتهی فراخوانی توابع نیست. اما برنامههای #C به صورت کلاسها سازماندهی شدهاند.
محدوده متغیر در سی شارپ
در زبان برنامهنویسی سیشارپ #C، برنامهها به صورت کلاسها سازماندهی میشوند و این امر موجب میشود که قوانین محدوده متغیرها به سه دسته اصلی تقسیم شود:
- محدوده سطح کلاس «Class Level Scope»
- محدوده سطح متد «Method Level Scope»
- محدوده سطح بلوک «Block Level Scope»
محدوده سطح کلاس در سی شارپ
متغیرهایی که در یک کلاس، اما خارج از هر متد تعریف میشوند، میتوانند مستقیماً در هر جای کلاس مورد دسترسی قرار گیرند.
این متغیرها با نام فیلدها «Fields» یا اعضای کلاس «Class Members» نیز شناخته میشوند.
متغیرهای با محدوده سطح کلاس میتوانند توسط متدهای غیر ایستا «non-static» کلاس مربوطه که در آن تعریف شدهاند، دسترسی پیدا کنند.
تعدیلکننده دسترسی «Access Modifier» متغیرهای سطح کلاس بر روی محدوده آنها در داخل کلاس تأثیری ندارد.
متغیرهای عضو را میتوان با استفاده از تعدیلکنندههای دسترسی، خارج از کلاس نیز دسترسی داد.
مثال: تکه کد زیر محدودهی سطح کلاس «Class Level Scope» را در #C نشان میدهد. در این مثال متغیر a یک متغیر سطح کلاس است که در تمام متدهای کلاس در دسترس میباشد.
// C# program to illustrate the // Class Level Scope of variables using System; // declaring a Class class PgS { // from here class level scope starts // this is a class level variable // having class level scope int a = 10; // declaring a method public void display() { // accessing class level variable Console.WriteLine(a); } // here method ends } // here class level scope ends class Program { static void Main(string[] args) { PgS obj = new PgS(); obj.display(); } }
خروجی
۱۰
توضیح: کد بالا یک کلاس PgS را با یک متغیر دارای محدوده سطح کلاس (قابل دسترسی در کلاس) تعریف می کند. متد display مقدار a را چاپ می کند. محدوده سطح کلاس به این معنی است که متغیر در سراسر کلاس قابل دسترسی است اما خارج از آن نیست.
محدوده سطح متد در سی شارپ
متغیرهایی که در داخل یک متد تعریف میشوند، دارای محدوده سطح متد هستند.
این متغیرها خارج از متد قابل دسترسی نیستند.
با این حال، این متغیرها میتوانند توسط بلوکهای کد تو در تو «Nested Code Blocks» در داخل متد دسترسی پیدا کنند.
این متغیرها با نام متغیرهای محلی «Local Variables» شناخته میشوند.
اگر این متغیرها دو بار با همان نام در یک محدوده تعریف شوند، خطای زمان کامپایل «Compile-Time Error» رخ خواهد داد.
این متغیرها پس از پایان اجرای متد دیگر وجود ندارند.
مثال: تکه کد زیر محدوده سطح متد در سی شارپ را نشان میدهد.
// C# program to illustrate the // Method Level Scope of variables using System; // declaring a Class class PgS { // from here class level scope starts // declaring a method public void display() { // from here method level scope starts // this variable has // method level scope int m = 47; // accessing method level variable Console.WriteLine(m); } // here method level scope ends // declaring a method public void display1() { // from here method level scope starts // it will give compile time error as // you are trying to access the local // variable of method display() Console.WriteLine(m); } // here method level scope ends } // here class level scope ends
توضیح: این کد سی شارپ محدوده متغیر سطح متد را نشان می دهد. متد display یک متغیر محلی m را تعریف می کند که فقط در آن متد قابل دسترسی است. تلاش برای دسترسی به m در متد display1 منجر به خطای زمان کامپایل«Compile-Time Error» می شود زیرا m خارج از محدوده است و مفهوم دید متغیر و محدودیت های دامنه را نشان می دهد.
محدوده سطح بلوک در سی شارپ
این متغیرها معمولاً در داخل دستورات for، while و غیره تعریف میشوند.
این متغیرها با نام متغیرهای حلقه «Loop Variables» یا متغیرهای دستورات «Statements Variables» نیز شناخته میشوند، زیرا محدوده آنها به بدنه دستوری که در آن تعریف شدهاند، محدود میشود.
معمولاً یک حلقه در داخل یک متد دارای سه سطح از بلوکهای کد تو در تو است: سطح کلاس، سطح متد و سطح حلقه.
متغیری که خارج از حلقه تعریف شده است، در داخل حلقههای تو در تو نیز قابل دسترسی است.
به این معنا که یک متغیر با محدوده سطح کلاس به متدها و تمام حلقهها دسترسی خواهد داشت.
یک متغیر با محدوده سطح متد به حلقهها و بدنه متد داخل همان متد دسترسی خواهد داشت.
متغیری که در داخل بدنه یک حلقه تعریف شده است، خارج از بدنه حلقه قابل مشاهده نخواهد بود.
مثال: تکه کد زیر محدوده سطح بلوک در سی شارپ را نشان میدهد.
// C# code to illustrate the Block // Level scope of variables using System; // declaring a Class class PgS { // from here class level scope starts // declaring a method public void display() { // from here method level scope starts // this variable has // method level scope int i = 0; for (i = 0; i < 4; i++) { // accessing method level variable Console.WriteLine(i); } // here j is block level variable // it is only accessible inside // this for loop for (int j = 0; j < 5; j++) { // accessing block level variable Console.WriteLine(j); } // this will give error as block level // variable can't be accessed outside // the block Console.WriteLine(j); } // here method level scope ends } // here class level scope ends
توضیح: این کد مفهوم محدوده بلوک «Block Level Scope» و تفاوت آن با محدوده متد «Method Level Scope» را نشان میدهد. . یک کلاس PgS را با متد display تعریف می کند. این متد حاوی یک متغیر سطح متد i است که در متد قابل دسترسی است.متغیر j در داخل بلوک حلقه for تعریف شده است. بنابراین فقط در داخل همان بلوک قابل دسترسی است و خارج از آن ناشناخته است. تلاش برای دسترسی به j در خط آخر باعث خطای زمان کامپایل میشود.
نتیجهگیری
در نهایت، درک صحیح از محدوده متغیر در سی شارپ نقش بسیار مهمی در نوشتن کدهای بهینه، خوانا و مقیاسپذیر ایفا میکند. با توجه به اینکه متغیرها در سه سطح مختلف از جمله سطح کلاس، سطح متد و سطح بلوک تعریف میشوند، آگاهی از این سطوح و قوانین مربوط به هر یک میتواند به برنامهنویسان کمک کند تا بهتر از منابع استفاده کنند و از بروز مشکلاتی همچون تداخل نام متغیرها و اشتباهات در دسترسی به آنها جلوگیری نمایند.
همچنین، شناخت این مفاهیم به برنامهنویسان این امکان را میدهد که درک عمیقتری از نحوه سازماندهی و ساختار برنامهها پیدا کرده و کدی سادهتر و مستحکمتر بنویسند. در مجموع، توجه به اصول مربوط به محدوده متغیر در سی شارپ #C نه تنها به بهبود کیفیت کد کمک میکند، بلکه در افزایش کارایی و نگهداری آسانتر برنامهها نیز تأثیرگذار است.