🐷

[.NET/C#] primary constructor

2024/05/18に公開

primary constructor を使った書き方、とそれ以前の書き方を比較して書いてみました。
書く量が減るので、単純なデータクラスとか構造体は、新しい書き方がよさそうな気がします。

伝統的な書き方例

銀行ライブラリにある「取引」クラスの例。

BankLibrary_Taditional.cs
namespace BankLibrary
{
    /// <summary>
    /// 取引
    /// </summary>
    public class Transaction
    {
        /// <summary>
        /// 実施日時
        /// </summary>
        public DateTime RunDateTime { get; set; }

        /// <summary>
        /// 金額
        /// </summary>
        /// <remarks>
        /// マイナスの場合は出金、プラスの場合は入金。
        /// </remarks>
        public int Amount { get; set; }

        /// <summary>
        /// 実行後の残高
        /// </summary>
        public int ResultBalance { get; set; }

        /// <summary>
        /// 取引クラスのコンストラクタ
        /// </summary>
        /// <param name="runDateTime">取引実行日時</param>
        /// <param name="amount">取引金額(マイナスの場合は出金、プラスの場合は入金)</param>
        /// <param name="resultBalance">取引実行後の残高</param>
        public Transaction(DateTime runDateTime, int amount, int resultBalance)
        {
            this.RunDateTime = runDateTime;
            this.Amount = amount;
            this.ResultBalance = resultBalance;
        }
    }
}

primary constructor の例

銀行ライブラリにある「取引」クラスの例。
なお、クラスや構造体での primary constructor は C# 12.0(.NET8) 以降でサポートされています。

BankLibrary_PrimaryConstructor.cs

namespace BankLibrary
{
    /// <summary>
    /// 取引
    /// </summary>
    /// <remarks>
    /// クラスや構造体での primary constructor は C# 12.0(.NET8) 以降でサポートされています。
    /// </remarks>
    /// <param name="runDateTime">取引実行日時</param>
    /// <param name="amount">取引金額(マイナスの場合は出金、プラスの場合は入金)</param>
    /// <param name="resultBalance">取引実行後の残高</param>
    public class Transaction(ref readonly DateTime runDateTime, in int amount, in int resultBalance)
    {
        /// <summary>
        /// 実施日時
        /// </summary>
        public DateTime RunDateTime { get; set; } = runDateTime;

        /// <summary>
        /// 金額
        /// </summary>
        /// <remarks>
        /// マイナスの場合は出金、プラスの場合は入金。
        /// </remarks>
        public int Amount { get; set; } = amount;

        /// <summary>
        /// 実行後の残高
        /// </summary>
        public int ResultBalance { get; set; } = resultBalance;
    }
}


Discussion