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のないvar
とval
のC#版と言えるでしょう。
本来ならばプロパティのget
とset
は処理を記述する必要がありましたが、いちいち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"; }
コンパイル時定数とするには右辺がコンパイル時に確定するリテラルまたは値である必要があります。
例を挙げると、int
やbool
などの基本データ型と例外的にstring
が認められています。
Late-Initialized Properties and Variables
仕組み上C#には必要がないため割愛。
Overriding Properties
参照: Classes and Inheritance #Overridng Properties
Delegated Properties
C#には存在しないため割愛。