.net column

.NET開発者のためのブログメディア

C#でプロパティの初期値を設定する方法とは?様々な方法を紹介!

2020年07月13日

SE
C#でプロパティの初期値を設定するにはどうしたらいいのでしょうか?

PM
コンストラクタから初期値を与える方法や、直接代入する方法があります。

C#でプロパティの初期値を設定するために

この記事では、クラスメンバの値を設定したり参照したりするときに使うプロパティの初期値の設定方法を紹介します。

クラスやプロパティについて簡単に説明し、コンストラクタから初期値を与える方法と直接代入する方法の2点を紹介します。

クラス・プロパティとは?

この項では、後に誤解が生じないようにC#のクラスやクラスメンバ、そしてプロパティの利用方法について簡単に説明します。

クラスとは?

クラスは、したい処理群に対して様々な変数や関数をまとめて設計する機能です。インスタンスを用いて実体化できます。

大体の場合、そのインスタンスからクラスの変数・関数を参照します。例えば、このように使います。以下のコードをC#で記述し、実行します。

using System;
using System.ComponentModel.DataAnnotations;

public class Human // Humanクラスを定義
{
private string name;
public Human() // コンストラクタを定義
{
name = “”Jhon””;
}
public void SayHello() // SayHello関数を定義
{
Console.WriteLine(“”Hello, {0}!””, name);
}
}

public class Program
{
static void Main()
{
Human human = new Human(); // クラスHumanからインスタンスを作成
human.SayHello(); // インスタンスから関数を呼び出す
}
}

[出力]
Hello, Jhon!

Humanクラスを定義し、Main関数内で
Human human = new Human();
とすることでHumanクラスからインスタンスを作成し、human変数に格納しています。最後に
human.SayHello();
とするとで、Humanクラス内で定義したSayHello()関数を呼び出しています。

Humanクラスの定義では、public Human()から始まるコンストラクタを定義しています。これを使って、クラスのメンバnameを値""John""に初期化し、

SayHello関数内の出力に利用しています。以下のコードをC#で記述し、実行します。

プロパティとは?

プロパティは、オブジェクト指向の3大要素の中で、クラスの必要な情報だけ利用できるようにする「カプセル化」概念を簡潔に実装するために存在するC#の機能です。

プロパティを用いることで、「この変数はクラス外からは読み取りだけしたい」といった処理を簡潔に書くことが出来ます。

例えば、このように使います。

using System;
using System.ComponentModel.DataAnnotations;

public class Human // Humanクラスを定義
{
public string Name { get; private set; }
public Human() // コンストラクタを定義
{
Name = “”Jhon””;
}
public void SayHello() // SayHello関数を定義
{
Console.WriteLine(“”Hello, {0}!””, Name);
}
}

public class Program
{
static void Main()
{
Human human = new Human(); // クラスHumanからインスタンスを作成
human.SayHello(); // インスタンスから関数を呼び出す
Console.WriteLine(“”human’s name = {0}””, human.Name); // インスタンス内の変数Nameを参照

// コンパイルエラー setをプライベートにしているため外部から代入できない
// human.Name = “”Becky””;
}
}

[出力]
Hello, Jhon!
human's name = Jhon

先ほどはname変数の定義を
private string name;
としていましたが、今回はプロパティを用いて
public string Name{get; private set;}
としています。最初のprivate string nameはprivate変数のため外部からの代入も参照もできません。

それと違い、後者はプロパティでget; private set;としていることで「外部から参照はできるが代入はできない」という状態にできます。

getが参照、setが代入でgetだけprivateを外しているのでこういったことになります。また、プロパティを持つpublic変数は慣例的に頭を大文字にします。覚えておきましょう。

C#でプロパティの初期値を設定する方法を紹介!

この項では、C#でプロパティの初期値を設定する方法を紹介します。

プロパティ初期化子を用いた方法

プロパティ初期化子を用いることで、簡潔にプロパティの初期化を行うことが出来ます。以下のコードをC#で記述し、実行します。

using System;
using System.ComponentModel.DataAnnotations;

public class Human // Humanクラスを定義
{
public string Name { get; set; } = “”田中””; // プロパティ初期化子を用いて初期化
public void SayHello() // SayHello関数を定義
{
Console.WriteLine(“”Hello, {0}!””, Name);
}
}

public class Program
{
static void Main()
{
Human human = new Human(); // クラスHumanからインスタンスを作成
human.SayHello(); // インスタンスから関数を呼び出す
}
}

[出力] Hello, 田中!

先ほどのプロパティの紹介ではコンストラクタを通じてプロパティの初期値を代入していましたが、プロパティ初期化子を用いてこのように記述することも可能です。

インスタンスごとにプロパティの初期値を変える必要が無い場合、このプロパティ初期化子を用いてプロパティの初期値を設定する方法が簡潔です。

コンストラクタを用いた方法

コンストラクタを用いることで、複雑な処理を内包する初期化を記述することが出来ます。以下のコードをC#で記述し、実行します。

using System;
using System.ComponentModel.DataAnnotations;

public class Human // Humanクラスを定義
{
public string Name { get; set; }

// 引数familyName(姓), firstName(名), isJapanese(日本人かどうか示すフラグ)
// を持つコンストラクタの定義
public Human(string familyName, string firstName, bool isJapanese)
{
if (isJapanese) // 日本人なら
Name = familyName + “” “” + firstName; // 姓 + 名をフルネームとする
else // それ以外なら
Name = firstName + “” “” + familyName; // 名 + 姓をフルネームとする
}

public void SayHello() // SayHello関数を定義
{
Console.WriteLine(“”Hello, {0}!””, Name);
}
}

public class Program
{
static void Main()
{
Human humanA = new Human(“”鈴木””, “”一郎””, true); // クラスHumanからインスタンスを作成
Human humanB = new Human(“”Joestar””, “”Joseph””, false);
humanA.SayHello(); // インスタンスから関数を呼び出す
humanB.SayHello();
}
}

[出力]
Hello, 鈴木 一郎!
Hello, Joseph Joestar!

このように、コンストラクタ内で引数を用いたプロパティの初期値の設定処理を行いたいときはコンストラクタからの初期化を行います。

今回の例では、日本人であれば姓 + 名、そうでなければ名 + 姓をNameの初期値とするコンストラクタを作成しています。

SE
プロパティ初期化子やコンストラクタを用いた方法でプロパティを初期化することができるのですね。

PM
そうですね。プロパティの初期化を行うことで、クラスの可読性向上や処理の高速が見込めます。

プロパティの初期化を使おう!

この記事では、C#のプロパティの初期値を説明するため、最初にC#のクラスやプロパティについて簡単に説明しました。そしてそれらを前提知識としてC#のプロパティの初期値の設定方法をプロパティ初期化子とコンストラクタを用いた二つの方法で紹介しました。

プロパティの初期化を上手くやることで、クラスの可読性の向上や処理の高速化につながります。したい処理にあった方法を心がけましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)