滅入るんるん

何か書きます

Kotlin使いのためのC#入門 Properties and Fields

> Top

Declaring Properties

Kotlin同様C#にもプロパティは存在しますが、Kotlinと記法はかけ離れたものと言えるでしょう。

class Property
{
    // 自動実装プロパティ
    public int Id { get; set; }

    // getter onlyな自動実装プロパティ
    public string Name { get; }

    // 自動実装プロパティには初期値を与えることができる
    public string Url { get; } = string.Empty;
}

Kotlinにはフィールドがなく、すべてプロパティを宣言する必要がありましたが、C#にはフィールドがあるため、必要な情報のみプロパティで公開すればいいです。 そのためプロパティにprivate修飾子が付くことは稀でしょう。

話がそれましたが、C#には自動実装プロパティというものがあります。これがKotlinでのcustom getter/setterのないvarvalのC#版と言えるでしょう。 本来ならばプロパティのgetsetは処理を記述する必要がありましたが、いちいちbacking fieldを宣言し処理を記述するのは手間がかかるため、C#のバージョンアップとともに糖衣構文が追加されて行きました。 その一つが自動実装プロパティです。自動実装プロパティはコンパイラーがgetter/setterとbacking fieldを自動的に実装しています。

class Value
{
    public void Main()
    {
        var property = new Property();
        property.Id = 10;
        string name = property.Name;       
    }
}

また、プロパティにアクセスするにはフィールドと同じように書くだけです。

Getters and Setters

Custom getter/setterを記述するには以下のように書きます。

class Property
{
    // フィールドをbacking fieldとしている
    private string _name;
    public string Name {
        get {
            return _name;
        }
        set {
            _name = value;
        }
    }
}

setterでの引数はvalue変数に格納されています。

また、単純なgetter/setterは式風に記述することも可能です。

class Property
{
    private string _name;
    public string Name {
        get => _name;
        set => _name = value;
    }
}

また、getterのみの場合はもっと簡単な式風の記述を行うこともできます。

class Property
{
    private string _name;
    public string Name => _name;
}

setterの可視性を下げる記法もあります。

class Property
{
    public string Name { get; private set; }
}

Backing Fields

C#にはフィールドが存在するため不要。

Backing Properties

C#にはフィールドが存在するため不要

Compile-Time Constants

C#にはコンパイル時定数としてconstフィールドが存在します。

class Property
{
    public const string DefaultName = "DefaultName";
}

コンパイル時定数とするには右辺がコンパイル時に確定するリテラルまたは値である必要があります。 例を挙げると、intboolなどの基本データ型と例外的にstringが認められています。

Late-Initialized Properties and Variables

仕組み上C#には必要がないため割愛。

Overriding Properties

参照: Classes and Inheritance #Overridng Properties

Delegated Properties

C#には存在しないため割愛。