プロパティ (property)

アクセサ (accessor)

set {accessor-body}
get {accessor-body}
アクセサ (C#) | MSDN set キーワード - C# reference | Microsoft Learn get キーワード - C# reference | Microsoft Learn

式形式 (expression bodied)

C# 7.0以降ならば、アクセサをラムダ式で記述できます。構文:メソッドやプロパティをラムダ式で簡潔に実装するには?[C# 6.0/7.0]:.NET TIPS - @IT山本康彦 (2017/07/05)

private int a;

public int A
{
    get => a;
    set => a = value;
}

自動実装プロパティ (Auto-Implemented Property)

プロパティの宣言を簡略化できます。

※自動実装プロパティがサポートされるのは、C# 3.0 (Visual Studio 2008) 以降です。

アクセサの実装コードをセミコロン (;) に置き換えることで、自動実装プロパティとなります。なお自動実装プロパティには、getとsetの両方のアクセサが必須です。

通常のプロパティ 自動実装プロパティ
class MyClass
{
    private int a;

    public int A
    {
        get { return a; }
        set { a = value; }
    }
}
class MyClass
{
    public int A
    {
        get;
        set;
    }
}
※プロパティのフィールド (バッキング フィールド) は、コンパイラによって自動的に作成されます。

アクセス制限

アクセサはgetとsetの両方が必須となるため、それを削除することはできず、アクセス修飾子を付加することでアクセス制限を実現します。

読み取り専用
通常のプロパティ 自動実装プロパティ
class MyClass
{
    private int a;

    public int A
    {
        get { return a; }
    }
}
class MyClass
{
    public int A
    {
        get;
        private set;
    }
}

C# 6.0以降ならばラムダ式を用いて次のように記述することで、読み取り専用とできます。

private int a;

public int A => a;

インデクサ (Indexers) / 引数を取るプロパティ

インデクサとは、クラスのインスタンスに対して、配列の要素のようにインデックスを付けてアクセスできるようにする機能です。

public class MyClass
{
    double[] x = new double[10];

    public double this[int index] // プロパティの名前をthisとする
    {
        get
        {
            return x[index];
        }
        set
        {
            x[index] = value;
        }
    }
}

static void Main(string[] args)
{
    MyClass myClass = new MyClass();

    myClass[5] = 100; // インデックスを付けてアクセスできる
    double b = myClass[5];
}
Microsoft Learnから検索