property

C++で、あるprivateなメンバ変数に対して、読み取り用関数のみ提供したい場合は以下のように書くと思います。

class C {
    int length;
public:
    C() : length(100) {}
    int getLength() const {
        return length;
    }
};
int main()
{
    C c;
 
    int len = c.getLength();
    return 0;
}

C++/CLIではプロパティを使って以下のようにかけます。

ref class C {
    int length;
public:
    C() : length(100) {}
    property int Length
    {
        int get() { return length; }
    }
};
int main()
{
    C c;
    int len = c.Length;
    return 0;
}

次に値を設定したい場合を考えます。値の設定範囲として0から100までとし、それ以外の値の場合は無視するとします。C++では以下のようになります。

class C {
    int length;
public:
    C() : length(100) {}
    int getLength() const {
        return length;
    }
    void setLength(int len) {
        if ( 0 <= len && len <= 100 )
            length = len;
    }
};
int main()
{
    C c;
 
    c.setLength(50);
    return 0;
}

propertyを使うと以下のようになります。

ref class C {
    int length;
public:
    C() : length(100) {}
    property int Length
    {
        int get() { return length; }
        void set(int value) {
            if ( 0 <= value && value <= 100 )
                length = value;
        }
    }
};
int main()
{
    C c;
    c.Length = 50;
    return 0;
}

また上記の例で、宣言と実装を分けて書くと以下のようになります。

ref class C 
{
    int length;
public: 
    C() : length(100) {}
    property int Length 
    {
        int get();
        void set(int value);
    }
};
int C::Length::get()
{
    return length;
}
void C::Length::set(int value)
{
    if ( 0 <= value && value <= 100 )  
        length = value;
}
int main()
{
    C c;
    c.Length = 50; 
    return 0;
}

アクセス指定子をgetとsetで別々に書くこともできます。

public ref class C 
{
    int length;
public: 
    C() : length(100) {}
    property int Length 
    {
    public:
        int get();
    internal:
        void set(int value);
    }
};

Trivial Property

get()やset()を明示的に書かなくても、コンパイラが勝手に作ってくれます。

public ref class C
{
public:
    property int Length;
};