لا جديد 'الحيوية' C# 4.0 الكلمة استنكر فار الكلمة ؟

StackOverflow https://stackoverflow.com/questions/298277

  •  08-07-2019
  •  | 
  •  

سؤال

عندما C# 4.0 يخرج علينا ديناميكية الكلمة كما هو موضح في هذا عرض ممتاز من أندرس هيلسبرغ, و (ج# تتطور أسرع مما كنت يمكن أن تبقي..لم يكن لدي الكثير من الوقت للتعرف نفسي مع var)

كنت لا تزال بحاجة فار الكلمة ؟ هل هناك أي شيء فار يمكن أن تفعل..هذه الدينامية لا ؟

var x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x

dynamic x = SomeFunctionThatIKnowReturnsSomeKindOfList();
// do something with x
هل كانت مفيدة؟

المحلول

لا أنهم مختلفة جدا.

var يعني "الاستدلال على نوع المتغير في وقت التحويل البرمجي" - ولكن لا يزال تماما ثابت ملزمة.

dynamic يعني "افترض أنني يمكن أن تفعل أي شيء تريده مع هذا المتغير" - أيالمترجم لا يعرف ما هي العمليات المتاحة ، DLR العمل بها ما المكالمات حقا يعني في وقت التنفيذ.

أتوقع أن استخدام dynamic نادرا جدا - فقط عندما كنت تريد حقا السلوك الديناميكي:

  • var يتيح لك التقاط الأخطاء المطبعية وغيرها في وقت التحويل البرمجي
  • ثابت لا بد رمز إلى تشغيل أسرع من حيوي لا بد رمز (حتى لو كان الفرق يصبح صغيرا)
  • ثابت لا بد رمز يعطي المزيد من وقت التحويل البرمجي دعم أبعد من مجرد أخطاء:يمكنك أن تجد دعوة الهرمية ، إعادة بيع ديون سوف تعمل على نحو أفضل ، التحسس هو متاح وما إلى ذلك

نصائح أخرى

ديناميكية و فار تمثل أفكار مختلفة.

فار

فار أساسا يسأل المترجم إلى معرفة نوع المتغير على أساس التعبير على الجانب الأيمن من العبارة المهمة.المتغير ثم علاجها تماما كما لو كان أعلن صراحة كنوع من التعبير.على سبيل المثال ما يلي اثنين من البيانات أي ما يعادل

var a = "foo";
string a = "foo";

مفتاح يسلب هنا هو أن "فار" 100% نوع آمنة و هو ترجمة عملية وقت

ديناميكية

ديناميكية في العديد من الطرق عكس فار.باستخدام ديناميكية أساسا القضاء على كل نوع سلامة ثيت متغير معين.ومن نواح كثيرة ليس لديها أي نوع.عند استدعاء الأسلوب أو الميدانية على متغير, تقرير عن كيفية استدعاء هذا المجال يحدث في وقت التشغيل.على سبيل المثال

dynamic d = SomeOperation();
d.Foo(); // Will this fail or not?  Won't know until you run the program

مفتاح يسلب هنا هو أن "ديناميكية" ليس من النوع الآمن هو وقت العملية

نعم سوف لا تزال بحاجة فار:

فار هو متغير الذي هو نوع سوف يكون الاستدلال من قبل المترجم.
ديناميكية سوف يكون لها نوع تعيين في وقت التشغيل

لذلك:

Var i = "Hello World"

سوف يكون لها نوع الاستدلال بها نوع السلسلة في القيام بذلك intellisence سوف تعطيك كل أساليب هذه السلسلة يمكن استخدام مثل ،

i.Split("/")

حيث:

dynamic i = "Hello World"

لن يكون لها نوع الاستدلال حتى وقت التشغيل لأن مترجم ممتلئا لا تعرف ما هو نوع من ذلك بعد, ولكن سوف لا تزال تسمح لك القيام به:

i.Split("/")

ولكن عندما يدعو الطريقة التي كنت في حاجة إليها قد تفشل بسبب نوع الخطأ وطريقة أليس هناك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top