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

การห่อหุ้มและเงื่อนไขคงที่

ซ่อนสถานะภายใน เปิดเผยการดำเนินการที่ปลอดภัย และรักษาเงื่อนไขคงที่ของคลาสให้เป็นจริงเสมอ (เช่น ยอดคงเหลือไม่ติดลบ ช่วงค่าถูกต้อง)

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

ภาพรวมการห่อหุ้ม

เป้าหมาย: ปกป้องสถานะของออบเจ็กต์

  • การห่อหุ้ม: ซ่อนฟิลด์และเปิดเผย APIs ที่ปลอดภัย
  • อินวาเรียนต์: กฎที่เป็นจริงอยู่เสมอ
  • ตรวจสอบความถูกต้องในตัวสร้าง/ตัวกำหนดค่า/เมธอด

ส่วนที่อ่านได้อย่างเดียว

เก็บฟิลด์ไว้เป็น private มอบพร็อพเพอร์ตีแบบ อ่านได้อย่างเดียวและการดำเนินการที่ปลอดภัยให้ผู้เรียกใช้งาน

using System;

// Expose read-only view; mutate via methods only
public class Counter
{
  private int _value;          // hidden state
  public int Value             // read-only to callers
  {
    get { return _value; }
    private set { _value = value; } // keep setter private
  }

  public void Increment()
  {
    Value = Value + 1;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Counter c = new Counter();
    c.Increment();
    c.Increment();
    Console.WriteLine("Value = " + c.Value);
  }
}

การป้องกันในตัวสร้าง

ตัวสร้างจะกำหนดสถานะที่ จำเป็น ป้องกันอินพุตที่ไม่ถูกต้องเพื่อให้ออบเจ็กต์ถูกต้องตั้งแต่เริ่มต้น

using System;

// Enforce rules early (constructor guard)
public class User
{
  public string Name { get; private set; }
  public int Age { get; private set; }

  public User(string name, int age)
  {
    if (string.IsNullOrEmpty(name)) throw new ArgumentException("name");
    if (age < 0) throw new ArgumentOutOfRangeException("age");
    Name = name;
    Age = age;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      User u = new User("Ada", 28);
      Console.WriteLine(u.Name + " (" + u.Age + ")");
    }
    catch (Exception ex)
    {
      Console.WriteLine("Error: " + ex.Message);
    }
  }
}

อินวาเรียนต์ในการใช้งานจริง

กำหนด อินวาเรียนต์ เช่น Balance ≥ 0 และบังคับใช้ในตัวกำหนดค่าและเมธอด

using System;

// Invariant: Balance >= 0 at all times
public class BankAccount
{
  private decimal _balance;

  public decimal Balance
  {
    get { return _balance; }
    private set
    {
      if (value < 0) throw new InvalidOperationException("Balance would be negative");
      _balance = value;
    }
  }

  public BankAccount(decimal opening)
  {
    if (opening < 0) throw new ArgumentOutOfRangeException("opening");
    _balance = opening;
  }

  public void Deposit(decimal amount)
  {
    if (amount <= 0) throw new ArgumentOutOfRangeException("amount");
    Balance = Balance + amount;
  }

  public bool TryWithdraw(decimal amount)
  {
    if (amount <= 0) return false;
    if (Balance - amount < 0) return false;
    Balance = Balance - amount;
    return true;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    BankAccount a = new BankAccount(50m);
    a.Deposit(20m);
    bool ok = a.TryWithdraw(100m); // fails, invariant protected
    Console.WriteLine("ok=" + ok + " balance=" + a.Balance);
  }
}

ปกป้องคอลเลกชัน

อย่าเปิดเผยรายการหรืออาร์เรย์ภายในโดยตรง ให้ส่งคืนสำเนาหรือมุมมองแบบอ่านได้อย่างเดียวเพื่อปกป้องอินวาเรียนต์

using System;
using System.Collections.Generic;

public class Tags
{
  private readonly List<string> _items = new List<string>();

  public void Add(string tag)
  {
    if (string.IsNullOrWhiteSpace(tag)) return;
    _items.Add(tag.Trim());
  }

  // Expose a copy so callers cannot mutate internal list
  public List<string> GetAllCopy()
  {
    return new List<string>(_items);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Tags t = new Tags();
    t.Add(" apple ");
    t.Add("banana");
    List<string> view = t.GetAllCopy();
    view.Add("hacker"); // modifies the copy only
    Console.WriteLine("copy count=" + view.Count);
    Console.WriteLine("original count=" + t.GetAllCopy().Count);
  }
}

เคล็ดลับการห่อหุ้ม

รายการตรวจสอบ:

  • ฟิลด์ส่วนตัว พร็อพเพอร์ตี/เมธอดสาธารณะ
  • ตรวจสอบความถูกต้องในตัวสร้าง/ตัวกำหนดค่า
  • รักษาอินวาเรียนต์ให้เป็นจริงหลังการเรียกใช้ทุกครั้ง
  • อย่าเปิดเผยคอลเลกชันภายใน

หลักการห่อหุ้ม

ตรวจสอบความเข้าใจอย่างรวดเร็ว: ตัวเลือกใดรักษาการห่อหุ้มและอินวาเรียนต์ของคลาสได้ดีที่สุด

ทบทวน

ทบทวน: ใช้ฟิลด์ส่วนตัวและ APIs ที่ผ่านการตรวจสอบเพื่อทำการห่อหุ้ม กำหนด อินวาเรียนต์ และบังคับใช้ในตัวสร้าง ตัวกำหนดค่า และเมธอด อย่าเปิดเผยคอลเลกชันภายในโดยเด็ดขาด

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

บทเรียน “การห่อหุ้มและเงื่อนไขคงที่” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การห่อหุ้มและเงื่อนไขคงที่”

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

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

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

บทเรียน “การห่อหุ้มและเงื่อนไขคงที่” ใช้เวลานานแค่ไหน

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

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

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

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

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