我想做的是允许在我的类中公开递增整数值,但不允许显式公开设置。
我知道我可以创建这样的函数:
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/