0Pricing
C# Academy · Pelajaran

Matematika generik (ikhtisar), atribut generik (bila relevan)

Emulasikan matematika generik tanpa fitur modern: teruskan penyedia operasi atau delegate, batasi tipe dengan cermat, dan simulasikan "atribut generik" melalui parameter Type.

Matematika generik (ikhtisar), atribut generik (bila relevan) adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 3 pelajaran total.

Matematika generik pada C# 6

Tujuan: Tulis algoritma numerik secara generik pada C# 6.

  • Tidak ada operator statis abstrak pada T
  • Solusi alternatif: antarmuka penyedia operasi atau delegasi kecil
  • Untuk anotasi, gunakan atribut dengan parameter Type

Pola penyedia operasi

Sediakan nilai nol dan Add melalui sebuah antarmuka. Algoritma generik memanggil metode tersebut alih-alih menggunakan operator + pada 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);
  }
}

Rata-rata dengan pembantu

Untuk operasi yang tidak dapat dinyatakan secara generik, seperti pembagian, berikan konverter kecil atau delegasi tambahan.

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);
  }
}

Pelipatan berbasis delegasi

Delegasi membuatnya tetap minimal: berikan nilai awal dan fungsi penggabungan. Cocok untuk utilitas kecil.

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);
  }
}

Solusi alternatif atribut

C# 6 tidak memiliki atribut generik yang sesungguhnya. Berikan Type kepada atribut untuk menunjukkan tipe generik terkait.

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);
    }
  }
}

Kiat & pilihan

Kiat:

  • Utamakan penyedia operasi untuk algoritma numerik yang dapat digunakan kembali.
  • Gunakan delegasi untuk pembantu kecil (menggabungkan, mengonversi).
  • Untuk anotasi, berikan Type dalam atribut dan baca melalui refleksi.

Solusi alternatif matematika generik

Pemeriksaan cepat: Dalam C# 6, apa cara praktis untuk menulis penjumlahan generik untuk T tanpa matematika generik modern?

Ringkasan

Ringkasan: Tanpa matematika generik modern, berikan operasi atau delegasi kepada algoritma Anda. Untuk anotasi, gunakan atribut yang membawa Type dan bacalah melalui refleksi.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Matematika generik (ikhtisar), atribut generik (bila relevan)” gratis?

Ya — teks lengkap “Matematika generik (ikhtisar), atribut generik (bila relevan)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 3 pelajaran total.

Apa yang akan aku pelajari di “Matematika generik (ikhtisar), atribut generik (bila relevan)”?

Emulasikan matematika generik tanpa fitur modern: teruskan penyedia operasi atau delegate, batasi tipe dengan cermat, dan simulasikan "atribut generik" melalui parameter Type. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 3.

Berapa lama pelajaran “Matematika generik (ikhtisar), atribut generik (bila relevan)” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. unmanaged, notnull, new() (emulasi C# 6)
  2. Matematika generik (ikhtisar), atribut generik (bila relevan)
  3. Utilitas generik yang dapat digunakan ulang
← Kembali ke C# Academy