การโอเวอร์โหลดตัวดำเนินการเลขคณิต
กำหนด +, -, * ให้ชนิดข้อมูลของคุณเอง
การโอเวอร์โหลดตัวดำเนินการเลขคณิต เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การโอเวอร์โหลดตัวดำเนินการเลขคณิต
- การโอเวอร์โหลดตัวดำเนินการเปรียบเทียบ
- การแปลงที่ผู้ใช้กำหนด
- แนวทางปฏิบัติที่ดีในการโอเวอร์โหลดตัวดำเนินการ