C#3.0(Visual Studio 2008)からは、自動実装プロパティなる物が使えるようになりました。
C#2.0までのプロパティの実装は、こんな感じ↓
class Contrast
{
private double _scale = 1.0;
public double Scale
{
get
{
return _scale;
}
set
{
_scale = value;
}
}
private double _offset = 0.0;
public double Offset
{
get
{
return _offset;
}
set
{
_offset = value;
}
}
}
で行っていたかと思いますが、C#3.0からは、自動実装プロパティでは、
class Contrast
{
public double Scale { get; set; }
public double Offset { get; set; }
}
のように書くことができます。
これで、ずいぶんシンプルで見やすくなるかと思います。
また、プロパティを読み取り専用にするには set; の前に private を付けて
class Contrast
{
public double Scale { get; set; }
public double Offset { get; private set; }
}
とします。
C#6.0(Visual Studio 2015)からは自動プロパティを以下のようにすることで、初期化を行う事ができます。
class Contrast
{
public double Scale { get; set; } = 1.0;
public double Offset { get; set; } = 0.0;
}
さらにC#6.0からは、読み取り専用にプロパティを get; のみの記述で可能となります。
ただし、値を変更できるのは、コンストラクタのみとなります。(他のメソッド等からは変更できません。)
class Contrast
{
public double Scale { get; set; } = 1.0;
public double Offset { get; } = 0.0;
public Contrast(double scale, double offset)
{
this.Scale = scale;
this.Offset = offset;
}
}
パフォーマンスの比較
C#2.0まで、処理速度が必要な部分では、プロパティの参照は遅いので、クラス内での処理ではプロパティを参照せず、フィールドの値を参照するようにしていたのですが、フィールドの無い、自動プロパティではどうか?確認してみました。
以下のように、C#2.0の時のプロパティを使った Class1 と、自動実装プロパティを使った Class2 を作成し、ただ、値を取得するだけのメソッド(GetValue)を作成しました。
class Class1
{
private double _a = 1.0;
public double A
{
get
{
return _a;
}
set
{
_a = value;
}
}
public double GetValue()
{
return _a;
}
}
class Class2
{
public double A { get; set; } = 1.0;
public double GetValue()
{
return this.A;
}
}
このGetValue()メソッドをそれぞれ、10億回繰り返した時の処理時間を5回計測したときの平均処理時間は、以下の通りでした。
Class1 | 273.6 msec |
Class2 | 552 msec |
プロパティ参照は、プロパティの内部でエラー処理などを行っている場合も多いので、そのために遅い場合もありますが、単純にプロパティ参照するだけでも遅い結果でした。
そのため、パフォーマンスが必要な場合は、昔の書き方もありですね。
参考ページ
自動実装するプロパティを使用して簡易クラスを実装する方法 (C# プログラミング ガイド)
← C#2.0からの脱却 へ戻る