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

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

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

最佳答案

好吧,这可能,但解决方案非常难看。

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

所以...以这种方式使用++ 运算符不是一个好的解决方案。通常你没有什么都不做的二传手,那只会让人感到困惑。有一个增加计数器的方法并不像写++那么简单,但只要你给它起个名字就不会混淆,这样就很清楚它做了什么。

关于C# 允许公开增加属性,但不允许显式设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26109994/

相关文章:

c++ - 如何使线程访问类的私有(private)成员

JavaScript 和私有(private)变量

c++ - 增量、前增量和后增量

c# - 哪种设计模式最适合每个客户方法的多种实现?

c# - 在 Windows Form 1 Load 上隐藏 Form 1 和 Show form 2

c# - 如何正确打开mysql连接?

c# - 可以在闭包中 Lock() 吗?这在 Lambda 和代码输出中是什么样子的?

c++ - C++ 中的 i++ 和++i 之间有性能差异吗?

javascript - Closure 编译器 - a++ >= 3 可以变成++a > 3 吗?

c# - 用 using(...) { } 语句包装 Application.Run(new Form()) 是否安全?