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

Structs: ความหมายแบบค่าและรูปแบบเปลี่ยนแปลงไม่ได้

ทำความเข้าใจความหมายแบบค่าของ struct ใน C# 6 และสร้างรูปแบบ struct ที่เปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงโดยการคัดลอก)

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

ภาพรวมชนิดข้อมูลโครงสร้าง

เป้าหมาย: ใช้ชนิดข้อมูลแบบโครงสร้างอย่างปลอดภัย

  • ความหมายแบบค่า (คัดลอกเมื่อกำหนดค่า)
  • รูปแบบโครงสร้างที่ไม่เปลี่ยนแปลงใน C# 6
  • การส่งค่าเทียบกับการส่งแบบ ref
  • ข้อควรรู้เกี่ยวกับการบ็อกซิง

ความหมายของการคัดลอก

ชนิดข้อมูลโครงสร้างเป็น ชนิดข้อมูลแบบค่า การกำหนดค่าจะสร้างสำเนา การเปลี่ยนแปลงสำเนาจะไม่เปลี่ยนแปลงค่าเดิม

using System;

// Simple struct with public fields for demo (okay for small POD data)
public struct Point
{
  public int X;
  public int Y;
}

public class Program
{
  public static void Main(string[] args)
  {
    Point a = new Point();
    a.X = 1; a.Y = 2;

    Point b = a;     // copy the value
    b.X = 9;         // change the copy

    Console.WriteLine("a=(" + a.X + "," + a.Y + ")");
    Console.WriteLine("b=(" + b.X + "," + b.Y + ")"); // different from a
  }
}

รูปแบบโครงสร้างที่ไม่เปลี่ยนแปลง

ควรเลือกใช้โครงสร้างที่ไม่เปลี่ยนแปลง: ฟิลด์แบบ readonly ตัวสร้างสำหรับสถานะที่จำเป็น และตัวช่วยขนาดเล็กแบบ With สำหรับสร้างค่าใหม่

using System;

// Immutable struct pattern (C# 6): readonly fields + constructor + With method
public struct Money
{
  private readonly decimal _amount;
  private readonly string _currency;

  public decimal Amount { get { return _amount; } }
  public string Currency { get { return _currency; } }

  public Money(decimal amount, string currency)
  {
    _amount = amount;
    _currency = currency ?? "USD";
  }

  // Copy-on-change: returns a new value with updated amount
  public Money WithAmount(decimal amount)
  {
    return new Money(amount, _currency);
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Money m1 = new Money(10m, "USD");
    Money m2 = m1.WithAmount(15m); // new value

    Console.WriteLine("m1: " + m1.Amount + " " + m1.Currency);
    Console.WriteLine("m2: " + m2.Amount + " " + m2.Currency);
  }
}

การส่งค่าเทียบกับการส่งแบบ ref

โดยค่าเริ่มต้น เมธอดจะได้รับสำเนา ใช้ ref เพื่อแก้ไขโครงสร้างของผู้เรียกใช้งาน

using System;

public struct Counter
{
  public int Value;
}

public class Program
{
  static void IncrementByValue(Counter c)
  {
    c.Value = c.Value + 1; // changes only the local copy
  }

  static void IncrementByRef(ref Counter c)
  {
    c.Value = c.Value + 1; // changes the caller's variable
  }

  public static void Main(string[] args)
  {
    Counter a = new Counter();
    IncrementByValue(a);
    Console.WriteLine("After by-value: " + a.Value); // 0

    IncrementByRef(ref a);
    Console.WriteLine("After by-ref: " + a.Value);   // 1
  }
}

พื้นฐานการบ็อกซิง

การบ็อกซิงจะคัดลอกโครงสร้างไปไว้ใน reference ของออบเจ็กต์/อินเทอร์เฟซ การยกเลิกการบ็อกซิงจะสร้างสำเนาอีกชุดหนึ่ง

using System;

public interface IShow { string Show(); }

public struct Temperature : IShow
{
  public int C;
  public string Show() { return C + "C"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Temperature t = new Temperature();
    t.C = 25;

    object boxed = t;              // boxing: copy into object
    Temperature copy = (Temperature)boxed; // unbox (another copy)
    copy.C = 30;

    Console.WriteLine("t = " + t.C);     // 25
    Console.WriteLine("copy = " + copy.C); // 30
  }
}

เคล็ดลับเกี่ยวกับโครงสร้าง

เคล็ดลับ:

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

ความหมายแบบค่าของโครงสร้าง

ตรวจสอบความเข้าใจอย่างรวดเร็ว: ข้อใดอธิบายความหมายแบบค่าของโครงสร้างใน C# ได้ดีที่สุด

ทบทวน

ทบทวน: โครงสร้างเป็น ชนิดข้อมูลแบบค่า ควรออกแบบให้มีขนาดเล็กและไม่เปลี่ยนแปลง โดยใช้ตัวสร้าง ฟิลด์แบบ readonly และ With โปรดทำความเข้าใจว่าการส่งแบบค่าเทียบกับการส่งแบบ ref และ การบ็อกซิงส่งผลต่อสำเนาอย่างไร

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

บทเรียน “Structs: ความหมายแบบค่าและรูปแบบเปลี่ยนแปลงไม่ได้” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “Structs: ความหมายแบบค่าและรูปแบบเปลี่ยนแปลงไม่ได้”

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

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

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

บทเรียน “Structs: ความหมายแบบค่าและรูปแบบเปลี่ยนแปลงไม่ได้” ใช้เวลานานแค่ไหน

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

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

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

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

  1. Structs: ความหมายแบบค่าและรูปแบบเปลี่ยนแปลงไม่ได้
  2. ชนิดคล้ายเรคคอร์ดและความเท่าเทียมตามค่า (รูปแบบ)
  3. Enum และ [Flags]
← กลับไปที่ C# Academy