プログラマーな日々

プログラマーをやっています。好きなものは、C#, TaskChute Cloud, WorkFlowy, Backlog, AWSです。

【.NET Compiler Platformの新機能】Primary constructors

前回のエントリーでは、NET Compiler Platformの新機能を使ってImmutableなクラスを記述しました。
【.NET Compiler Platform】Primary constructorsでImmutableなクラスを記述する - プログラマーな日々
Primary constructorsで、Immutableなクラスを記述してみます。 ...

その際に使った.NET Compiler Platformの新機能を解説します。今回はPrimary constructorsです。

Primary constructorsとは

明示的なコンストラクタ宣言なしで、クラスや構造体に直接コンストラクタパラメータを宣言する記法です。

従来の記法

Primary constructorsを使用しない従来の記法では、以下のようになります。

class ParsonClass {
    private string firstName;
    private string LastName;

    public ParsonClass(string firstName, string lastName) {
        this.firstName = firstName;
        this.LastName = lastName;
    }
}

struct ParsonStruct {
    private string firstName;
    private string LastName;

    public ParsonStruct(string firstName, string lastName) {
        this.firstName = firstName;
        this.LastName = lastName;
    }
}

Primary constructorsを使用した記法

Primary constructorsを使うと、コンストラクタ宣言をなくすことができます。

class ParsonClass(string firstName, string lastName) {
    private string firstName = firstName;
    private string LastName = lastName;
}

struct ParsonStruct(string firstName, string lastName) {
    private string firstName = firstName;
    private string LastName = lastName;
}

別のコンストラクタからPrimary constructorsを呼び出す

こんなこともできます。

using System;

namespace PrimaryConstructor1 {
    class Program {
        static void Main(string[] args) {
            {
                Parson p = new Parson("Taro", "Sato");
                Console.WriteLine(p.FullName);  // "Taro  Sato"が出力される
            }
            {
                Parson p = new Parson("Jiro", "Suzuki", "M");
                Console.WriteLine(p.FullName);  // "Jiro M Suzuki"が出力される
            }
            Console.ReadKey();
        }
    }

    class Parson(string firstName, string lastName) {
        private string firstName = firstName;
        private string LastName = lastName;
        private string middleName;

        public Parson(string firstName, string lastName, string middleName) : this(firstName, lastName) {
            this.middleName = middleName;
        }

        public string FullName {
            get {
                return string.Format("{0} {1} {2}", this.firstName, this.middleName, this.LastName);
            }
        }
    }
}