C#

【C#3.0~】自動実装プロパティ

スポンサーリンク

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回計測したときの平均処理時間は、以下の通りでした。

 

Class1273.6 msec
Class2552 msec

 

プロパティ参照は、プロパティの内部でエラー処理などを行っている場合も多いので、そのために遅い場合もありますが、単純にプロパティ参照するだけでも遅い結果でした。

 

そのため、パフォーマンスが必要な場合は、昔の書き方もありですね。

 

参考ページ

自動実装するプロパティ (C# プログラミング ガイド)

自動実装するプロパティを使用して簡易クラスを実装する方法 (C# プログラミング ガイド)

 

← C#2.0からの脱却 へ戻る

コメント

タイトルとURLをコピーしました