gpt4 book ai didi

c# - getter/setter 中的属性名称

转载 作者:太空宇宙 更新时间:2023-11-03 17:20:05 25 4
gpt4 key购买 nike

我正在创建一些属性并遇到了一个我以前从未见过的场景。

考虑

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

这里没问题,但我有很多这种方式的属性,我将其重写为:

public double Temperature { get; set; }
public double MaxTemp { get; set; }
public bool IsTempToHigh
{
get
{
if (Temperature < MaxTemp)
return true;
else
return false;
}
}

在我看来,它更简洁了一点,而且看起来也一样好用。但是,我很少看到或注意到任何人直接在 gettes(或 setters)中使用属性名称,因此使用是否安全或可能存在任何陷阱。

还有为什么这个编译但给出了 StackOverflowException:

public double Value
{
get { return Value; }
set { Value = value; }
}

最佳答案

如果您的意思是 IsTempTooHigh,那很好(尽管条件是名称的错误方式)。在另一个属性中引用一个属性是完全有效的,但您需要注意不要使其递归。您的自动实现的属性仍然有支持字段 - 它们只是由编译器为您生成,而不是出现在您的源代码中。

我会在没有 if 的情况下重写你的计算属性,请注意:

public bool IsTempTooHigh { get { return Temperature >= MaxTemp; } }

或者在 C# 6 中:

public bool IsTempTooHigh => Temperature >= MaxTemp;

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

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

public void SetValue(double value)
{
SetValue(value);
}

你能明白为什么调用那些中的任何一个会导致堆栈溢出吗?好吧,这对于属性来说也是一样的——基本上,它们只是带有一些元数据链接它们的方法。

关于c# - getter/setter 中的属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28965783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com