นิพจน์ with บนเรคคอร์ด
สร้างสำเนาที่แก้ไขแล้วของออบเจ็กต์ที่เปลี่ยนแปลงไม่ได้
นิพจน์ with บนเรคคอร์ด เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
นิพจน์ with
นิพจน์ with จะสร้างสำเนาของเรคคอร์ดที่มีการเปลี่ยนแปลงพร็อพเพอร์ตีบางรายการ โดยไม่แตะต้องออบเจ็กต์เดิม นี่คือวิธีมาตรฐานในการ "อัปเดต" เรคคอร์ดที่ไม่เปลี่ยนแปลง
using System;
record Point(int X, int Y);
var a = new Point(1, 2);
var b = a with { Y = 9 };
Console.WriteLine(a + " | " + b); // Point { X = 1, Y = 2 } | Point { X = 1, Y = 9 }การเปลี่ยนแปลงโดยไม่ทำลายข้อมูลเดิม
เรคคอร์ดเดิมจะไม่ถูกแก้ไขเลย with จะทำสำเนาแบบตื้นและใช้การเปลี่ยนแปลงที่ระบุไว้กับสำเนาเท่านั้น
using System;
record User(string Name, int Age);
var original = new User("Ada", 30);
var older = original with { Age = 31 };
Console.WriteLine(original.Age + " " + older.Age); // 30 31การเปลี่ยนแปลงพร็อพเพอร์ตีหลายรายการ
ระบุการกำหนดค่าหลายรายการภายในวงเล็บปีกกา เพื่อเปลี่ยนพร็อพเพอร์ตีมากกว่าหนึ่งรายการพร้อมกัน
using System;
record Config(string Env, int Retries, bool Verbose);
var baseCfg = new Config("dev", 3, false);
var prod = baseCfg with { Env = "prod", Verbose = true };
Console.WriteLine(prod.Env + " " + prod.Retries + " " + prod.Verbose); // prod 3 Trueการคัดลอกพร็อพเพอร์ตีที่ไม่เปลี่ยนแปลง
พร็อพเพอร์ตีที่คุณไม่ได้ระบุจะถูกคัดลอกจากระเบียนต้นทางตามเดิม
using System;
record Product(string Name, decimal Price, int Stock);
var p = new Product("Book", 12m, 5);
var discounted = p with { Price = 10m };
Console.WriteLine(discounted.Name + " " + discounted.Stock); // Book 5with กับความเท่าเทียมตามค่า
เนื่องจากเรคคอร์ดใช้ความเท่าเทียมตามค่า การคัดลอกที่ไม่ได้เปลี่ยนแปลงอะไรจึงเท่ากับต้นฉบับ
using System;
record Coord(int X, int Y);
var a = new Coord(1, 2);
var b = a with { };
Console.WriteLine(a == b); // True (value equal)
Console.WriteLine(ReferenceEquals(a, b)); // False (different objects)ความหมายของการคัดลอกแบบตื้น
with จะคัดลอกการอ้างอิง ไม่ใช่กราฟออบเจ็กต์ทั้งหมด ออบเจ็กต์ที่แก้ไขได้ซึ่งอยู่ภายในจะถูกใช้ร่วมกันระหว่างต้นฉบับกับสำเนา
using System;
using System.Collections.Generic;
record Cart(List<string> Items);
var a = new Cart(new List<string> { "x" });
var b = a with { };
b.Items.Add("y"); // shared list!
Console.WriteLine(a.Items.Count); // 2with กับเรคคอร์ดสตรักต์
เรคคอร์ดสตรักต์รองรับ with เช่นกัน โดยสร้างสำเนาที่ปรับแก้แล้วของชนิดค่า
using System;
record struct Size(int W, int H);
var s = new Size(4, 4);
var wide = s with { W = 8 };
Console.WriteLine(wide.W + "x" + wide.H); // 8x4การเชื่อมนิพจน์ with ต่อกัน
คุณสามารถเชื่อมนิพจน์ with ต่อกันเพื่อใช้การเปลี่ยนแปลงเป็นลำดับ โดยแต่ละขั้นตอนจะสร้างเรคคอร์ดใหม่
using System;
record Point(int X, int Y, int Z);
var p = new Point(0, 0, 0)
with { X = 1 }
with { Y = 2 }
with { Z = 3 };
Console.WriteLine(p); // Point { X = 1, Y = 2, Z = 3 }การอัปเดตโดยไม่ใช้ตัวสร้าง
with ช่วยให้ไม่จำเป็นต้องใช้คลาสตัวสร้าง เพียงคัดลอกแล้วปรับฟิลด์ที่ต้องการ
using System;
record Email(string To, string Subject, string Body);
var draft = new Email("a@b.com", "Hi", "");
var ready = draft with { Body = "Welcome!" };
Console.WriteLine(ready.Body); // Welcome!ตรรกะการคัดลอกแบบกำหนดเอง
เรคคอร์ดจะสร้างตัวสร้างการคัดลอกที่มีการป้องกัน ซึ่ง with จะนำไปใช้ คุณสามารถประกาศตัวสร้างของคุณเองเพื่อกำหนดวิธีสร้างสำเนาได้
using System;
record Audited(string Name) {
public int Version { get; init; } = 1;
protected Audited(Audited other) {
Name = other.Name;
Version = other.Version + 1; // bump on every copy
}
}
var a = new Audited("x");
var b = a with { };
Console.WriteLine(a.Version + " " + b.Version); // 1 2การนำแนวคิดทั้งหมดมาประกอบกัน
การจำลองการเปลี่ยนสถานะด้วย with ช่วยรักษาประวัติที่ตรวจสอบย้อนหลังได้ง่ายและไม่เปลี่ยนแปลง
using System;
record Order(string Id, string Status);
var created = new Order("O1", "Created");
var paid = created with { Status = "Paid" };
var shipped = paid with { Status = "Shipped" };
Console.WriteLine(created.Status + " -> " + paid.Status + " -> " + shipped.Status);แบบทดสอบสั้น ๆ
ทดสอบความเข้าใจของคุณเกี่ยวกับนิพจน์ with
สรุปทบทวน
คุณได้เรียนรู้นิพจน์ with ของเรคคอร์ด
a with { Prop = value }จะคัดลอกและเปลี่ยนพร็อพเพอร์ตีที่เลือก- ต้นฉบับจะไม่ถูกแก้ไข การดำเนินการนี้ไม่ทำลายข้อมูลเดิม
- สำเนาเป็นการคัดลอกแบบตื้น ดังนั้นออบเจ็กต์ที่แก้ไขได้ซึ่งอยู่ภายในจึงถูกใช้ร่วมกัน
- ใช้ได้กับเรคคอร์ดและเรคคอร์ดสตรักต์ และสามารถเชื่อมต่อกันได้
เรียนรู้ C# ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 93
- บทเรียน
- 346
คำถามที่พบบ่อย
บทเรียน “นิพจน์ with บนเรคคอร์ด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “นิพจน์ with บนเรคคอร์ด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “นิพจน์ with บนเรคคอร์ด”
สร้างสำเนาที่แก้ไขแล้วของออบเจ็กต์ที่เปลี่ยนแปลงไม่ได้ คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “นิพจน์ with บนเรคคอร์ด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตัวกำหนดค่าแบบ init เท่านั้น
- ตัวปรับแต่ง required
- รูปแบบออบเจ็กต์ที่เปลี่ยนแปลงไม่ได้
- นิพจน์ with บนเรคคอร์ด