2014-09-29 65 views
4

我想要做的是允许公开增加我的班级中的整数值,但不允许公开地明确设置C#允许公开增加财产,但不明确注册

我知道我可以创建这样一个功能:

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

显然,这将无法编译。这只是为了表明我想要做什么。

+1

这是不可能没有做一些愚蠢的东西,如提到的运算符重载。这可能是为了方便,但最终会产生难以维护的代码。 – CSharpie 2014-09-29 22:38:51

+0

这就是我想的。虽然谢谢! – OneHoopyFrood 2014-09-29 22:39:49

+0

谁的方便?方法的方式是一个清晰可预见的解决方案。允许++但不是=并不那么方便,但令人困惑,或者你是一个人吗? – TaW 2014-09-29 23:29:31

回答

4

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

您可以创建一个重载++运算符的类型,并创建该类型的属性,其中setter不执行任何操作。使用++

MyClass c = new MyClass(); 
c.Count++; 
Console.WriteLine(c.Count.Value); // outputs 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 { } 
    } 

} 

用法运营商以这种方式不是一个好的解决方案。通常情况下,你没有一个无所谓的二传手,这只会让人困惑。有一种增加计数器的方法并不像写作++那么简短,但只要你命名它就能清楚它的作用,它不会混淆。

+0

这个答案不仅包含了如何做到这一点的详细解释,还包括了为什么你不应该这样做。它提供了一种方法来完成我最初提出的问题。因此我觉得它必须被命名为被接受的答案。其他答案非常丰富,应该被任何未来的读者看好。 – OneHoopyFrood 2014-09-29 23:02:21

3

没有办法。 MyClass.MyProperty++字面翻译为MyClass.MyProperty = MyClass.MyProperty + 1,它采用了“二传手”,如果你允许一个“二传手”的访问,那么你将允许,例如,MyClass.MyProperty = <any value>;

+1

它实际上调用'++'操作符(即,它不是*直接翻译)。但我相信重新分配是不可避免的。 – user2864740 2014-09-29 22:39:47

+0

@Keyvan Sadralodabai我的想法很多。感谢您的确认。 – OneHoopyFrood 2014-09-29 22:41:48

+2

不应该这样,“MyClass.MyProperty ++从字面上翻译为MyClass.MyProperty = MyClass.MyProperty + 1”? – 2014-09-29 22:47:32

1

不是如果你递增整型属性。但您可以编写example++并为您的班级重载++运算符,以便在删除其setter时增加Count

+1

是的,这是正确的方法。但这并不是我想要做的。实际的实现是在一个更复杂的类中。谢谢你的帮助! – OneHoopyFrood 2014-09-29 22:44:57