我想使用自动实现的属性,但同时我想调用每次属性更改时的方法。如何覆盖C#中的自动属性设置
public float inverseMass
{
get;
set
{
onMassChanged();
inverseMass = value;
}
}
以前的代码是否对属性进行递归调用?如果是这样,如何实现呢?
我想使用自动实现的属性,但同时我想调用每次属性更改时的方法。如何覆盖C#中的自动属性设置
public float inverseMass
{
get;
set
{
onMassChanged();
inverseMass = value;
}
}
以前的代码是否对属性进行递归调用?如果是这样,如何实现呢?
如果您提供自己的get/set,那么您需要为变量提供自己的存储空间。
private float _inverseMass;
public float inverseMass
{
get { return _inverseMass; }
set
{
_inverseMass = value;
onMassChanged();
}
}
很遗憾。使用某种常用的预定义单词(比如'value')而不是创建自动属性会很好。 – 2013-12-27 09:33:31
你不能在C#中做到这一点。
它的自动属性或具有后台字段的属性。
使用支持字段改为:
public float inverseMass
{
get
{
return _inverseMass;
}
set
{
onMassChanged();
_inverseMass = value;
}
}
private float _inverseMass;
有一次我读的地方,C#的家伙决定,他们想掩盖的这些自动属性的使用场景广阔,但在特殊情况下,你必须去回到好的旧支持领域。
(说实话,我认为乔恩斯基特告诉他们如何实现它们)
你会需要打破上面的出私有/公有成员,所以你没有得到递归问题:
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"); }
}
}
这不能编译,所以很难说它是否递归。
您不能仅指定自动属性的一个部分。您需要在此情况下,使用后备场:
private float _inverseMass;
public float inverseMass
{
get { return _inverseMass; }
set
{
onMassChanged();
_inverseMass = value;
}
}
虽然,像PostSharp面向aspected的编程框架,也许能够帮助你与此有关。
使用私有变量作为公共属性的备份字段。
private float inverseMass;
public float InverseMass{
set
{
onMassChanged();
inverseMass=value;
}
get
{
return inverseMass;
}
}
public float inverseMass
{
get;
set
{
if (inverseMass != value)
{
inverseMass = value;
onMassChanged();
}
}
}
你在这里想说什么?这个答案不能编译。 – vcsjones 2012-01-03 20:12:54
正确的答案是以上给出的,但如果你想在Visual Studio迅速做到这一点,你可以使用代码片段,而不是为您生成的属性。
对这篇文章的阅读应该解释它好一点:http://www.roelvanlisdonk.nl/?p=1007
如果你愿意,你甚至可以创建自己的代码片段添加重复代码。您甚至可以使用它来快速生成如上所述的INotifyPropertyChanged实现。
你不能在C#中做到这一点。你必须使用支持领域。 – 2012-01-03 20:07:00
答案是YES ....它会创建一个连续的循环。 – 2012-01-03 20:08:16
@UweKeim,这应该是一个答案。 – driis 2012-01-03 20:08:22