ระเบียน C # 9.0 - ชนิดการอ้างอิงและตัวสร้างที่ไม่เป็นโมฆะ

Aug 15 2020

ฉันลองบันทึกง่ายๆ:

#nullable enable

public record Product
{
    public readonly string Name;
    public readonly int CategoryId;
    public readonly string Phone;
    public readonly Address Address;
    public readonly Manager Manager;
}

ฉันได้รับคำเตือน:

คุณสมบัติที่ไม่เป็นโมฆะ 'ชื่อ' ไม่ได้กำหนดค่าเริ่มต้น พิจารณาประกาศคุณสมบัติเป็นโมฆะ

(เหมือนกันสำหรับทุกช่องยกเว้น CategoryId)

โดยทั่วไปถ้าฉันเข้าใจถูกต้องตัวสร้างที่ยอมรับและตั้งค่าฟิลด์ทั้งหมดจะไม่สร้างขึ้นโดยอัตโนมัติโดยคอมไพเลอร์และ (เมื่อใช้#nullable enable) ฉันต้องเขียนด้วยตัวเองเช่น:

public Product(string Name, int CategoryId, string Phone, Address Address, Manager Manager) {
  this.Name=Name;
  this.CategoryId=CategoryId;
   ...
}

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

คำตอบ

3 IvanStoev Aug 15 2020 at 18:06

ดูเหมือนคุณจะคาดหวังว่าตัวสร้างหลักที่สร้างขึ้นโดยอัตโนมัติแต่มันถูกสร้างขึ้นโดยอัตโนมัติ (และโดยทั่วไปคุณจะได้รับประโยชน์ทั้งหมดของเรกคอร์ด) เมื่อคุณใช้พารามิเตอร์เรกคอร์ดในการประกาศประเภทเรกคอร์ดซึ่งจะแมปโดยอัตโนมัติกับสาธารณะgetและinitคุณสมบัติและ เริ่มต้นโดยอัตโนมัติจากตัวสร้างหลักดังนั้นจึงกำจัดคำเตือน NRT

ซึ่งหมายความว่าคุณจะได้รับน้ำตาลประเภทเรกคอร์ดทั้งหมดโดยใช้ไวยากรณ์ตัวสร้างปกติพร้อมrecordคำสำคัญที่เพิ่มเข้ามา

public record Product(string Name, int CategoryId, string Phone, Address Address, Manager Manager) { }