0Pricing
C# Academy · درس

ما أشجار التعبيرات؟

افهموا الشيفرة الممثّلة على هيئة بنية بيانات

ما أشجار التعبيرات؟ درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

التعليمات البرمجية بوصفها بيانات

تمثّل شجرة التعبيرات التعليمات البرمجية في صورة بنية بيانات يمكنكم فحصها أثناء التشغيل، بدلًا من تعليمات مُجمَّعة لا يمكنكم إلا تشغيلها. وتمثّلها C# باستخدام Expression<TDelegate>.

Lambda إلى Delegate مقارنةً بالشجرة

عند إسناد lambda إلى Func<...> تحصلون على تعليمات برمجية قابلة للتشغيل. أما عند إسناد lambda نفسها إلى Expression<Func<...>>، فينشئ المصرّف شجرة تصفها.

using System;
using System.Linq.Expressions;

Func<int, int> runnable = x => x + 1;          // compiled delegate
Expression<Func<int, int>> tree = x => x + 1;  // data structure

Console.WriteLine(runnable(5));   // 6
Console.WriteLine(tree);          // x => (x + 1)

فحص الشجرة

بما أنها بيانات، يمكنكم قراءة أجزاء شجرة التعبيرات، مثل معلماتها وجسمها ونوع عقدتها.

using System;
using System.Linq.Expressions;

Expression<Func<int, int>> tree = x => x + 1;
Console.WriteLine(tree.Parameters[0].Name); // x
Console.WriteLine(tree.Body.NodeType);      // Add
Console.WriteLine(tree.ReturnType);         // System.Int32

التسلسل الهرمي للتعبيرات

تشتق كل عقدة من System.Linq.Expressions.Expression. ومن الأنواع الشائعة BinaryExpression وParameterExpression وConstantExpression وMethodCallExpression.

using System;
using System.Linq.Expressions;

Expression<Func<int, int>> tree = x => x + 1;
var body = (BinaryExpression)tree.Body;
Console.WriteLine(body.Left);  // x
Console.WriteLine(body.Right); // 1

يُسمح فقط بتعبيرات lambda

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

using System;
using System.Linq.Expressions;

Expression<Func<int, int>> ok = x => x * 2;    // fine
// Expression<Func<int,int>> bad = x => { return x*2; }; // compile error
Console.WriteLine(ok); // x => (x * 2)

سبب الأهمية

تتيح أشجار التعبيرات للمكتبات فهم التعليمات البرمجية، وليس تشغيلها فحسب. إذ يترجمها موفرو LINQ إلى SQL أو استعلامات ديناميكية أو أهداف أخرى.

يحدد NodeType العملية

تكون الخاصية NodeType قيمة من التعداد ExpressionType تحدد العملية الموجودة عند تلك العقدة.

using System;
using System.Linq.Expressions;

Expression<Func<int, bool>> tree = x => x > 10;
Console.WriteLine(tree.Body.NodeType); // GreaterThan

الثوابت والمعلمات

يمثّل ParameterExpression إدخالًا، بينما يحتفظ ConstantExpression بقيمة حرفية مضمنة في التعليمات البرمجية.

using System;
using System.Linq.Expressions;

Expression<Func<int, int>> tree = x => x + 5;
var body = (BinaryExpression)tree.Body;
Console.WriteLine(body.Left.GetType().Name);  // ParameterExpression (or TypedParameterExpression)
Console.WriteLine(((ConstantExpression)body.Right).Value); // 5

استدعاءات الأساليب في الأشجار

تتحول lambda التي تستدعي أسلوبًا إلى MethodCallExpression، الذي يتيح الوصول إلى الأسلوب ومعاملاته.

using System;
using System.Linq.Expressions;

Expression<Func<string, int>> tree = s => s.Length;
// member access here; a call example:
Expression<Func<string, string>> call = s => s.ToUpper();
var mc = (MethodCallExpression)call.Body;
Console.WriteLine(mc.Method.Name); // ToUpper

الأشجار غير قابلة للتغيير

أشجار التعبيرات غير قابلة للتغيير. ولتغيير إحداها، تنشئون شجرة جديدة من أجزائها، وهذه هي الطريقة التي تعمل بها الزائرون ومعيدو الكتابة.

تجميع المفاهيم

نفحص هنا شجرة predicate صغيرة من البداية إلى النهاية: المعلمة والعامل والثابت.

using System;
using System.Linq.Expressions;

Expression<Func<int, bool>> isAdult = age => age >= 18;
var body = (BinaryExpression)isAdult.Body;
Console.WriteLine(isAdult.Parameters[0].Name);          // age
Console.WriteLine(body.NodeType);                       // GreaterThanOrEqual
Console.WriteLine(((ConstantExpression)body.Right).Value); // 18

اختبار سريع

تأكدوا مما يميز شجرة التعبيرات.

مراجعة

تعلّمتم ماهية أشجار التعبيرات.

  • يمثّل Expression<TDelegate> التعليمات البرمجية في صورة بيانات قابلة للفحص.
  • تشمل العقد المعلمات والثوابت والعمليات الثنائية واستدعاءات الأساليب.
  • تُقبل lambdas ذات التعبير الواحد فقط.
  • الأشجار غير قابلة للتغيير؛ وإعادة الكتابة تنشئ أشجارًا جديدة.

الأسئلة الشائعة

هل درس «ما أشجار التعبيرات؟» مجاني؟

نعم — نص درس «ما أشجار التعبيرات؟» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «ما أشجار التعبيرات؟»؟

افهموا الشيفرة الممثّلة على هيئة بنية بيانات تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «ما أشجار التعبيرات؟»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ما أشجار التعبيرات؟
  2. إنشاء التعبيرات يدويًا
  3. ترجمة التعبيرات وتنفيذها
  4. أشجار التعبيرات في موفّري LINQ
← العودة إلى C# Academy