dynamic (مرجع #C)

يمكّن النوع dynamic العمليات التي يحدث بها من تجاوز التحقق من النوع في وقت التحويل البرمجي. بدلاً من ذلك، يتم حل هذه العمليات في وقت التشغيل. يقوم النوع بتسهيل الوصول إلى واجهات برمجة تطبيقات COM مثل Office Automation APIs وأيضاً إلى واجهات برمجة التطبيقات الحيوية مثل مكتبات IronPython وإلى طراز كائن مستند HTML (DOM).

يسلك النوع dynamic سلوك النوع object في معظم الحالات. على الرغم من ذلك، العمليات التي تحتوي على تعبيرات من النوع dynamic لا يتم حلها أو التحقق من نوعها من قبل المحول البرمجي. يحزم المحول البرمجي معلومات حول العملية ويتم استخدام هذه المعلومات لاحقا لتقييم العملية في وقت التشغيل. كجزء من العملية يتم ترجمة المتغيرات التي تكون من النوع dynamic إلى متغيرات من النوع object. لذلك، النوع dynamic يُوجد في وقت التحويل البرمجي فقط وليس في وقت تشغيل.

يغير المثال التالي متغير من نوع dynamic إلى متغير من نوع object. للتحقق من نوع كل متغير في وقت التحويل البرمجي ضع مؤشر الماوس فوق dyn أو obj في عبارات WriteLine. يعرض IntelliSense dynamic لـ dyn و object لـ obj.

class Program
{
    static void Main(string[] args)
    {
        dynamic dyn = 1;
        object obj = 1;

        // Rest the mouse pointer over dyn and obj to see their
        // types at compile time.
        System.Console.WriteLine(dyn.GetType());
        System.Console.WriteLine(obj.GetType());
    }
}

تعرض عبارات الـ WriteLine أنواع وقت التشغيل لـ dyn و obj. عند هذه النقطة كلاهما من نفس النوع، عدد صحيح (integer). يتم إنشاء المخرجات التالية:

System.Int32

System.Int32

لمعرفة الفرق بين dyn و obj في وقت التحويل البرمجي، أضف السطرين التاليين بين التعريفات وعبارات الـ WriteLine في المثال السابق.

dyn = dyn + 3;
obj = obj + 3;

يتم تقرير خطأ برمجي لمحاولة إضافة عدد صحيح وكائن في التعبير obj + 3. ومع ذلك، لا يتم تقرير خطأ في dyn + 3. لا يتم التحقق من التعبير الذي يحتوي على dyn في وقت التحويل البرمجي لأن نوع dyn هو dynamic.

Context

يمكن للكلمة الأساسية dynamic أن تظهر مباشرةً أو كمكون من نوع مُنشأ في الحالات التالية:

  • في التعريفات كنوع خاصية أو حقل أو مفهرس أو معلمة أو قيمة إرجاع أو متغير محلي أو قيد نوع. تعريف الفئة التالي يستخدم dynamic في العديد من التصريحات المختلفة.

    class ExampleClass
    {
        // A dynamic field.
        static dynamic field;
    
        // A dynamic property.
        dynamic prop { get; set; }
    
        // A dynamic return type and a dynamic paramater type.
        public dynamic exampleMethod(dynamic d)
        {
            // A dynamic local variable.
            dynamic local = "Local variable";
            int two = 2;
    
            if (d is int)
            {
                return local;
            }
            else
            {
                return two;
            }
        }
    }
    
  • في تحويل النوع الصريح كنوع الهدف لإجراء التحويل.

    static void convertToDynamic()
    {
        dynamic d;
        int i = 20;
        d = (dynamic)i;
        Console.WriteLine(d);
    
        string s = "Example string.";
        d = (dynamic)s;
        Console.WriteLine(d);
    
        DateTime dt = DateTime.Today;
        d = (dynamic)dt;
        Console.WriteLine(d);
    
    }
    // Results:
    // 20
    // Example string.
    // 2/17/2009 9:12:00 AM
    
  • في أي سياق حيث تعمل الأنواع كالقيم مثل على الجانب الأيمن من عامل التشغيل is أو عامل التشغيل as أو كوسيطة لـ typeof كجزء من نوع مُنشأ. على سبيل المثال، يمكن استخدام dynamic في التعبيرات التالية.

    int i = 8;
    dynamic d;
    // With the is operator.
    // The dynamic type behaves like object. The following
    // expression returns true unless someVar has the value null.
    if (someVar is dynamic) { }
    
    // With the as operator.
    d = i as dynamic;
    
    // With typeof, as part of a constructed type.
    Console.WriteLine(typeof(List<dynamic>));
    
    // The following statement causes a compiler error.
    //Console.WriteLine(typeof(dynamic));
    

مثال

يستخدم المثال التالي dynamic في العديد من التعريفات. يغير الأسلوب Main عملية التحقق من النوع في وقت التحويل البرمجي إلى عملية التحقق من النوع في وقت التشغيل.

using System;

namespace DynamicExamples
{
    class Program
    {
        static void Main(string[] args)
        {
            ExampleClass ec = new ExampleClass();
            Console.WriteLine(ec.exampleMethod(10));
            Console.WriteLine(ec.exampleMethod("value"));

            // The following line causes a compiler error because exampleMethod
            // takes only one argument.
            //Console.WriteLine(ec.exampleMethod(10, 4));

            dynamic dynamic_ec = new ExampleClass();
            Console.WriteLine(dynamic_ec.exampleMethod(10));

            // Because dynamic_ec is dynamic, the following call to exampleMethod
            // with two arguments does not produce an error at compile time.
            // However, itdoes cause a run-time error. 
            //Console.WriteLine(dynamic_ec.exampleMethod(10, 4));
        }
    }

    class ExampleClass
    {
        static dynamic field;
        dynamic prop { get; set; }

        public dynamic exampleMethod(dynamic d)
        {
            dynamic local = "Local variable";
            int two = 2;

            if (d is int)
            {
                return local;
            }
            else
            {
                return two;
            }
        }
    }
}
// Results:
// Local variable
// 2
// Local variable

لمزيد من المعلومات والأمثلة ، انظراستخدام نوع الحيوي (C# "برمجة" إرشادات) .

راجع أيضًا:

المهام

كيفية القيام بما يلي: التحويل بأمان عن طريق عوامل التشغيل as و is (دليل البرمجة لـ #C)

المرجع

object (مرجع #C)

is (مرجع #C)

as (مرجع #C)

typeof ( مرجع #C )

System.Dynamic.ExpandoObject

System.Dynamic.DynamicObject

موارد أخرى

استخدام نوع الحيوي (C# "برمجة" إرشادات)

الإرشادات التفصيلية: إنشاء ثم استخدام الكائنات الديناميكية(C# و Visual Basic)