Properties
Bill Baxter
wbaxter at gmail.com
Thu Jan 8 18:10:28 PST 2009
On Fri, Jan 9, 2009 at 11:01 AM, Miles <_______ at _______.____> wrote:
> Bill Baxter wrote:
>> On Fri, Jan 9, 2009 at 9:59 AM, Miles <_______ at _______.____> wrote:
>>> Both the getter and the setter should return an rvalue. Properties exist
>>> so that they are interchangeable with real member variables.
>>
>> Partly, but also properties exist to provide encapsulation of private state.
>> So you gotta be careful when you say they should always return an lvalue.
>
> Wait! Read again what I said... getters and setters should return an
> *rvalue*, not lvalue. Everything else you said was based on the idea
> that accessors return lvalues, that wasn't what I said...
>
> There are some very special conditions where the getter MAY return an
> lvalue. But nothing else. The setter always returns rvalues.
>
> For example, if prop is a common property, defined as:
>
> public property int width {
> get() { return m_width; }
> set(Point value) { return m_width = value; }
> }
>
> Then the following code:
>
> x.width += 5;
>
> Should expand to something like (hopefully, optimized as far as possible):
>
> {
> auto tmp = x._get_width();
> tmp += 5;
> x._set_width(tmp);
> }
>
> On the other hand, if the getter is defined to return an lvalue, like
> (tentative syntax):
>
> public property int width {
> ref get() { return m_width; }
> set(Point value) { return m_width = value; }
> }
>
> Then the compiler should be able to optimize the same code further:
>
> x._get_width() += 5;
>
> The same for member function calls if the property type is a structure
> or class.
Ok! I'm in agreement with you totally on all that. Sorry for the
lvalue/rvalue mixup.
--bb
More information about the Digitalmars-d
mailing list