2012-01-03 85 views
15

我想使用自动实现的属性,但同时我想调用每次属性更改时的方法。如何覆盖C#中的自动属性设置

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

以前的代码是否对属性进行递归调用?如果是这样,如何实现呢?

+6

你不能在C#中做到这一点。你必须使用支持领域。 – 2012-01-03 20:07:00

+2

答案是YES ....它会创建一个连续的循环。 – 2012-01-03 20:08:16

+2

@UweKeim,这应该是一个答案。 – driis 2012-01-03 20:08:22

回答

22

如果您提供自己的get/set,那么您需要为变量提供自己的存储空间。

private float _inverseMass; 

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

很遗憾。使用某种常用的预定义单词(比如'value')而不是创建自动属性会很好。 – 2013-12-27 09:33:31

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面向aspected的编程框架,也许能够帮助你与此有关。

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 2012-01-03 20:12:54

1

正确的答案是以上给出的,但如果你想在Visual Studio迅速做到这一点,你可以使用代码片段,而不是为您生成的属性。

对这篇文章的阅读应该解释它好一点:http://www.roelvanlisdonk.nl/?p=1007

如果你愿意,你甚至可以创建自己的代码片段添加重复代码。您甚至可以使用它来快速生成如上所述的INotifyPropertyChanged实现。