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

การเชื่อมโยงคอนสตรักเตอร์ด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การกำหนดคอนสตรักเตอร์
  2. การเชื่อมโยงคอนสตรักเตอร์ด้วย this
  3. ตัวกำหนดค่าเริ่มต้นของออบเจ็กต์และคอลเลกชัน
  4. คอนสตรักเตอร์แบบสแตติก
← กลับไปที่ C# Academy