C# 物件初始化


1.物件初始設定式

物件初始設定式允許在創建物件時同時初始化其屬性和欄位。這不僅簡化了程式,還提升了可讀性和可維護性。以下是使用場景和特性。

public class Person
{
    // 自動屬性(Auto-Implemented Properties)
    public string Name { get; set; }
    public int Age { get; set; }
    public bool IsOk { get; set; }

    // 傳統屬性(包含私有字段)
    private string _nickName;
    public string NickName
    {
        get { return _nickName; }
        set { _nickName = value; }
    }
}

使用傳統方式初始化物件

Person person = new Person();
person.Name = "世界宇宙無敵鋼打姆機器人";
person.Age = 13;
person.IsOk = true;
person.NickName = "小明";

如果使用物件初始設定式來初始化

Person person = new Person
{
    Name = "世界宇宙無敵鋼打姆機器人",
    Age = 13,
    IsOk = true,
    NickName = "小明"
};

2.自動屬性與傳統屬性

  1. 自動屬性:自動屬性簡化了屬性的定義,不需要顯式定義私有字段。編譯器會自動生成對應的私有字段。
    public string Name { get; set; }
    public int Age { get; set; }
    public bool IsOk { get; set; }
    
  2. 傳統屬性:傳統屬性需要顯式定義私有字段,並且可以在屬性的 getter 和 setter 中加入自訂邏輯。
    private string _nickName;
    public string NickName
    {
     get { return _nickName; }
     set { _nickName = value; }
    }
    

3.投射初始設定式(Projection Initializer)

一種用於簡化從現有物件創建新物件的語法特性。這種特性通常在 LINQ 查詢中使用,可以通過選擇並初始化新的匿名型別或已定義的類型的部分屬性來創建新物件。
以下是使用匿名型別進行投射的範例:

var people = new[]
{
    new { FirstName = "John", LastName = "Doe", Age = 30 },
    new { FirstName = "Jane", LastName = "Smith", Age = 25 },
    new { FirstName = "Sam", LastName = "Brown", Age = 35 }
};

var selectedPeople = people.Select(p => new { p.FirstName, p.LastName });

foreach (var person in selectedPeople)
{
    Console.WriteLine($"FirstName: {person.FirstName}, LastName: {person.LastName}");
}

在這個例子中,使用 LINQ 的 Select 方法,通過投射初始設定式創建一個只包含 FirstNameLastName 的新匿名型別集合。

3.1使用已定義的類型

如果需要回傳一個具名類型的對象,而不是匿名型別,可以使用已定義的類型:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Program
{
    public static void Main()
    {
        var people = new[]
        {
            new { FirstName = "John", LastName = "Doe", Age = 30 },
            new { FirstName = "Jane", LastName = "Smith", Age = 25 },
            new { FirstName = "Sam", LastName = "Brown", Age = 35 }
        };

        var selectedPeople = people.Select(p => new Person { FirstName = p.FirstName, LastName = p.LastName });

        foreach (var person in selectedPeople)
        {
            Console.WriteLine($"FirstName: {person.FirstName}, LastName: {person.LastName}");
        }
    }
}

在上述程式碼使用了 Select 方法,通過投射初始設定式創建一個 Person 類型的新集合,提高程式碼可讀性和可重用性。

3.2投射初始設定式的優點

  1. 簡潔:投射初始設定式使得從現有物件創建新物件變得直觀。
  2. 靈活:可以選擇並初始化所需的屬性,而不需要創建完整的新物件。
  3. LINQ :與 LINQ 查詢結合,能夠從資料源中選擇和投射所需的數據。

3.3投射到部分屬性

如果有一個包含多個屬性的類型,可以透過投射初始設定式創建只包含部分屬性的對象:

public class FullPerson
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }
}

public class PartialPerson
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Program
{
    public static void Main()
    {
        var fullPeople = new[]
        {
            new FullPerson { FirstName = "John", LastName = "Doe", Age = 30, Address = "123 Main St" },
            new FullPerson { FirstName = "Jane", LastName = "Smith", Age = 25, Address = "456 Elm St" },
            new FullPerson { FirstName = "Sam", LastName = "Brown", Age = 35, Address = "789 Oak St" }
        };

        var partialPeople = fullPeople.Select(p => new PartialPerson { FirstName = p.FirstName, LastName = p.LastName });

        foreach (var person in partialPeople)
        {
            Console.WriteLine($"FirstName: {person.FirstName}, LastName: {person.LastName}");
        }
    }
}

在上述程式碼從 FullPerson 類型的數據源中創建了一個只包含 FirstNameLastName 屬性的 PartialPerson 類型的新集合。

#C#






你可能感興趣的文章

[Day06] Applicative

[Day06] Applicative

Kotlin 學習社群 - Kotlin Tips

Kotlin 學習社群 - Kotlin Tips

JS30 Day 10 筆記

JS30 Day 10 筆記






留言討論