プロパティサンプル

自動プロパティ

プロパティの値を取得する

次にコードをみてください。
これは動作するでしょうか?

class MyClass
{
    public int Power
    {
        get
        {
            return Power;
        }
    }
}

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

        Console.WriteLine(myClass.Power);
    }
}

実行結果

Process is terminating due to StackOverflowException.
翻訳)スタックオーバーフローの例外が原因でプロセスは終了しています。

プロパティは、クラスの外からは変数のようにアクセスができます。また、クラスの中からはメソッドのようにアクセスできます。つまり

public int Power
{
    get
    {
        return Power;
    }
}

この部分は、クラスの中からは次のように記述されているのと同じことになるのです。

public int Power()
{
    return Power();
}

このようなコードを再帰といいます。これでは、無限ループになるのでいいことは全くありませんが、無限ループにならないよう、breakする条件をつけることで、有用なコードとすることができるため、禁止されているわけではありません。
ただ、メソッドの処理が終了した時点で、呼び出し元に戻る必要があるため、呼び出し元のアドレスは都度スタックエリアに一時的に記録するので、このように無限にメソッドを呼び出すと、エリアがパンクしてオーバーフローになってしまうのです。

上のコードでは、イメージとして、

public int power;
public int Power()
{
    return power;
}

としたかったのですから、次のように書き換えることで問題なく実行できるのです。
大文字、小文字を注意深く確認してください。(C#では大文字、小文字は違うものとして扱います)

class MyClass
{
    // フィールド
    private int power;
    // プロパティ
    public int Power
    {
        get
        {
            return power;
        }
    }
}

補足

C#3.0からは自動プロパティが使えるようになりました。
特にプロパティ内でコードを記述していなくても、プロパティとして利用する場合には、次のように簡略化することができます。

class MyClass
{
    // プロパティ
    public int Power { get; }
}

このコードだけ見ると勘違いしそうですね。
実際には、コンパイラは、このコードを次のように変換して実行しています。

class MyClass
{
    // フィールド
    private int temp;
    // プロパティ
    public int Power
    {
        get
        {
            return temp;
        }
    }
}

C#,入門

Posted by hidepon