سي#.نت 3.5:ما هو التعبير<> المستخدم؟
-
07-07-2019 - |
سؤال
ما هو بالضبط التعبير<> المستخدم في C#؟هل هناك أي سيناريوهات حيث يمكنك إنشاء مثيل Expression<> بنفسك ككائن؟إذا كان الأمر كذلك، يرجى إعطاء مثال!
شكرًا لك!
المحلول
Expression<T>
يتم استخدامه بالكامل تقريبًا لـ LINQ، لكنه لا يفعل ذلك يملك يكون.في LINQ، يتم استخدامه عادةً "لالتقاط" المنطق المعبر عنه في التعليمات البرمجية، مع الاحتفاظ به في البيانات.يمكن بعد ذلك فحص هذه البيانات بواسطة موفر LINQ والتعامل معها بشكل مناسب - على سبيل المثال.عن طريق تحويله إلى SQL.عادةً ما يتم إنشاء أشجار التعبير في LINQ بواسطة المترجم من تعبيرات lambda أو تعبيرات الاستعلام - ولكن في حالات أخرى قد يكون من السهل استخدام واجهة برمجة التطبيقات بنفسك مباشرةً.
بعض الأمثلة على الأماكن الأخرى التي استخدمتها وشاهدتها تستخدم:
- في MiscUtil, ، استخدمه مارك جرافيل لتنفيذ "الحساب العام" - إذا كان النوع يحتوي على عامل التشغيل ذي الصلة، فيمكن استخدامه بشكل عام.
- في ميلودي غير مقيد لقد استخدمتها بطريقة مشابهة لإجراء عمليات على تعدادات العلامات، بغض النظر عن نوعها الأساسي (وهو أمر أكثر تعقيدًا مما قد تتوقعه، نظرًا لـ
long
وulong
لها نطاقات مختلفة) - في لينك المرئي لقد استخدمت تعبيرات الاستعلام "لتحريك" LINQ، حتى تتمكن من رؤية ما يحدث.في حين أنه من الواضح أن هذا هو استخدام LINQ، إلا أنه ليس الشكل التقليدي لترجمة المنطق إلى نموذج آخر.
نصائح أخرى
فيما يتعلق بـ LINQ، هناك أشياء يمكنك القيام بها لإنشاء استعلامات LINQ أكثر تنوعًا في وقت التشغيل مما يمكنك فعله في lambdas فقط.
لقد استخدمت Expression
عدة مرات كمترجم صغير، كبديل لـ DynamicMethod
وايل.يصبح هذا الأسلوب أقوى في .NET 4.0 (كما تمت مناقشته في InfoQ)، ولكن حتى في 3.5 هناك الكثير من الأشياء التي يمكنك القيام بها (تعتمد بشكل عام على بيانات وقت التشغيل؛التكوين الخ):
- عوامل التشغيل العامة
- استنساخ الكائن
- التهيئة المعقدة
- مقارنة الكائنات
لقد استخدمته أيضًا كجزء من محرك رياضيات لبعض الأعمال التي قمت بها مع Microsoft - على سبيل المثال.تحليل تعبير رياضي ("(x + 12) * y = z" إلخ) إلى an Expression
الشجرة، قم بتجميعها وتشغيلها.
استخدام آخر مثير للاهتمام (يوضحه جيسون بوك، هنا) في البرمجة الجينية؛بناء المرشحين الخاص بك كما Expression
الأشجار، ولديك التعليمات البرمجية اللازمة لتنفيذها بسرعة (بعد Compile()
)، ولكن الأهم (بالنسبة للبرمجة الجينية)، هو أيضًا تبادل الأجزاء.
ونلقي نظرة على بلدي قبل وبعد التعليمات البرمجية في جوابي ل آخر السؤال SO .
وملخص: Expression<>
تبسيطها إلى حد كبير رمز، جعلها أسهل للفهم، وحتى إصلاح الخلل الوهمية