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

Visual C# 2010يقدم جديد نوع،dynamic. النوع هو نوع ثابت، ولكن كائن من نوع dynamicتجاوز يتم الآن التدقيق من نوع ثابت. في معظم الحالات، عمله كما يحتوي على نوع object. في وقت التحويل البرمجي، عنصر التي هو كتابته ك dynamicهو ومن المفترض أن تدعم أي عملية. ولذلك، لم يكن إلى تكون قلقا بشأن ما إذا كانت قيمتها يحصل الكائن من API COM من لغة حيوية مثل IronPython، من HTML مستند طراز كائن (DOM)، من انعكاس أو من مكان آخر في البرنامج. ومع ذلك، إذا كانت التعليمة البرمجية هو غير صالح، أخطاء يتم حظر أثناء وقت التشغيل.

على سبيل المثال، إذا كان مثيل الأسلوب exampleMethod1في التعليمة البرمجية التالية يحتوي على معلمة واحدة فقط، يتعرف على المحول البرمجي الذي استدعاء الأسلوب، أول ec.exampleMethod1(10, 4)، هو غير صالح لأنه يحتوي على الوسيطات الثاني. يؤدي الاستدعاء خطأ في المحول البرمجي. استدعاء الأسلوب، الثاني dynamic_ec.exampleMethod1(10, 4)، غير محدد بواسطة المحول البرمجي لأن نوع من dynamic_ecهو dynamic. ولذلك، لا يوجد خطأ المترجم هو الذي تم الإعلام عنه. على الرغم من ذلك، الخطأ عدم الهروب إشعار أجل غير مسمى. هو حظر في وقت التشغيل ويتسبب في حدوث استثناء وقت التشغيل.

static void Main(string[] args)
{
    ExampleClass ec = new ExampleClass();
    // The following line causes a compiler error if exampleMethod1 has only
    // one parameter.
    //ec.exampleMethod1(10, 4);

    dynamic dynamic_ec = new ExampleClass();
    // The following line is not identified as an error by the
    // compiler, but it causes a run-time exception.
    dynamic_ec.exampleMethod1(10, 4);

    // The following calls also do not cause compiler errors, whether 
    // appropriate methods exist or not.
    dynamic_ec.someMethod("some argument", 7, null);
    dynamic_ec.nonexistentMethod();
}
class ExampleClass
{
    public ExampleClass() { }
    public ExampleClass(int v) { }

    public void exampleMethod1(int i) { }

    public void exampleMethod2(string str) { }
}

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

نتيجة للعمليات الأكثر حيوية هو نفسه dynamic. على سبيل المثال، إذا قمت بوضع مؤشر ماوس عبر استخدم testSumفي المثال التالي، يعرض التحسس الذكي النوع testSum ديناميكي (متغير محلي) .

dynamic d = 1;
var testSum = d + 3;
// Rest the mouse pointer over testSum in the following statement.
System.Console.WriteLine(testSum);

العمليات التي تكون النتيجة غير dynamicتضمين تحويلات من dynamicإلى نوع آخر، واستدعاء المنشئ التي تضمين وسائط نوع dynamic. على سبيل المثال، نوع من testInstanceفي تصريح التالي هو ExampleClass، وليس dynamic.

var testInstance = new ExampleClass(d);

تحويل أمثلة المبينة في القسم التالي، "تحويلات."

التحويلات

عمليات التحويل بين الكائنات ديناميكي و أنواع غير ذلك بسهولة. يتيح ذلك المطور إلى التبديل بين سلوك ديناميكي وغير الحيويين.

أي كائن يمكن تحويله إلى نوع ديناميكي ضمنياً، كـ هو مبين في الأمثلة التالية.

dynamic d1 = 7;
dynamic d2 = "a string";
dynamic d3 = System.DateTime.Today;
dynamic d4 = System.Diagnostics.Process.GetProcesses();

وعلى العكس، تحويل ضمني يمكن ديناميكياً تطبيق إلى أي تعبير من نوع dynamic.

int i = d1;
string str = d2;
DateTime dt = d3;
System.Diagnostics.Process[] procs = d4;

زيادة التحميل دقة مع وسائط من نوع حيوي

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

// Valid.
ec.exampleMethod2("a string");

// The following statement does not cause a compiler error, even though ec is not
// dynamic. A run-time exception is raised because the run-time type of d1 is int.
ec.exampleMethod2(d1);
// The following statement does cause a compiler error.
//ec.exampleMethod2(7);

وقت تشغيل اللغة الحيوية

الحيوي اللغة وقت التشغيل (DLR) هو واجهة برمجة تطبيقات جديدة في .NET Framework 4. ويوفر infrكـtructure يدعم dynamicاكتب في C#، وأيضا تطبيق لغات البرمجة الديناميكية مثل كـ IronPython و IronRuby. لمزيد من المعلومات حول DLR راجع نظرة عامة حيوية وقت تشغيل اللغة.

توافق COM

Visual C# 2010يتضمن العديد من الميزات التي تقوم بتحسين interoperating مع COM API مثل كـ التنفيذ التلقائي المكتب واجهات برمجة التطبيقات. بين التحسينات هي استخدم dynamicنوع، ومن المسمى و اختياري الوسائط .

السماح للتباين في أنواع وسيطة العديد من وظائف COM وإرجاع نوع بتعيين أنواع كـ object. يحتوي هذا necessitated واضحة النوع قيم إلى إحداثي مع المتغيرات مكتوب بشدة في C#. إذا قمت بتجميع باستخدام / (خيارات المحول البرمجي #C)خيار المقدمة dynamicيمكنك نوع من التعامل مع التكرارات objectفي التواقيع COM كما لو كانت من النوع dynamic، و وبالتالي لتجنب كثير من النوع. على سبيل المثال، تباين العبارات التالية كيف يمكنك الوصول إلى أية خلية في جدول بيانات Excel Microsoft المكتب 2010 Suite مع dynamicنوع و دون dynamicالنوع.

// Before the introduction of dynamic.
((Excel.Range)excelApp.Cells[1, 1]).Value2 = "Name";
Excel.Range range2008 = (Excel.Range)excelApp.Cells[1, 1];
// After the introduction of dynamic, the access to the Value property and
// the conversion to Excel.Range are handled by the run-time COM binder.
excelApp.Cells[1, 1].Value = "Name";
Excel.Range range2010 = excelApp.Cells[1, 1];

مواضيع ذات صلة

Title

الوصف

dynamic (مرجع #C)

تتناول هذه المقالة الاستخدام dynamicالكلمة الأساسية.

نظرة عامة حيوية وقت تشغيل اللغة

توفير نظرة عامة حول DLR، الذي هو بيئة وقت تشغيل بإضافة التعيين من الخدمات للغات ديناميكي إلى وقت تشغيل اللغة العامة (CLR).

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

توفير الإرشادات خطوة بخطوة لإنشاء كائن حيوي مخصص و لإنشاء مشروع يصل إلى على IronPythonمكتبة.

كيفية القيام بما يلي: الوصول إلى كائنات Office Interop باستخدام ميزات Visual #C 2010 (دليل برمجة C# )

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