天天看點

C#12:主構造函數

作者:opendotnet
  • 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}");           

繼續閱讀