0Pricing
C# Academy · درس

الرياضيات العامة (نظرة عامة) والسمات العامة (عند الحاجة)

حاكِ الرياضيات العامة دون الميزات الحديثة: مرّر موفّر عمليات أو delegates، وقيّد الأنواع بعناية، وحاكِ "السمات العامة" باستخدام معلمات Type.

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

الحساب العام في C# 6

الهدف: اكتب خوارزميات رقمية عامة في C# 6.

  • لا توجد معاملات static abstract على T
  • الحلول البديلة: واجهة ops-provider أو delegates صغيرة
  • بالنسبة إلى السمات، استخدم attributes with Type parameters

نمط موفّر العمليات

وفّر Zero وAdd عبر واجهة. تستدعي الخوارزمية العامة هاتين الطريقتين بدلًا من استخدام + على T.

using System;
using System.Collections.Generic;

public interface INumericOps<T>
{
  T Zero { get; }
  T Add(T a, T b);
}

public sealed class IntOps : INumericOps<int>
{
  public int Zero { get { return 0; } }
  public int Add(int a, int b) { return a + b; }
}

public sealed class DoubleOps : INumericOps<double>
{
  public double Zero { get { return 0.0; } }
  public double Add(double a, double b) { return a + b; }
}

public class Program
{
  static T Sum<T>(IEnumerable<T> items, INumericOps<T> ops)
  {
    T acc = ops.Zero;
    foreach (T x in items) acc = ops.Add(acc, x);
    return acc;
  }

  public static void Main(string[] args)
  {
    int s1 = Sum(new int[] {1,2,3}, new IntOps());
    double s2 = Sum(new double[] {1.5, 2.0}, new DoubleOps());
    Console.WriteLine("Sum int = " + s1);
    Console.WriteLine("Sum double = " + s2);
  }
}

المتوسط باستخدام المساعدات

بالنسبة إلى العمليات التي لا يمكنك التعبير عنها بصورة عامة (مثل القسمة)، مرّر محوّلًا صغيرًا أو delegate إضافيًا.

using System;
using System.Collections.Generic;

public interface INumericOps<T>
{
  T Zero { get; }
  T Add(T a, T b);
}

public sealed class DoubleOps : INumericOps<double>
{
  public double Zero { get { return 0.0; } }
  public double Add(double a, double b) { return a + b; }
}

public class Program
{
  static double Average<T>(IEnumerable<T> items, INumericOps<T> ops, Func<T,double> toDouble)
  {
    T acc = ops.Zero;
    int count = 0;
    foreach (T x in items) { acc = ops.Add(acc, x); count++; }
    if (count == 0) throw new ArgumentException("Empty sequence", "items");
    // convert with a delegate for division
    return toDouble(acc) / count;
  }

  public static void Main(string[] args)
  {
    double avg = Average<double>(new double[] {2.0, 4.0, 6.0}, new DoubleOps(), delegate(double d) { return d; });
    Console.WriteLine("Avg = " + avg);
  }
}

الطي باستخدام delegate

تحافظ Delegates على الحد الأدنى من الشيفرة: مرّر قيمة ابتدائية ودالة دمج. وهذا مناسب للأدوات الصغيرة.

using System;

public class Program
{
  static T Fold<T>(T[] xs, T seed, Func<T,T,T> combine)
  {
    T acc = seed;
    for (int i = 0; i < xs.Length; i++) acc = combine(acc, xs[i]);
    return acc;
  }

  public static void Main(string[] args)
  {
    int sum = Fold<int>(new int[] {1,2,3}, 0, delegate(int a, int b) { return a + b; });
    double sumD = Fold<double>(new double[] {1.5, 2.5}, 0.0, delegate(double a, double b) { return a + b; });
    Console.WriteLine("Sum ints = " + sum);
    Console.WriteLine("Sum doubles = " + sumD);
  }
}

حل بديل للسمات

لا توجد سمات عامة حقيقية في C# 6. مرّر Type إلى السمة للإشارة إلى النوع العام المرتبط.

using System;
using System.Reflection;

// C# 6 cannot declare generic attributes. Workaround: pass a Type.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class ValidatorForAttribute : Attribute
{
  public Type TargetType { get; private set; }
  public ValidatorForAttribute(Type targetType) { TargetType = targetType; }
}

public sealed class Customer { public string Name; }

[ValidatorFor(typeof(Customer))]
public sealed class CustomerValidator
{
  public bool IsValid(Customer c) { return c != null && !string.IsNullOrEmpty(c.Name); }
}

public class Program
{
  public static void Main(string[] args)
  {
    Type t = typeof(CustomerValidator);
    object[] attrs = t.GetCustomAttributes(typeof(ValidatorForAttribute), false);
    if (attrs.Length > 0)
    {
      ValidatorForAttribute a = (ValidatorForAttribute)attrs[0];
      Console.WriteLine("Validator targets: " + a.TargetType.Name);
    }
  }
}

نصائح وخيارات

نصائح:

  • فضّل ops-provider للخوارزميات الرقمية القابلة لإعادة الاستخدام.
  • استخدم delegates للمساعدات الصغيرة (الدمج والتحويل).
  • بالنسبة إلى التعليقات التوضيحية، مرّر Type داخل السمات واقرأه عبر الانعكاس.

حل بديل للحساب العام

تحقّق سريع: في C# 6، ما الطريقة العملية لكتابة Sum عامة من دون الحساب العام الحديث؟

مراجعة

مراجعة: في غياب الحساب العام الحديث، مرّر ops أو delegates إلى خوارزمياتك. وبالنسبة إلى السمات، استخدم سمات تحمل Type واقرأه عبر الانعكاس.

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

هل درس «الرياضيات العامة (نظرة عامة) والسمات العامة (عند الحاجة)» مجاني؟

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

ماذا ستتعلم في «الرياضيات العامة (نظرة عامة) والسمات العامة (عند الحاجة)»؟

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

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

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

كم من الوقت يستغرق درس «الرياضيات العامة (نظرة عامة) والسمات العامة (عند الحاجة)»؟

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

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

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

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

  1. unmanaged وnotnull وnew() (محاكاة C# 6)
  2. الرياضيات العامة (نظرة عامة) والسمات العامة (عند الحاجة)
  3. أدوات عامة قابلة لإعادة الاستخدام
← العودة إلى C# Academy