【问题标题】:C# allow public incrementation of property, but not explicit setingC# 允许公开增加属性,但不允许显式设置
【发布时间】:2014-11-24 10:36:17
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果不做一些愚蠢的事情,比如提到的运算符重载,这是不可能的。这可能是为了方便,但您最终会生成难以维护的代码。
  • 我就是这么想的。不过谢谢!
  • 谁方便?该方法方式是一个清晰且可预测的解决方案。允许 ++ 但不允许 = 不是那么方便而是令人困惑,还是你一个人?
  • @TaW 我不认为它令人困惑。理论上,如果其他人试图错误地使用我的课程,我使用= 他们会收到一个异常,解释为什么不能那样使用它。无论如何,这只是一个难题。

标签: c# private-members post-increment


【解决方案1】:

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

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

所以...以这种方式使用++ 运算符不是一个好的解决方案。通常你没有什么都不做的setter,那只会令人困惑。有一个增加计数器的方法不像写++那么短,但是只要你命名它就不会混淆,这样它的作用就很清楚了。

【讨论】:

  • 这个答案不仅详细解释了如何做到这一点,还包括为什么你不应该。它提供了一种方法来完成我最初的要求。因此,我觉得它必须被命名为公认的答案。其他答案非常有用,任何未来的读者都应该查看。
【解决方案2】:

没有办法。 MyClass.MyProperty++ 字面意思是MyClass.MyProperty = MyClass.MyProperty + 1,它使用“setter”,如果您允许“setter”访问器,那么您将允许,例如,MyClass.MyProperty = &lt;any value&gt;;

【讨论】:

  • 它实际上调用了++ 运算符(也就是说,它不是字面直接翻译)。但是我相信重新分配是不可避免的。
  • @Keyvan Sadralodabai 我也想通了。感谢您的确认。
  • 我试着让 Count 成为一个带有重载运算符 ++ 的类。不工作。问题是 operator ++ 是一个返回新实例的静态函数。正在调用 set 访问器。如果有人想看,我会发布代码。
【解决方案3】:

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

【讨论】:

  • 是的,这是正确的方法。但这并不是我想要做的。实际的实现在一个更复杂的类中。感谢您的帮助!
猜你喜欢
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 2014-10-10
相关资源
最近更新 更多