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

本文关键字:不允许 设置 许公开 增加 属性 | 更新日期: 2023-09-27 18:24:58

我想做的是允许在类中公开递增整数值,但不允许显式公开设置它

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

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++;
    }
}

显然这不会编译。这只是为了展示我想做什么。

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

嗯,这是可能的,但解决方案非常丑陋。

您可以创建一个重载++运算符的类型,并在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

所以。。。以这种方式使用CCD_ 3运算符不是一个好的解决方案。通常情况下,你没有一个什么都不做的二传手,这只会让人困惑。有一个增加计数器的方法并不像写++那么短,但只要你命名它,让它清楚地做什么,它就不会令人困惑。

没有办法。MyClass.MyProperty++的字面意思是MyClass.MyProperty = MyClass.MyProperty + 1,它使用"setter",如果您允许"setter(设置器)"访问器,则您将允许(例如)MyClass.MyProperty = <any value>;

如果您递增int属性,则不会。但是,您可以编写example++并重载类的++运算符以递增Count,同时删除其setter。