使用 get 属性 时省略左值

Omit lvalue when using get property

我有一个构建器可以帮助我构建中央字符串。该构建器包含关键字的方法和特殊字符的属性,例如:

class MyBuilder
{
    private StringBuilder bld;
    public MyBuilder() { bld = new StringBuilder(); }
    public MyBuilder KeyWord_1(string param)
    {
        this.bld.Append("Some_Keyword ").Append(param);
        return this;
    }

    public MyBuilder C_()
    {
        this.bld.Append(',');
        return this;
    }

    public MyBuilder C
    {
        get { return this.C_(); }
    }
}

然后我像这样使用它:

var bld = new MyBuilder();

bld.KeyWord_1("some value").C;

什么明显地抛出错误:

error CS0201: Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement

所以我不得不使用:

var bld = new MyBuilder();

bld.KeyWord_1("some value").C_();

是否可以像在无效示例中那样使用 属性 或类似的方式(例如,只是 C - bld.C - 不带括号)?

改变这个:

bld.KeyWord_1("some value").C;

收件人:

bld = bld.KeyWord_1("some value").C;

说明: 这样做的原因是您不能仅通过 getter 访问 属性 并且 什么都不做 因为它不是有效的语句(代码行)。您的 属性 returns MyBuilder 实例,您应该以某种方式使用它(分配给某个字段,将其作为参数传递给方法等等)。

Is it possible to use property like in invalid example or in similar way (like, just C - bld.C - without parentheses)?

恐怕不是因为 属性 get 访问器只能用来获取值,这个值必须以某种方式使用...

然而,可以做的是创建这样的属性列表:

class MyBuilder
{
    private StringBuilder bld;
    public MyBuilder() { bld = new StringBuilder(); }
    public MyBuilder KeyWord_1(string param)
    {
        this.bld.Append("Some_Keyword ").Append(param);
        return this;
    }

    public MyBuilder C
    {

        get { this.bld.Append(','); return this; }
    }

    public MyBuilder D
    {
        get { this.bld.Append(':'); return this; }
    }

    public MyBuilder E
    {
        get { this.bld.Append('-'); return this; }
    }

    public MyBuilder F
    {
        get { this.bld.Append('+'); return this; }
    }

    public MyBuilder G
    {
        get { this.bld.Append('-'); return this; }
    }
}

并在一行中调用您的属性:

 static void Main(string[] args)
        {
            var bld = new MyBuilder();

            bld = bld.KeyWord_1("some value").C.D.E.F.G;
        }