محدوده متغیر در سی شارپ #C — نحوه به کارگیری با مثال

تصویر شاخص محدوده متغیر در سی شارپ

در این مقاله، به بررسی محدوده متغیر در سی شارپ«#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 نه تنها به بهبود کیفیت کد کمک می‌کند، بلکه در افزایش کارایی و نگهداری آسان‌تر برنامه‌ها نیز تأثیرگذار است.


سوالات متداول


محدوده متغیر چیست؟

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

تفاوت بین متغیرهای سطح کلاس و سطح متد چیست؟

متغیرهای سطح کلاس خارج از هر متد، در کلاس تعریف می‌شوند و در سراسر کلاس قابل دسترسی هستند. این متغیرها می‌توانند توسط متدهای غیر استاتیک استفاده شوند و بر اساس تعدیل‌کننده‌های دسترسی، می‌توانند از خارج کلاس نیز استفاده شوند. متغیرهای سطح متد در داخل متد تعریف می‌شوند و تنها در همان متد قابل دسترسی هستند. این متغیرها به محض پایان اجرای متد حذف می‌شوند.

آیا می‌توان یک متغیر را دو بار با همان نام در یک محدوده تعریف کرد؟

خیر، اگر یک متغیر با همان نام در یک محدوده دوباره تعریف شود، خطای زمان کامپایل (Compile-Time Error) رخ می‌دهد.

آیا متغیرهای محلی می‌توانند به عنوان آرگومان به متدهای دیگر ارسال شوند؟

بله، متغیرهای محلی می‌توانند به عنوان آرگومان به متدهای دیگر ارسال شوند، اما تنها مقدار آن‌ها منتقل می‌شود و محدوده اصلی متغیر همچنان محدود به متد اولیه خواهد بود.

آیا می‌توان متغیری با همان نام در محدوده‌های مختلف تعریف کرد؟

بله، در #C می‌توان متغیرهایی با همان نام را در محدوده‌های مختلف (مثل بلاک‌های متفاوت) تعریف کرد، اما این کار می‌تواند باعث ابهام در کد شود و معمولاً توصیه نمی‌شود.

چگونه می‌توان با متغیرهای خارج از محدوده کار کرد؟

برای دسترسی به متغیرهای خارج از محدوده، باید آن‌ها را به عنوان فیلد یا متغیر عمومی تعریف کنید یا از پارامترهای متدها برای ارسال داده استفاده کنید.

میزان رضایتمندی
لطفاً میزان رضایت خودتان را از این مطلب با دادن امتیاز اعلام کنید.
[ امتیاز میانگین 5 از 12 نفر ]
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع و مراجع:
geeksforgeeks مجله پی استور scholarhat

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *



برچسب‌ها:
سی شارپ


پیمایش به بالا