getter/setter中的属性名称

Dal*_*ons 1 c# properties

我正在创建一些属性,并遇到了一个我以前没见过的场景.

考虑

private double _temperature;
private double _maxTemp;

public double Temperature
{
    get { return _temperature; }
    set { _temperature = value; }
}
public double MaxTemp
{
    get { return _maxTemp; }
    set { _maxTemp = value; }
}
public bool IsTempToHigh
{
    get
    {
        if (_temperature < _maxTemp)
            return true;
        else
            return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

没问题,但我有很多这种方式的属性,我把它重写成这个:

public double Temperature { get; set; }
public double MaxTemp { get; set; }
public bool IsTempToHigh
{
    get
    {
        if (Temperature < MaxTemp)
            return true;
        else
            return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我看来相当清洁,似乎工作得很好.但是,我看到或注意到任何人直接在gettes(或setter)中使用属性名称,因此使用安全或可能存在任何陷阱.

另外为什么这会编译但会产生StackOverflowException:

public double Value
{
    get { return Value; }
    set { Value = value; }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

如果你的意思是IsTempTooHigh,这很好(虽然条件是错误的方式).引用另一个属性是完全有效的,尽管你需要小心不要让它递归.您的自动实现属性仍然具有支持字段 - 它们刚刚由编译器为您生成,而不是存在于源代码中.

我会重写您的计算属性而不用if,请注意:

public bool IsTempTooHigh { get { return Temperature >= MaxTemp; } }
Run Code Online (Sandbox Code Playgroud)

或者在C#6中:

public bool IsTempTooHigh => Temperature >= MaxTemp;
Run Code Online (Sandbox Code Playgroud)

至于堆栈溢出,最简单的想象它们是方法:

public double GetValue()
{
    return GetValue();
}

public void SetValue(double value)
{
    SetValue(value);
}
Run Code Online (Sandbox Code Playgroud)

你可以看到为什么叫任的那些会导致堆栈溢出?嗯,它对于属性来说也是一样的 - 它们只是带有一些元数据的方法,基本上是连接它们的.