C#允许公共增加属性,但不允许显式设置

时间:2014-09-29 22:34:05

标签: c# private-members post-increment

我想要做的是允许我的类中的整数值的公共增量,但不允许它公开设置

我知道我可以创建这样的函数:

void IncrementMyProperty()

但我想允许用户这样做:

MyClass.Property++;

不允许这样做:

MyClass.Property = <SomeInt>;

这只是为了方便。我只是想知道是否有办法做到这一点。


以下是一个例子:

class MyClass
{
    private int _count;

    public int Count
    {
        get { return _count; }
        private set { _count = value; }
    }

    public void AddOne()
    {
        _count++;
    }
}

class Program
{
    static void Main()
    {
        MyClass example;

        for (int i = 0; i < 10; i++)
            example.Count++;
    }
}

显然这不会编译。这只是为了展示我想做的事情。

3 个答案:

答案 0 :(得分:4)

嗯,可能,但解决方案非常难看。

您可以创建一个重载++运算符的类型,并创建该类型的属性,其中setter不执行任何操作。这将允许您在属性上使用++运算符,但无法使用属性setter实际设置属性:

class MyValue {

  public int Value { get; private set; }

  public MyValue(int value) {
    Value = value;
  }

  public static MyValue operator ++(MyValue v) {
    v.Value++;
    return v;
  }

}

class MyClass {

  private MyValue _count = new MyValue(0);

  public MyValue Count {
    get { return _count; }
    set { }
  }

}

用法:

MyClass c = new MyClass();
c.Count++;
Console.WriteLine(c.Count.Value); // outputs 1

所以......以这种方式使用++运算符并不是一个好的解决方案。通常情况下,你没有一个什么也不做的二传手,只会让人感到困惑。使用增加计数器的方法并不像写++一样简短,但只要您将其命名为明确它的作用就不会让人感到困惑。

答案 1 :(得分:3)

没有办法。 MyClass.MyProperty++字面翻译为使用“setter”的MyClass.MyProperty = MyClass.MyProperty + 1,如果您允许使用“setter”访问者,则允许使用MyClass.MyProperty = <any value>;

答案 2 :(得分:1)

如果增加int属性则不行。但你可以编写example++并重载你的类的++运算符来增加Count,同时删除它的setter。