0Pricing
C# Academy · Ders

İşleç Aşırı Yükleme için En İyi Uygulamalar

Aşırı yüklenmiş işleçleri sezgisel tutun.

İşleç Aşırı Yükleme için En İyi Uygulamalar, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 4. 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 4 dersten oluşur.

İşleçleri Aşırı Yükleme İçin En İyi Uygulamalar

İşleçleri aşırı yüklemek güçlü bir araçtır. İyi kullanıldığında değer türlerini sezgisel hale getirir; kötü kullanıldığında kodu anlaşılmazlaştırır. Bu derste, aşırı yüklenmiş işleçlerin öngörülebilir kalmasını sağlayan ilkeler ele alınır.

Yalnızca Anlamı Açık Olduğunda Aşırı Yükleyin

Bir işleci yalnızca türünüz için anlamı kesin olduğunda aşırı yükleyin. Bir vektördeki + açıkça bileşen bazında toplamayı ifade eder; bir Order üzerindeki + ise okuyucuların kafasını karıştırır.

using System;

public struct Vector2
{
    public int X, Y;
    public Vector2(int x, int y) { X = x; Y = y; }
    // + means adding components: obvious and expected
    public static Vector2 operator +(Vector2 a, Vector2 b)
        => new Vector2(a.X + b.X, a.Y + b.Y);
    public override string ToString() => "(" + X + ", " + Y + ")";
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Vector2(1, 2) + new Vector2(3, 4));
    }
}

Matematiksel Beklentileri Koruyun

İşleçleri sezgiyle tutarlı tutun: Matematik değişmeli olduğunda a + b, b + a'ya eşit olmalıdır ve + gizlice çıkarma yapmamalıdır. Buradaki sürprizler, fark edilmesi zor hatalara yol açar.

using System;

public struct Money
{
    public decimal Amount;
    public Money(decimal a) { Amount = a; }
    public static Money operator +(Money a, Money b) => new Money(a.Amount + b.Amount);
    public override string ToString() => "$" + Amount;
}

public class Program
{
    public static void Main()
    {
        var x = new Money(3);
        var y = new Money(5);
        Console.WriteLine((x + y).Amount == (y + x).Amount); // commutative
    }
}

Simetriyi ve Eşleştirmeyi Koruyun

Dil, belirli işleçleri çiftler halinde eşleştirir; ancak mantıksal simetriyi de korumalısınız: + ekliyorsanız - eklemeyi de düşünün; < ekliyorsanız > ve eşitlikli sürümlerini de sağlayın. Yarım bırakılmış işleç kümeleri kullanıcıları hayal kırıklığına uğratır.

using System;

public struct Length
{
    public int Mm;
    public Length(int mm) { Mm = mm; }
    public static Length operator +(Length a, Length b) => new Length(a.Mm + b.Mm);
    public static Length operator -(Length a, Length b) => new Length(a.Mm - b.Mm);
    public override string ToString() => Mm + "mm";
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Length(50) + new Length(20));
        Console.WriteLine(new Length(50) - new Length(20));
    }
}

İşlenenleri Değiştirmeyin

İşleçler saf olmalıdır: İşlemi hesaplayıp yeni bir değer döndürmeli, işlenenleri değiştirmemelidir. + içinde bir işleneni değiştirmek, okuyucunun tüm beklentilerini bozar.

using System;

public struct Vector2
{
    public int X, Y;
    public Vector2(int x, int y) { X = x; Y = y; }
    public static Vector2 operator +(Vector2 a, Vector2 b)
        => new Vector2(a.X + b.X, a.Y + b.Y); // returns new, mutates nothing
    public override string ToString() => "(" + X + ", " + Y + ")";
}

public class Program
{
    public static void Main()
    {
        var a = new Vector2(1, 1);
        var unused = a + new Vector2(9, 9);
        Console.WriteLine("a is still " + a);
    }
}

== İşlecini Equals ile Tutarlı Tutun

Yaygın bir en iyi uygulama şudur: == işlecini her aşırı yüklediğinizde, tüm eşitlik yollarının aynı sonucu vermesi için Equals ve GetHashCode yöntemlerini geçersiz kılın. Buradaki tutarsızlık, işleçlerle ilgili en yaygın hatalardan biridir.

using System;

public struct Point
{
    public int X, Y;
    public Point(int x, int y) { X = x; Y = y; }
    public override bool Equals(object obj) => obj is Point p && p.X == X && p.Y == Y;
    public override int GetHashCode() => HashCode.Combine(X, Y);
    public static bool operator ==(Point a, Point b) => a.Equals(b);
    public static bool operator !=(Point a, Point b) => !a.Equals(b);
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Point(1, 1) == new Point(1, 1));
    }
}

Adlandırılmış Alternatifler Sunun

Bazı diller ve analiz araçları işleçleri kullanamaz. + işleçinin yanında Add gibi adlandırılmış bir yöntem sunmak, birlikte çalışabilirliği ve keşfedilebilirliği artırır.

using System;

public struct Vector2
{
    public int X, Y;
    public Vector2(int x, int y) { X = x; Y = y; }
    public Vector2 Add(Vector2 other) => new Vector2(X + other.X, Y + other.Y);
    public static Vector2 operator +(Vector2 a, Vector2 b) => a.Add(b);
    public override string ToString() => "(" + X + ", " + Y + ")";
}

