- record:
record可以在定義類型時帶參,這個參數會轉成預設的屬性
public record PersonRecord(string FirstName, string LastName) { public string Name => $"{FirstName} {LastName}"; }
在執行個體化完對象後,是可以直接使用這些屬性的,但用record定義的類型,不會有預設構造函數。
var pr_1 = new PersonRecord("first", "last"); Console.WriteLine($"FirstName:{pr_1.FirstName}"); Console.WriteLine($"LastName:{pr_1.LastName}"); Console.WriteLine($"Name:{pr_1.Name}"); //下面的寫法是錯誤的 //var pr_2 = new PersonRecord(); //Console.WriteLine($"FirstName:{pr_2.FirstName}"); //Console.WriteLine($"LastName:{pr_2.LastName}"); //Console.WriteLine($"Name:{pr_2.Name}");
- record struct:
同樣,也可以用record關鍵字來定義結構體,定義如下。
public record struct PersonRecordStruct(string FirstName, string LastName) { public string Name => $"{FirstName} {LastName}"; }
不同的是,結構體會預設帶一個無參構造。
var prs_1 = new PersonRecordStruct("first", "last"); Console.WriteLine($"FirstName:{prs_1.FirstName}"); Console.WriteLine($"LastName:{prs_1.LastName}"); Console.WriteLine($"Name:{prs_1.Name}"); var prs_2 = new PersonRecordStruct(); Console.WriteLine($"FirstName:{prs_2.FirstName}"); Console.WriteLine($"LastName:{prs_2.LastName}"); Console.WriteLine($"Name:{prs_2.Name}");
- class:
C#到12時,這個功能擴充到了class上了,可以定義一個主構造函數,不同的是,這個構造函數不會轉成類型内部的一個預設屬性,而隻是供内部成員使用的一個變量,就像一個字段一樣使用,通常是初始化一些内部成員。如果有多個構造,可以再次定義,但不同之處在于,這些構造函數必須實作主構造函數,用this()方式調用。
public class PersonClass(string firstName, string LastName) { public PersonClass() : this("", "") { } public string FirstName { get; } = firstName; public string LastName { get; } = LastName; public string Name => $"{FirstName} {LastName}"; }
使用時與普通類型無什麼差别。
var pc_1 = new PersonClass("first", "last"); Console.WriteLine($"FirstName:{pc_1.FirstName}"); Console.WriteLine($"LastName:{pc_1.LastName}"); Console.WriteLine($"Name:{pc_1.Name}"); var pc_2 = new PersonClass(); Console.WriteLine($"FirstName:{pc_2.FirstName}"); Console.WriteLine($"LastName:{pc_2.LastName}"); Console.WriteLine($"Name:{pc_2.Name}");
- struct:
同樣的能力也會在struct上出現。
public struct PersonStruct(string firstName, string LastName) { public string FirstName { get; } = firstName; public string LastName { get; } = LastName; public string Name => $"{FirstName} {LastName}"; }
不同之處在于結構體依然有預設構造函數。
var ps_1 = new PersonStruct("first", "last"); Console.WriteLine($"FirstName:{ps_1.FirstName}"); Console.WriteLine($"LastName:{ps_1.LastName}"); Console.WriteLine($"Name:{ps_1.Name}"); var ps_2 = new PersonStruct(); Console.WriteLine($"FirstName:{ps_2.FirstName}"); Console.WriteLine($"LastName:{ps_2.LastName}"); Console.WriteLine($"Name:{ps_2.Name}");