0Pricing
C# Academy · บทเรียน

การโอเวอร์โหลดตัวดำเนินการเลขคณิต

กำหนด +, -, * ให้ชนิดข้อมูลของคุณเอง

การโอเวอร์โหลดตัวดำเนินการเลขคณิต เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงโอเวอร์โหลดตัวดำเนินการทางเลขคณิต

การโอเวอร์โหลดตัวดำเนินการ ทำให้ชนิดข้อมูลของคุณเองใช้สัญลักษณ์ที่คุ้นเคย เช่น +, - และ * ได้ สำหรับชนิดข้อมูลที่มีลักษณะเหมือนค่า เช่น เวกเตอร์ เงิน หรือจำนวนเชิงซ้อน วิธีนี้ทำให้โค้ดอ่านเหมือนคณิตศาสตร์แทนที่จะเป็นการเรียกเมธอด

ไวยากรณ์ตัวดำเนินการ +

ตัวดำเนินการที่โอเวอร์โหลดจะประกาศเป็นเมธอด public static ซึ่งมีชื่อเป็น operator ตามด้วยสัญลักษณ์ พารามิเตอร์อย่างน้อยหนึ่งตัวต้องเป็นชนิดข้อมูลที่ครอบเมธอดนั้น

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

    public override string ToString() => "(" + X + ", " + Y + ")";
}

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

การลบและการคูณ

คุณสามารถโอเวอร์โหลดตัวดำเนินการหลายตัวในชนิดข้อมูลเดียวกันได้ ในที่นี้เราเพิ่มการลบและการคูณด้วยสเกลาร์ให้กับเวกเตอร์ของเรา

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);
    public static Vector2 operator *(Vector2 a, int k)
        => new Vector2(a.X * k, a.Y * k);

    public override string ToString() => "(" + X + ", " + Y + ")";
}

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

ตัวดำเนินการเป็นแบบคงที่เสมอ

ตัวดำเนินการที่โอเวอร์โหลดต้องเป็น static เสมอ ตัวดำเนินการเหล่านี้ไม่ได้ทำงานกับ this ที่ซ่อนอยู่ แต่รับตัวถูกดำเนินการเป็นพารามิเตอร์อย่างชัดเจน คอมไพเลอร์จะจับคู่สัญลักษณ์กับเมธอด

using System;

public struct Money
{
    public decimal Amount;
    public Money(decimal amount) { Amount = amount; }

    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 total = new Money(10.5m) + new Money(4.25m);
        Console.WriteLine(total);
    }
}

ตัวดำเนินการเอกภาค

ตัวดำเนินการเอกภาค เช่น การทำให้เป็นค่าลบ จะรับตัวถูกดำเนินการเพียงหนึ่งตัว โอเวอร์โหลด operator - ด้วยพารามิเตอร์หนึ่งตัวเพื่อรองรับนิพจน์อย่าง -v

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)
        => new Vector2(-a.X, -a.Y);

    public override string ToString() => "(" + X + ", " + Y + ")";
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(-new Vector2(3, -7));
    }
}

ตัวถูกดำเนินการต่างชนิด

ตัวถูกดำเนินการหนึ่งตัวอาจเป็นชนิดข้อมูลอื่นได้ การจัดเตรียมทั้งสองลำดับทำให้ผู้ใช้เขียนนิพจน์ได้อย่างเป็นธรรมชาติไม่ว่าจะใช้ลำดับใด

using System;

public struct Temperature
{
    public double Celsius;
    public Temperature(double c) { Celsius = c; }

    public static Temperature operator +(Temperature t, double delta)
        => new Temperature(t.Celsius + delta);
    public static Temperature operator +(double delta, Temperature t)
        => new Temperature(t.Celsius + delta);

    public override string ToString() => Celsius + "C";
}

public class Program
{
    public static void Main()
    {
        Console.WriteLine(new Temperature(20) + 5);
        Console.WriteLine(5 + new Temperature(20));
    }
}

การส่งคืนค่าใหม่

ตัวดำเนินการทางเลขคณิตไม่ควรเปลี่ยนแปลงตัวถูกดำเนินการ แต่ควรคำนวณและส่งคืนค่าใหม่ โดยไม่เปลี่ยนแปลงค่าเดิม เช่นเดียวกับที่ int ทำ

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);
    public override string ToString() => "(" + X + ", " + Y + ")";
}

