سؤال

ما هو بالضبط التعبير<> المستخدم في 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<> تبسيطها إلى حد كبير رمز، جعلها أسهل للفهم، وحتى إصلاح الخلل الوهمية

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