public class Program
{
    public static void Main()
    {
        var v = new Vector2(1, 2);
        Console.WriteLine(v.Add(new Vector2(3, 4)));
        Console.WriteLine(v + new Vector2(3, 4));
    }
}

İşleçleri Değer Benzeri Türlerde Tercih Edin

İşleçler değişmez, değer benzeri türlerde (yapılarda veya kayıt benzeri sınıflarda) doğal hissettirir. Değiştirilebilir ve kimliğin önemli olduğu türlerde ise adlandırılmış yöntemler genellikle amacı daha iyi ifade eder.

using System;

public readonly struct Rational
{
    public readonly int Num, Den;
    public Rational(int n, int d) { Num = n; Den = d; }
    public static Rational operator *(Rational a, Rational b)
        => new Rational(a.Num * b.Num, a.Den * b.Den);
    public override string ToString() => Num + "/" + Den;
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Rational(1, 2) * new Rational(2, 3));
    }
}

Kenar Durumlarını Belgeleyin

İşleçlerin özel değerleri nasıl ele aldığını açıkça belirtin: sıfıra bölme, sınıflardaki boş işlenenler veya taşma. Öngörülebilir davranış, çağıran kodun hazırlıksız yakalanmasını önler.

using System;

public struct SafeDiv
{
    public int Value;
    public SafeDiv(int v) { Value = v; }
    // Documented behavior: dividing by zero yields zero
    public static SafeDiv operator /(SafeDiv a, SafeDiv b)
        => new SafeDiv(b.Value == 0 ? 0 : a.Value / b.Value);
    public override string ToString() => Value.ToString();
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new SafeDiv(10) / new SafeDiv(0));
        Console.WriteLine(new SafeDiv(10) / new SafeDiv(2));
    }
}

Disiplinli Bir İşleç Kümesi

İyi tasarlanmış bir sayısal tür, birkaç sezgisel işleci, tutarlı eşitliği ve değişmezliği bir araya getirir. Sonuç, yerleşik bir sayı gibi davranır ve kullanımı keyif verir.

using System;

public readonly struct Vec
{
    public readonly double X, Y;
    public Vec(double x, double y) { X = x; Y = y; }
    public static Vec operator +(Vec a, Vec b) => new Vec(a.X + b.X, a.Y + b.Y);
    public static Vec operator -(Vec a, Vec b) => new Vec(a.X - b.X, a.Y - b.Y);
    public static Vec operator *(Vec a, double k) => new Vec(a.X * k, a.Y * k);
    public override string ToString() => "(" + X + ", " + Y + ")";
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine((new Vec(1, 2) + new Vec(3, 4)) * 2);
    }
}

Kendiniz Deneyin

Uygulamaları bir araya getirin: değişmez bir değer türü, sezgisel işleçler, adlandırılmış bir alternatif ve tutarlı eşitlik.

using System;

public readonly struct Meters : IEquatable<Meters>
{
    public readonly double Value;
    public Meters(double v) { Value = v; }
    public Meters Add(Meters other) => new Meters(Value + other.Value);
    public static Meters operator +(Meters a, Meters b) => a.Add(b);
    public bool Equals(Meters other) => Value == other.Value;
    public override bool Equals(object obj) => obj is Meters m && Equals(m);
    public override int GetHashCode() => Value.GetHashCode();
    public static bool operator ==(Meters a, Meters b) => a.Equals(b);
    public static bool operator !=(Meters a, Meters b) => !a.Equals(b);
    public override string ToString() => Value + "m";
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Meters(3) + new Meters(4));
        Console.WriteLine(new Meters(7) == new Meters(7));
    }
}

Hızlı Kontrol

İşleçlerle ilgili en iyi uygulamaları uygulayın.

Özet

İyi işleç aşırı yükleme disiplinli ve öngörülebilirdir.

  • Yalnızca anlamı açık olduğunda aşırı yükleyin.
  • Matematiksel beklentileri ve simetriyi koruyun.
  • Saf kalın: Yeni değerler döndürün, işlenenleri hiçbir zaman değiştirmeyin.
  • == işlecini Equals/GetHashCode ile tutarlı tutun.
  • Adlandırılmış alternatifler sunun ve değer benzeri türleri tercih edin.

Sıkça Sorulan Sorular

“İşleç Aşırı Yükleme için En İyi Uygulamalar” dersi ücretsiz mi?

Evet — “İşleç Aşırı Yükleme için En İyi Uygulamalar” 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 4 dersten oluşur.

“İşleç Aşırı Yükleme için En İyi Uygulamalar” dersinde ne öğreneceğim?

Aşırı yüklenmiş işleçleri sezgisel tutun. 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, 4 dersinin 4. dersidir.

“İşleç Aşırı Yükleme için En İyi Uygulamalar” 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

  1. Aritmetik İşleçleri Aşırı Yükleme
  2. Karşılaştırma İşleçlerini Aşırı Yükleme
  3. Kullanıcı Tanımlı Dönüşümler
  4. İşleç Aşırı Yükleme için En İyi Uygulamalar
← C# Academy Sayfasına Dön