المتغيرات المحلية ذات النوع المُختار ضمنياً (دليل البرمجة لـ #C)

يمكن منح المتغيرات المحلية نوع يتم الاستدلال عليه باستخدام var بدلاً من نوع صريح. ترشد الكلمة الأساسية var برنامج التحويل البرمجي على الاستدلال على نوع المتغير من التعبير الموجود على الجانب الأيمن من عبارة التهيئة. قد يكون نوع المُستدل نوعاً مضمناً أو نوع مجهول أو نوع معرّف من قبل المستخدم أو نوع مُعرف في مكتبة فئات .NET Framework. لمزيد من المعلومات حول كيفية تهيئة الصفائف باستخدام var، راجع الصفائف ذات النوع الضمني (دليل البرمجة لـ #C).

تبين الأمثلة التالية طرق متنوعة يتم تعريف فيها متغيرات محلية باستخدام var:

// i is compiled as an int
var i = 5;

// s is compiled as a string
var s = "Hello";

// a is compiled as int[]
var a = new[] { 0, 1, 2 };

// expr is compiled as IEnumerable<Customer>
// or perhaps IQueryable<Customer>
var expr =
    from c in customers
    where c.City == "London"
    select c;

// anon is compiled as an anonymous type
var anon = new { Name = "Terry", Age = 34 };

// list is compiled as List<int>                             
var list = new List<int>();

مهم جداًّ فهم أن الكلمة الأساسية var لا تعني متغير (variant) و لا تشير إلى أن المتغير ذو نوع ضعيف أو يتم ضمة متأخراً. إنما تعني فقط أن المحول البرمجي يحدد ويقوم بتعيين النوع الأكثر ملاءمة.

يمكن استخدام الكلمة الأساسية var في السياقات التالية:

  • في المتغيرات المحلية (المتغيرات التي تم تعريفها في نطاق الأسلوب) كما هو موضح في المثال السابق.

  • في عبارة تهيئة for.

    for(var x = 1; x < 10; x++)
    
  • في عبارة تهيئة foreach.

    foreach(var item in list){...}
    
  • في عبارة using

    using (var file = new StreamReader("C:\\myfile.txt")) {...}
    

لمزيد من المعلومات، راجع كيفية القيام بما يلي: استخدام الكتابة الضمنية للمتغير المحلي و الصفائف في تعبير الاستعلام ( برمجة الدليل C# ).

أنواع var والأنواع المجهولة

في معظم الحالات استخدام var اختياري وهو ملاءمة نحوياً فقط. ومع ذلك، عند تهيئة متغير بنوع مجهول يجب تصريح المتغير كـ var إن كنت بحاجة إلى الوصول إلى خصائص الكائن في وقتٍ لاحق. هذا سيناريو شائع في تعبيرات الاستعلام LINQ. لمزيد من المعلومات، راجع الأنواع المجهولة (ارشادات برمجة C#).

من منظور تعليماتك البرمجية للمصدر، ليس للنوع المجهول اسم. لذلك، إذا تم تهيئة متغير استعلام بـ var فإن الطريقة الوحيدة للوصول إلى الخصائص في سلسلة الكائنات التي يتم إرجاعها هو استخدام var كنوع متغير التكرار في عبارة foreach.

class ImplicitlyTypedLocals2
{
    static void Main()
    {
        string[] words = { "aPPLE", "BlUeBeRrY", "cHeRry" };

        // If a query produces a sequence of anonymous types, 
        // then use var in the foreach statement to access the properties.
        var upperLowerWords =
             from w in words
             select new { Upper = w.ToUpper(), Lower = w.ToLower() };

        // Execute the query
        foreach (var ul in upperLowerWords)
        {
            Console.WriteLine("Uppercase: {0}, Lowercase: {1}", ul.Upper, ul.Lower);
        }
    }
}
/* Outputs:
    Uppercase: APPLE, Lowercase: apple
    Uppercase: BLUEBERRY, Lowercase: blueberry
    Uppercase: CHERRY, Lowercase: cherry        
 */

ملاحظات

تنطبق القيود التالية على تعريفات المتغيرات ذات النوع الضمني:

  • يمكن استخدام var فقط عند تعريف متغير محلي وتهيئته في نفس العبارة; لا يمكن تهيئة المتغير بقيمة null أو بمجموعة أساليب أو بدالة مجهولة.

  • لا يمكن استخدام var على الحقول التي في نطاق الفئة.

  • المتغيرات التي تم تصريحها باستخدام var لا يمكن استخدامها في تعبير التهيئة. بمعنى آخر، هذا تعبير صالح : int i = (i = 20); but this expression وينتج عنه خطأ في وقت الترجمة: var i = (i = 20);

  • لا يمكن تهيئة عدة متغيرات ذات نوع ضمني في نفس العبارة.

  • إذا كان نوع باسم var في النطاق، فسيتم تحليل الكلمة الأساسية var إلى ذلك النوع ولن تتم معاملته كجزء من تعريف متغير محلي ذا نوع ضمني.

قد تجد أن var يمكن أن تكون مفيده في تعبيرات الاستعلام حينما يكون من الصعب تحديد نوع متغير الاستعلام. يمكن أن يحدث هذا في عمليات التجميع والترتيب.

يمكن أن تكون الكلمة الأساسية var مفيدة أيضاً عندما يكون نوع المتغير شاق الكتابة في لوحة المفاتيح، أو واضح أو لا يضيف سهولة في قابلية القراءة للتعليمات البرمجية. أحد الأمثلة التي تكون فيها var مفيدة في هذه الطريقة يكون في الأنواع العامة المتداخلة مثل تلك المستخدمة في عمليات المجموعات. في الاستعلام التالي نوع متغير الاستعلام هو IEnumerable<IGrouping<string, Student>>. طالما أنت والآخرين الذين يحافظون على التعليمات البرمجية يفهمون هذا, ليست هناك مشكلة مع استخدام النوع الضمني للملاءمة والإيجاز.

// Same as previous example except we use the entire last name as a key.
// Query variable is an IEnumerable<IGrouping<string, Student>>
 var studentQuery3 =
     from student in students
     group student by student.Last;

على الرغم من ذلك، استخدام var يجعل تعليماتك البرمجية صعبة الفهم للمطورين الآخرين. لهذا السبب، تستخدم وثائق #C بشكل عام var فقط عندما يكون مطلوباً.

راجع أيضًا:

المهام

كيفية القيام بما يلي: استخدام الكتابة الضمنية للمتغير المحلي و الصفائف في تعبير الاستعلام ( برمجة الدليل C# )

المرجع

الصفائف ذات النوع الضمني (دليل البرمجة لـ #C)

الأنواع المجهولة (ارشادات برمجة C#)

مهيآت الكائنات والمجموعات (دليل البرمجة لـ #C)

var (C# مرجع)

عن (C# مرجع)

foreach في ( مرجع C# )

عبارة using (مرجع #C)

المبادئ

LINQ استعلام التعبيرات (C# البرمجة الدليل)

موارد أخرى

مرجع C#‎

مكون Language-Integrated Query (LINQ)