有没有办法让属性设置其支持值

本文关键字:支持 设置 属性 有没有 | 更新日期: 2024-10-31 12:46:24

我有一个属性,我希望它在设置时设置另一个属性。例如:

    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的方法,但我想知道这是否可以通过属性实现。

有没有办法让属性设置其支持值

属性实际上只是一对方法 - 如果您使用自动实现的属性,编译器会为您实现它们并创建一个字段。您需要一个字段 - 因为您只有一个实际值和两个视图 - 因此您可以让编译器使用自动实现的属性自动为您创建该字段,也可以自己声明它。我个人会使用自动实现的属性。然后,根据原始属性计算其他属性。您可以将其设置为只读属性,也可以将其设置为读写属性。

例如,作为只读版本:

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"存储"改为"存储",只需更改属性计算即可。

我的首选方法是公开两个相互更新支持字段的公共属性。如果读取属性的频率高于更新频率,这将避免在每次读取时重复执行乘法或除法运算。

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;
    }
}

实际上使用属性处于public模式,因此您可以将属性更改为如下所示的值:

private double Bpm;
private double Bps
{
    get 
    {
        return Bpm / 60;
    }
}

感谢@Farhad贾比耶夫。