نطاق المتغيرات في لغة السي شارب

نطاق المتغيرات في لغة السي شارب (3 أنواع لتعرفها)

نطاق المتغيرات في لغة السي شارب يشير إلى إمكانية استخدام المتغير في جزء معين من البرنامج.

في لغة السي شارب، للمتغير ثلاث أنواع من النطاقات وهي:

  • نطاق مستوى الصف (Class Level Scope).
  • نطاق مستوى الدالة (Method Level Scope).
  • نطاق مستوى البلوك (Block Level Scope).

نطاق المتغيرات في لغة السي شارب

نطاق مستوى الصف

في لغة السي شارب، عندما نقوم بتعريف متغير داخل صف ما (Class)، فأن هذا المتغير يمكن الوصول له من ضمن ذاك الصف، وهذا ما يعرف بنطاق مستوى الصف.

متغيرات مستوى الصف تُعرف بإسم الحقول، ويمكن تعريفهم خارج الدوال والمشيدات (constructors) و البلوكات (blocks).

المثال

using System;
namespace VariableScope {
  class Program {

    // متغير من نطاق مستوى الصف
    string str = "Class Level";

    public void display() {
      Console.WriteLine(str);
    }

    static void Main(string[] args) {
      Program ps = new Program();
      ps.display();

      Console.ReadLine();
    }
  }
}

الخرج

Class Level

في المثال أعلاه، قمنا بتهيئة (تعريف+تمرير قيمة) المتغير (str) داخل الصف (Program)، وبكون هذا المتغير له نطاق من مستوى الصف، فيمكن الوصول له بواسطة دالة معرفة داخل نفس الصف.

public void display() {
  Console.WriteLine(str);
}

كما نلاحظ أعلاه، تم الوصول للمتغير من قبل الدالة، لأنة نطاق مستوى الصف يمكن الوصول له من نفس الصف.

ملاحظة: لا يمكن الوصول للمتغيرات من نطاق مستوى الصف بإستخدام دالة ستاتيكية (Static)، على سبيل المثال: اذا كان لدينا دالة من نوع (Static) داخل الصف program أيضاً، فأنه لا يمكنها الوصول للمتغير str، على الرغم من كونها دالة داخل نفس الصف.مثال،

static void display2() {

  //محاولةالوصول للمتغير
  // سيسبب طهور خطأ
  Console.WriteLine(str);
}

نطاق مستوى الدالة

عندما نقوم بتعريف متغير ما داخل دالة، فأن هذا المتغير يمكن الوضول له من داخل الدالة نفسها فقط. وهذا ما يعرف بنطاق مستوى الدالة (method level variable scope).

المثال

using System;

namespace VariableScope {
  class Program {

    public void method1() {
      // متغير داخل الدالة
      string str = "method level";
    }

    public void method2() {

      // محاولة الوصول للمتغير من دالة آخرى
      Console.WriteLine(str);
    }

    static void Main(string[] args) {
      Program ps = new Program();
      ps.method2();

      Console.ReadLine();
    }
  }
}

في المثال أعلاه، قمنا بتعريف متغير بإسم str داخل الدالة ()method1.

//داخل الدالة
string str = "method level";

هنا، المتغير str معرف داخل الدالة method1 لذلك لا يمكن الوصول له من خارج هذه الدالة.عندما نحاول الوصول له من خلال الدالة method2، سوف نحصل على خطأ (Error).

//داخل الدالة الثانية
Console.WriteLine(str);  // تعليمة خاطئة

الخطأ

Error   CS0103     The name 'str' does not exist in the current context  

هذا بسبب أن المتغيرات التي لها نطاق مستوى الدالة أي المعرفة داخل دالة ما، لا يمكن الوصول لها إلا من ضمن نفس الدالة.

مثال:

using System;
namespace VariableScope {
  class Program {

    public void display() {
     string str = "inside method";

      //الوصول للمتغير من ضمن نفس الدالة
      Console.WriteLine(str);
    }

    static void Main(string[] args) {
    Program ps = new Program();
    ps.display();

    Console.ReadLine();
    }
  }
}

الخرج

inside method

هنا، أنشأنا المتغير str ووصلنا له من ضمن نفس الدالة ()display،لذلك البرنامج يعمل بدون أخطاء.

نطاق مستوى البلوك

عندما نعرف متغير داخل بلوك ما مثل (الحلقات التكرارية – if – else ) المتغير يمكن الوصول له من ضمن البلوك نفسه فقط، وهذا ما يعرف بنطاق مستوى البلوك (block level variable scope).

مثال

using System;

namespace VariableScope {
  class Program {
    public void display() {

      for(int i=0;i<=3;i++) {
        	 
      }
    Console.WriteLine(i);
    }

    static void Main(string[] args) {
      Program ps = new Program();
      ps.display();

      Console.ReadLine();
    }
  }
}

في المثال أعلاه، قمنا بتهيئة (تعريف+تمرير قيمة) للمتغير (i) داخل البلوك (حلقة for).

for(int i=0;i<=3;i++) {
       	 
}

بما أن المتغير (i) له نطاق مستوى البلوك، فإذا حاولنا الوصول له من خارج البلوك الخاص به (حلقة for) سوف نحصل على خطأ.

//خارج حلقة for
Console.WriteLine(i);

الخطاأ هو :

Error	 CS0103  The name 'i' does not exist in the current context

الخلاصة

وهكذا نكون قد وصلنا إلى نهاية هذا المقال، والذي تحدثنا فيه عن أنواع نطاق المتغيرات في لغة السي شارب، وكما ذكرنا أمثلة متنتوعة عن نطاق المتغيرات في لغة السي شارب، وفي الختام أتمنى منك عزيزي القارئ أن تشارك في التصويت أدناه، لأنة ذلك يساعدني على معرفة رأيك بالمحتوى، وكما يمكننك إخباري برأيك من خلال التعليق على المقال.

التصويت

[poll id=”17″]

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *