Genel matematik (genel bakış) ve genel öznitelikler (gerektiğinde)
Modern özellikler olmadan genel matematiği öykünün: bir işlem sağlayıcısı veya delegate'ler aktarın, türleri dikkatle kısıtlayın ve "genel öznitelikleri" Type parametreleriyle benzetin.
Genel matematik (genel bakış) ve genel öznitelikler (gerektiğinde), CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 3 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 3 dersten oluşur.
C# 6'da genel türlerle matematik
Hedef: C# 6'da sayısal algoritmaları genel türlerle yazmak.
- T üzerinde statik soyut işleçler yoktur
- Geçici çözümler: işlem sağlayıcı arayüzü veya küçük temsilciler
- Açıklamalar için Type parametreli öznitelikler kullanınız
İşlem sağlayıcı deseni
Bir arayüz aracılığıyla Sıfır ve Add sağlayınız. Genel algoritma, T üzerinde + kullanmak yerine bu yöntemleri çağırır.
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);
}
}
Yardımcılarla ortalama
Bölme gibi genel türlerle ifade edemediğiniz işlemler için küçük bir dönüştürücü veya ek bir temsilci geçiriniz.
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);
}
}
Temsilci tabanlı katlama
Temsilciler yaklaşımı yalın tutar: bir başlangıç değeri ve birleştirme işlevi geçiriniz. Küçük yardımcılar için uygundur.
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);
}
}
Öznitelik geçici çözümü
C# 6'da gerçek genel tür öznitelikleri yoktur. İlgili genel türü belirtmek için özniteliğe bir Type geçiriniz.
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);
}
}
}
İpuçları ve seçimler
İpuçları:
- Yeniden kullanılabilir sayısal algoritmalar için bir işlem sağlayıcıyı tercih ediniz.
- Küçük yardımcılar (birleştirme, dönüştürme) için temsilciler kullanınız.
- Açıklamalar için özniteliklerde Type geçiriniz ve bunu yansıma yoluyla okuyunuz.
Genel matematik geçici çözümü
Özet
Özet: Modern genel tür matematiği olmadan algoritmalarınıza işlemler veya temsilciler geçiriniz. Açıklamalar için bir Type taşıyan öznitelikler kullanınız ve bu türü yansıma yoluyla okuyunuz.
Sıkça Sorulan Sorular
“Genel matematik (genel bakış) ve genel öznitelikler (gerektiğinde)” dersi ücretsiz mi?
Evet — “Genel matematik (genel bakış) ve genel öznitelikler (gerektiğinde)” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 3 dersten oluşur.
“Genel matematik (genel bakış) ve genel öznitelikler (gerektiğinde)” dersinde ne öğreneceğim?
Modern özellikler olmadan genel matematiği öykünün: bir işlem sağlayıcısı veya delegate'ler aktarın, türleri dikkatle kısıtlayın ve "genel öznitelikleri" Type parametreleriyle benzetin. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 3 dersinin 2. dersidir.
“Genel matematik (genel bakış) ve genel öznitelikler (gerektiğinde)” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- unmanaged, notnull, new() (C# 6 öykünmesi)
- Genel matematik (genel bakış) ve genel öznitelikler (gerektiğinde)
- Yeniden kullanılabilir genel yardımcılar