2014-09-29 7 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

+0

Вот что я понял. Спасибо хоть! – OneHoopyFrood

+0

Чье удобство? Метод метод является четким и предсказуемым решением. Разрешить ++, но не = не так удобно, но сбивать с толку, или вы все в одиночку? – TaW

ответ

4

Ну, это возможно, но решение довольно уродливое.

Вы можете создать тип, который перегружает оператор ++ и создает свойство такого типа, когда сеттер ничего не делает. Это позволит вам использовать оператор ++ на имущество, но это не представляется возможным фактически установить свойство используя свойство сеттер:

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 

Итак ... с помощью ++ оператор таким образом не является хорошим решением. Обычно у вас нет сеттера, который ничего не делает, это будет только путать. Наличие метода, который увеличивает счетчик, не так короток, как написание ++, но это не будет путать, если вы назовете его так, чтобы было ясно, что он делает.

+0

Этот ответ содержит подробное объяснение не только _how_ для этого, но и почему вы не должны. Он предоставляет средства для выполнения того, что я изначально задавал. Таким образом, я считаю, что его нужно называть принятым ответом. Другие ответы очень информативны, и их следует рассматривать любым будущим читателем. – OneHoopyFrood

3

Невозможно. MyClass.MyProperty++ буквально переводится MyClass.MyProperty = MyClass.MyProperty + 1, который использует «сеттер», и если вы позволите «сеттер» сбруя тогда вы позволили бы, например, MyClass.MyProperty = <any value>;

+1

Он фактически вызывает оператор '++' (т. Е. Это * не * буквальный прямой перевод). Однако я считаю, что повторное задание неизбежно. – user2864740

+0

@ Keyvan Sadralodabai Я так понял. Спасибо, что подтвердили. – OneHoopyFrood

+2

Не должно быть, «MyClass.MyProperty ++ буквально переводится в MyClass.MyProperty = MyClass.MyProperty + 1»? –

1

если вы не увеличиваете Int собственности. но вы можете написать example++ и перегрузить оператор ++ для вашего класса, чтобы увеличить Count, удалив его сеттер.

+1

Да, это правильный метод. Но это не совсем то, что я пытался сделать. Фактическая реализация находится в гораздо более сложном классе. Спасибо за вашу помощь! – OneHoopyFrood