我正在创建一些属性,并遇到了一个我以前没见过的场景.
考虑
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)
如果你的意思是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)
你可以看到为什么叫任的那些会导致堆栈溢出?嗯,它对于属性来说也是一样的 - 它们只是带有一些元数据的方法,基本上是连接它们的.