我有一个属性,我希望它在设置时设置另一个属性。例如:
private double Bpm
{
set
{
<myself> = value;
_bps = <myself> / 60;
}
get
{
return <myself>;
}
}
我实际做的是以下内容,因为我找不到另一种方式:
private double _bpm;
private double _bps;
private double Bpm
{
set
{
_bpm = value;
_bps = _bpm / 60;
}
get
{
return _bpm;
}
}
我发现它不优雅,有两个私人成员Bpm
和_bpm
。我也可以使用SetBpm
方法,但我想知道这是否可以通过属性实现。
答案 0 :(得分:10)
属性只是一对方法,实际上 - 如果您使用自动实现的属性,编译器会为您实现它们并创建一个字段。您需要一个字段 - 因为您只有一个实际值,并且有两个视图 - 因此您可以让编译器通过使用自动实现的属性自动为您创建该字段,或者您可以自己声明它。我亲自使用自动实现的属性。然后根据原始属性计算其他属性。您可以将其设为只读属性,也可以将其设为读写。
例如,作为只读版本:
public double BeatsPerSecond { get; set; }
public double BeatsPerMinute { get { return BeatsPerSecond * 60; } }
或者在C#6中:
public double BeatsPerSecond { get; set; }
public double BeatsPerMinute => BeatsPerSecond * 60;
对于读写版本:
public double BeatsPerSecond { get; set; }
public double BeatsPerMinute
{
get { return BeatsPerSecond * 60; }
set { BeatsPerSecond = value / 60; }
}
如果您愿意,您可以决定将BeatsPerMinute
改为“已存储”,只需更改属性计算。
答案 1 :(得分:2)
我首选的方法是公开两个更新彼此的支持字段的公共属性。如果您的属性读取频率高于更新属性,则可以避免在每次读取时重复执行乘法或除法运算。
private double _bpm;
private double _bps;
private double Bpm
{
get
{
return _bpm;
}
set
{
_bpm = value;
_bps = value / 60;
}
}
private double Bps
{
get
{
return _bps;
}
set
{
_bps = value;
_bpm = value * 60;
}
}
答案 2 :(得分:2)
实际上使用属性处于public
模式,因此您可以将属性更改为如下值:
private double Bpm;
private double Bps
{
get
{
return Bpm / 60;
}
}
感谢@Farhad Jabiyev。