C#のコーディング(アクセサ)で苦戦

|

 C#で苦戦しました。苦戦したのは、単純な事ですが、1時間ぐらい悩んでいました。C#の機能に、アクセサを作成する機能があります。記述するとこんな感じでした。

public string name {
    set {
        name = value;
    }
    get {
        return name;
    }
}

使用する場合は、obj.nameのように使います。コンパイルは、通りますが、実行するとスタックオーバーフローに、無限ループが起こったようです。nameに設定しようとすると、設定する値が、nameに代入されますが、この時に、nameがsetterを呼びます。後は、この繰り返しで、getterも同じことでしょう。

なぜ、1時間も悩んでいたかと言うと、別の機能では、C++マネージ拡張で作成していて、現在作業している必要な機能が、C#で作成されている為、似たような機能をC++マネージ拡張から真似してC#に移植しました。それで、C++マネージ拡張からC#のコーディングに変えようと一気に変えたのとC#になれていなかったので、原因がなかなか分かりませんでした。

問題なく、コードを記述するには、以下のようにコーディングする必要があります。

string m_name;

public string name {
    set {
        m_name = value;
    }
    get {
        return m_name;
    }
}

これって、そこまでメリットあるの?と思ってしまう機能と思いませんか?扱っているC#は、バージョンが2.0以降ではない為、setter,getterレベルで、アクセス修飾子を変更できないので、さらに厄介です。

Javaに慣れていたら、Eclipseのようなアクセサ作成の方が、楽です。やるならせめてRubyのアクセサレベルなら良いのですが...。