[英]Property name in getter/setter
我正在創建一些屬性,並遇到了一個我之前從未見過的場景。
考慮
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(或setter)中使用屬性名稱,因此使用起來安全嗎?還是有任何陷阱。
也是為什么要編譯卻給出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);
}
你可以看到為什么叫這類原因會導致堆棧溢出? 嗯,屬性是一樣的-基本上,它們只是帶有一些元數據鏈接它們的方法。
第一個問題:是的,我認為您的更改使代碼更清晰。 如果需要不變性,則使用備用字段的有效情況是。 這些字段將變為只讀,並且您沒有設置器。
第二個問題:你的二傳手叫你的二傳手。 哪個叫您的二傳手。 哪個叫您的二傳手。 等等。 片刻之后,堆棧變得太大,您將收到錯誤消息。 :)
您可以輕松地在屬性內使用其他屬性,字段和方法。 完全不用擔心。
但是,您的第二個代碼塊會反復調用同一屬性。 您正在嘗試將自動實現的屬性與手寫的屬性混合使用。 這是不可能的。
或者 ,編譯器會為您生成后備字段(當您使用自動實現的屬性時), 或者您必須自己創建它們(手寫屬性)。
所以要么是這樣:
public double Value { get; set; }
要么:
private double _value;
public double Value
{
get { return _value; }
set { _value = value; }
}
在當前使用數據成員的私有成員函數中使用屬性名稱是安全無害的。
該代碼會引發StackOverFlow異常,因為通過將其賦給Value
您實際上是在調用該屬性。 而是將基礎數據成員的名稱更改為_value
:
public double Value { get { return _value; } set { _value = value; } }
擁有一個可以評估其他2個屬性的屬性就可以了。 當然,您可以輕松地使用一種方法來完成相同的工作。 例如變化
public bool IsTempToHigh
{
get
{
if (_temperature < _maxTemp)
return true;
else
return false;
}
}
至
public bool IsTempToHigh()
{
return _temperature > _maxTemp;
}
(注意:假設正確,我已將您的<更改為>)
因為設置了對象本身,所以您的值會出現異常。 然后,這會更改其值,因此會嘗試再次進行設置。
所以這是錯誤的...
public double Value
{
get { return Value; }
set { Value = value; }
}
但是以下任何一個都可以
public double Value { get; set;}
要么
private double _myVal;
public double MyValue
{
get{ return _myVal;}
set{ _myVal = value;}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.