public class Program
{
    public static void Main()
    {
        var a = new Vector2(1, 1);
        var b = new Vector2(2, 2);
        var c = a + b;
        Console.WriteLine("a unchanged: " + a);
        Console.WriteLine("result: " + c);
    }
}

การเชื่อมการคำนวณทางเลขคณิต

เนื่องจากตัวดำเนินการแต่ละตัวส่งคืนชนิดข้อมูลเดียวกัน นิพจน์จึงเชื่อมต่อกันได้อย่างเป็นธรรมชาติ และยังคงเคารพลำดับความสำคัญกับการจับกลุ่มตามปกติ

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);
    public static Vector2 operator *(Vector2 a, int k) => new Vector2(a.X * k, a.Y * k);
    public override string ToString() => "(" + X + ", " + Y + ")";
}

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

ตัวดำเนินการบนคลาส

การโอเวอร์โหลดตัวดำเนินการใช้กับคลาสได้เช่นกัน ไม่ได้จำกัดเฉพาะโครงสร้างข้อมูล โปรดระวัง null เนื่องจากตัวถูกดำเนินการที่เป็นคลาสอาจมีค่าเป็นค่าว่าง จึงควรตรวจสอบหากจำเป็น

using System;

public class Complex
{
    public double Re, Im;
    public Complex(double re, double im) { Re = re; Im = im; }
    public static Complex operator +(Complex a, Complex b)
        => new Complex(a.Re + b.Re, a.Im + b.Im);
    public override string ToString() => Re + " + " + Im + "i";
}

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

ชนิดข้อมูลตัวเลขที่สมบูรณ์

นี่คือตัวแทนเศษส่วนขนาดเล็กที่รองรับการบวก ตัวอย่างนี้แสดงให้เห็นว่าการโอเวอร์โหลดทำให้ชนิดข้อมูลในโดเมนมีพฤติกรรมเหมือนตัวเลขในตัวได้อย่างไร

using System;

public struct Fraction
{
    public int Num, Den;
    public Fraction(int num, int den) { Num = num; Den = den; }

    public static Fraction operator +(Fraction a, Fraction b)
        => new Fraction(a.Num * b.Den + b.Num * a.Den, a.Den * b.Den);

    public override string ToString() => Num + "/" + Den;
}

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

ลองทำด้วยตนเอง

เพิ่มการบวกและการคูณด้วยสเกลาร์ให้โครงสร้างข้อมูลที่มีลักษณะเหมือนเงิน จากนั้นสร้างนิพจน์ที่อ่านได้เหมือนการคำนวณทางเลขคณิตทั่วไป

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 static Money operator *(Money a, int qty) => new Money(a.Amount * qty);
    public override string ToString() => "$" + Amount;
}

public class Program
{
    public static void Main()
    {
        var price = new Money(4.50m);
        var total = price * 3 + new Money(2.00m);
        Console.WriteLine(total);
    }
}

ตรวจสอบอย่างรวดเร็ว

ทบทวนลายเซ็นของตัวดำเนินการที่โอเวอร์โหลด

สรุปทบทวน

การโอเวอร์โหลดตัวดำเนินการทางเลขคณิตทำให้ชนิดข้อมูลที่มีลักษณะเหมือนค่าอ่านได้เหมือนคณิตศาสตร์

  • ประกาศเป็น public static โดยใช้คีย์เวิร์ด operator
  • พารามิเตอร์อย่างน้อยหนึ่งตัวต้องเป็นชนิดข้อมูลที่ครอบเมธอดนั้น
  • ส่งคืนค่าใหม่ ห้ามเปลี่ยนแปลงตัวถูกดำเนินการ
  • จัดเตรียมทั้งสองลำดับของตัวถูกดำเนินการสำหรับการคำนวณต่างชนิด

คำถามที่พบบ่อย

บทเรียน “การโอเวอร์โหลดตัวดำเนินการเลขคณิต” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การโอเวอร์โหลดตัวดำเนินการเลขคณิต” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การโอเวอร์โหลดตัวดำเนินการเลขคณิต”

กำหนด +, -, * ให้ชนิดข้อมูลของคุณเอง คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การโอเวอร์โหลดตัวดำเนินการเลขคณิต” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การโอเวอร์โหลดตัวดำเนินการเลขคณิต
  2. การโอเวอร์โหลดตัวดำเนินการเปรียบเทียบ
  3. การแปลงที่ผู้ใช้กำหนด
  4. แนวทางปฏิบัติที่ดีในการโอเวอร์โหลดตัวดำเนินการ
← กลับไปที่ C# Academy