2012-01-03 4 views
15

Я хочу использовать автоматически реализованные свойства, но в то же время я хочу вызывать метод каждый раз, когда свойство изменяется.как переопределить набор в C# автоматических свойств

public float inverseMass 
{ 
    get; 
    set 
    { 
     onMassChanged(); 
     inverseMass = value; 
    } 
} 

Имеет ли предыдущий код рекурсивный вызов свойства? Если да, то как это реализовать?

+6

Вы не можете сделать это на C#. Вы должны использовать фоновое поле. –

+2

Ответ ДА ​​... он создаст непрерывный цикл. –

+2

@UweKeim, это должен быть ответ. – driis

ответ

22

Если вы предоставляете свой собственный get/set, вам необходимо предоставить собственное хранилище для переменной.

private float _inverseMass; 

public float inverseMass 
{ 
    get { return _inverseMass; } 
    set 
    { 
     _inverseMass = value; 
     onMassChanged(); 
    } 
} 
+6

Жаль. Было бы неплохо использовать какое-то общее предопределенное слово, например 'value', вместо создания свойства auto. –

4

Вы не можете сделать это на C#.

Его либо автоматическое свойство, либо свойство с опорным полем.

8

Используйте поле подкладочного вместо:

public float inverseMass 
{ 
    get 
    { 
     return _inverseMass; 
    } 
    set 
    { 
     onMassChanged(); 
     _inverseMass = value; 
    } 
} 

private float _inverseMass; 

Я когда-то где-то читал, что C# ребята решили, что они хотели, чтобы охватить широкие сценарии использования с этими автоматическими свойствами, но для особых случаев вы должны пойти назад к старым старым полям поддержки.

(Честно говоря, я считаю, что Джон Скит рассказал им, как их реализовать)

4

Вы должны сломать выше в частные/государственные член, так что вы не получите рекурсивные проблемы:

private float _inverseMass; 
public float inverseMass 
{ 
    get { return this._inverseMass; } 
    set { this._inverseMass = value; onMassChanged(); } 
} 

Однако, вы смотрели в интерфейс INotifyPropertyChanged? Он делает в значительной степени то, что вы ищете, и в зависимости от того, что вы пишете, он может поддерживаться изначально.

public class MyClass : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(String property) 
    { 
    var event = this.PropertyChanged; 
    if (event != null) 
    { 
     event(this, new PropertyChangedEventArgs(property)); 
    } 
    } 

    private float _inverseMass; 
    public float inverseMass 
    { 
    get { return this._inverseMass; } 
    set { this._inverseMass = value; NotifyPropertyChanged("inverseMass"); } 
    } 
} 
1

Это не скомпилировано, поэтому трудно сказать, является ли оно рекурсивным или нет.

Вы не можете указать только одну часть объекта с автоматической активацией. Вам нужно будет использовать резервное поле в этом случае:

private float _inverseMass; 
public float inverseMass 
{ 
    get { return _inverseMass; } 
    set 
    { 
     onMassChanged(); 
     _inverseMass = value; 
    } 
} 

Хотя, аспектированы-ориентированная среда программирования, как PostSharp может быть в состоянии помочь вам в этом.

0

Используйте частную переменную в качестве резервного поля для публичной собственности.

private float inverseMass; 

public float InverseMass{ 

    set 
    { 
     onMassChanged(); 
     inverseMass=value; 
    } 
    get 
    { 
     return inverseMass; 
    } 

} 
-2
public float inverseMass 
{ 
    get; 
    set 
    { 
     if (inverseMass != value) 
     { 
      inverseMass = value; 
      onMassChanged(); 
     } 
    } 
} 
+0

Что вы пытаетесь сказать здесь? Этот ответ не компилируется. – vcsjones

1

Правильные ответы приведены выше, но в случае, если вы хотели сделать это быстро в Visual Studio, вы можете использовать фрагменты кода вместо того, чтобы сгенерировать свойство для вас.

Есть чтение этой статьи, которая должна объяснить это немного лучше: http://www.roelvanlisdonk.nl/?p=1007

Если вы хотите, вы даже можете создать свой собственный фрагмент кода, чтобы добавить повторяющийся код. Вы даже можете использовать его для быстрого создания реализации INotifyPropertyChanged, как указано выше.

Смежные вопросы