การเชื่อมโยงคอนสตรักเตอร์ด้วย this
ใช้การกำหนดค่าเริ่มต้นร่วมกันระหว่างคอนสตรักเตอร์
การเชื่อมโยงคอนสตรักเตอร์ด้วย this เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงเชื่อมโยงคอนสตรักเตอร์
เมื่อคอนสตรักเตอร์หลายตัวใช้ตรรกะการตั้งค่าร่วมกัน คุณสามารถเชื่อมโยงคอนสตรักเตอร์เหล่านั้น เพื่อให้ตัวหนึ่งเรียกใช้อีกตัวหนึ่งได้ วิธีนี้ช่วยหลีกเลี่ยงโค้ดซ้ำและรวมการเริ่มต้นไว้ที่จุดเดียว
using System;
class Box
{
public int Width;
public int Height;
public Box(int width, int height)
{
Width = width;
Height = height;
}
public Box() : this(1, 1) { }
}
class Program
{
static void Main()
{
var def = new Box();
Console.WriteLine(def.Width + "x" + def.Height);
}
}ไวยากรณ์ : this(...)
การเชื่อมโยงใช้ : this(args) ต่อท้ายลายเซ็นของคอนสตรักเตอร์ คอนสตรักเตอร์เป้าหมายจะทำงานก่อน จากนั้นบล็อกคำสั่งของคอนสตรักเตอร์ปัจจุบันจึงทำงาน
using System;
class Person
{
public string Name;
public int Age;
public Person(string name, int age)
{
Name = name;
Age = age;
Console.WriteLine("Full constructor ran");
}
public Person(string name) : this(name, 0)
{
Console.WriteLine("Name-only constructor ran");
}
}
class Program
{
static void Main()
{
var p = new Person("Sam");
Console.WriteLine(p.Name + ", " + p.Age);
}
}ลำดับการทำงาน
คอนสตรักเตอร์ที่ถูกเชื่อมโยงจะทำงานก่อนบล็อกคำสั่งของคอนสตรักเตอร์ที่เรียกใช้ วิธีนี้รับรองว่าการตั้งค่าพื้นฐานจะเสร็จก่อน
using System;
class Step
{
public Step(int n)
{
Console.WriteLine("Init with " + n);
}
public Step() : this(0)
{
Console.WriteLine("Then default body");
}
}
class Program
{
static void Main()
{
var s = new Step();
}
}แหล่งความจริงเพียงแห่งเดียว
รวมคอนสตรักเตอร์ทั้งหมดให้เรียกใช้คอนสตรักเตอร์ "หลัก" เพียงตัวเดียว ซึ่งเป็นที่เก็บตรรกะจริง ส่วนคอนสตรักเตอร์อื่นมีหน้าที่เพียงระบุค่าเริ่มต้นและเชื่อมโยงไปยังคอนสตรักเตอร์หลัก
using System;
class Connection
{
public string Host;
public int Port;
public Connection(string host, int port)
{
Host = host;
Port = port;
}
public Connection(string host) : this(host, 8080) { }
public Connection() : this("localhost", 8080) { }
}
class Program
{
static void Main()
{
var c = new Connection("example.com");
Console.WriteLine(c.Host + ":" + c.Port);
}
}การเชื่อมโยงพร้อมค่าเริ่มต้น
การเชื่อมโยงเป็นวิธีที่ชัดเจนในการแสดงค่าเริ่มต้นแบบเป็นลำดับชั้น โดยคอนสตรักเตอร์ที่สั้นกว่าแต่ละตัวจะเติมค่าเริ่มต้นเพิ่มอีกหนึ่งค่า แล้วมอบหมายงานต่อ
using System;
class Coffee
{
public string Size;
public bool Milk;
public int Sugar;
public Coffee(string size, bool milk, int sugar)
{
Size = size;
Milk = milk;
Sugar = sugar;
}
public Coffee(string size, bool milk) : this(size, milk, 0) { }
public Coffee(string size) : this(size, false) { }
}
class Program
{
static void Main()
{
var c = new Coffee("large");
Console.WriteLine(c.Size + ", milk=" + c.Milk + ", sugar=" + c.Sugar);
}
}การตรวจสอบความถูกต้องในคอนสตรักเตอร์เป้าหมาย
เนื่องจากคอนสตรักเตอร์ทุกตัวจะส่งต่อมายังคอนสตรักเตอร์หลัก การตรวจสอบความถูกต้องที่เขียนไว้ในคอนสตรักเตอร์นั้นจึงช่วยป้องกันเส้นทางการสร้างออบเจ็กต์ทั้งหมด
using System;
class Rect
{
public int W;
public int H;
public Rect(int w, int h)
{
if (w <= 0 || h <= 0)
throw new ArgumentException("Dimensions must be positive");
W = w;
H = h;
}
public Rect(int side) : this(side, side) { }
}
class Program
{
static void Main()
{
var square = new Rect(5);
Console.WriteLine(square.W + "x" + square.H);
}
}การเชื่อมโยงเทียบกับค่าเริ่มต้นของพารามิเตอร์
ค่าเริ่มต้นของพารามิเตอร์อาจใช้แทนคอนสตรักเตอร์หลายรูปแบบได้ แต่การเชื่อมโยงจะชัดเจนกว่าเมื่อคอนสตรักเตอร์แต่ละตัวต้องใช้ตรรกะในบล็อกคำสั่งแตกต่างกันเล็กน้อย
using System;
class Logger
{
public string Prefix;
public bool Verbose;
public Logger(string prefix, bool verbose)
{
Prefix = prefix;
Verbose = verbose;
}
public Logger(string prefix) : this(prefix, false)
{
Console.WriteLine("Created quiet logger");
}
}
class Program
{
static void Main()
{
var log = new Logger("APP");
Console.WriteLine(log.Prefix + " verbose=" + log.Verbose);
}
}บล็อกคำสั่งว่างเป็นเรื่องปกติ
คอนสตรักเตอร์ที่เชื่อมโยงกันมักมีบล็อกคำสั่ง { } ว่างเปล่า เพราะงานทั้งหมดเกิดขึ้นในคอนสตรักเตอร์เป้าหมาย
using System;
class Vector
{
public double X, Y, Z;
public Vector(double x, double y, double z)
{
X = x; Y = y; Z = z;
}
public Vector(double v) : this(v, v, v) { }
}
class Program
{
static void Main()
{
var v = new Vector(2);
Console.WriteLine(v.X + "," + v.Y + "," + v.Z);
}
}หลีกเลี่ยงการวนซ้ำ
คอนสตรักเตอร์ต้องไม่เชื่อมโยงกันเป็นวงวน เช่น A เรียก B และ B เรียก A คอมไพเลอร์จะปฏิเสธการเชื่อมโยง : this(...) ที่วนเป็นวงกลม
using System;
class Safe
{
public int A, B;
public Safe(int a, int b)
{
A = a;
B = b;
}
public Safe(int a) : this(a, 0) { } // chains one direction only
}
class Program
{
static void Main()
{
var s = new Safe(7);
Console.WriteLine(s.A + ", " + s.B);
}
}การใช้งานร่วมกับ this.field
คุณสามารถเชื่อมโยงคอนสตรักเตอร์และยังใช้ this. ในบล็อกคำสั่งสำหรับการตั้งค่าเพิ่มเติมหลังจากคอนสตรักเตอร์เป้าหมายทำงานเสร็จได้
using System;
class Account
{
public string Owner;
public decimal Balance;
public bool Active;
public Account(string owner, decimal balance)
{
this.Owner = owner;
this.Balance = balance;
}
public Account(string owner) : this(owner, 0m)
{
this.Active = true;
}
}
class Program
{
static void Main()
{
var a = new Account("Rin");
Console.WriteLine(a.Owner + " active=" + a.Active);
}
}นำทุกอย่างมารวมกัน
การเชื่อมโยงช่วยให้คลาสเป็นไปตามหลัก DRY โดยมีคอนสตรักเตอร์หนึ่งตัวตรวจสอบความถูกต้องและกำหนดค่า ส่วนคอนสตรักเตอร์ที่เหลือจะเป็นทางลัดที่สะดวก
using System;
class Pizza
{
public string Size;
public int Toppings;
public Pizza(string size, int toppings)
{
if (toppings < 0) throw new ArgumentException("toppings");
Size = size;
Toppings = toppings;
}
public Pizza(string size) : this(size, 0) { }
public Pizza() : this("medium") { }
}
class Program
{
static void Main()
{
var p = new Pizza();
Console.WriteLine(p.Size + " with " + p.Toppings + " toppings");
}
}ตรวจสอบความเข้าใจ
ทดสอบความเข้าใจเกี่ยวกับการเชื่อมโยงคอนสตรักเตอร์
ทบทวน
การเชื่อมโยงคอนสตรักเตอร์ใช้ : this(args) เพื่อเรียกใช้คอนสตรักเตอร์อีกตัวในคลาสเดียวกัน คอนสตรักเตอร์เป้าหมายจะทำงานก่อน จากนั้นบล็อกคำสั่งปัจจุบันจึงทำงาน ให้คอนสตรักเตอร์ทุกตัวส่งต่อผ่านคอนสตรักเตอร์หลักเพียงตัวเดียว เพื่อรวมการตรวจสอบความถูกต้องไว้ที่เดียวและหลีกเลี่ยงการตั้งค่าซ้ำ การเชื่อมโยงแบบวนเป็นวงกลมไม่อนุญาตให้ใช้
using System;
class Demo
{
public int X, Y;
public Demo(int x, int y) { X = x; Y = y; }
public Demo(int both) : this(both, both) { }
}
class Program
{
static void Main()
{
var d = new Demo(4);
Console.WriteLine(d.X + "," + d.Y);
}
}คำถามที่พบบ่อย
บทเรียน “การเชื่อมโยงคอนสตรักเตอร์ด้วย this” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเชื่อมโยงคอนสตรักเตอร์ด้วย this” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเชื่อมโยงคอนสตรักเตอร์ด้วย this”
ใช้การกำหนดค่าเริ่มต้นร่วมกันระหว่างคอนสตรักเตอร์ คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การเชื่อมโยงคอนสตรักเตอร์ด้วย this” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดคอนสตรักเตอร์
- การเชื่อมโยงคอนสตรักเตอร์ด้วย this
- ตัวกำหนดค่าเริ่มต้นของออบเจ็กต์และคอลเลกชัน
- คอนสตรักเตอร์แบบสแตติก