此代碼導致堆棧溢出異常,我不知道爲什麼。爲什麼在C#條件運算符時出現堆棧溢出異常?
public double? Value
{
get
{
return Value.HasValue ? (double?)Math.Round(Value.Value, 1) : null;
}
set
{
Value = value;
}
}
此代碼導致堆棧溢出異常,我不知道爲什麼。爲什麼在C#條件運算符時出現堆棧溢出異常?
public double? Value
{
get
{
return Value.HasValue ? (double?)Math.Round(Value.Value, 1) : null;
}
set
{
Value = value;
}
}
因爲在您的Get
您正在閱讀財產,導致無限循環。使用後臺字段。
private double? _value;
public double? Value
{
get { return _value.HasValue ? (double?) Math.Round(_value.Value, 1) : null; }
set { _value = value; }
}
編輯:我也想指出,這是非常容易的情況下,這是非常糟糕的代碼。首先,揭露公開製片人有點不爽,但這隻比公開場地好一點。另外,使用代碼可以將一件事物分配給一個變量,但是如果您之後在行上檢查它,這個值真的很混亂。我會考慮將舍入邏輯移入setter,移除可空性(如果適用),完全刪除可變性(再次,如果適用)並在構造函數中注入該值。
這是一個ViewModel,我認爲在ViewModel中有getter和setter的公共屬性是標準做法。 另外我認爲舍入錯誤來自服務器。 您將其設置爲7.6,它將返回7.59999 ...一些其他值。 –
@LeighCooper - 那麼你應該使用'decimal'。 –
我同意Martin的觀點,如果數據類型不會削減它,請使用另一個。儘管我承認setter在視圖模型中更易於接受,但我仍然認爲在getter中轉換值是邪惡(tm),部分原因是它使客戶感到困惑,部分原因是代碼每次獲得值時都會運行一次當你分配它。 – kai
因爲在setter中你正在給setter分配一個值,這意味着setter被再次調用。 setter自始至終都會自動調用stackoverflow例外。吸氣劑也是一樣。
你應該有一個真正的變量來存儲值:
public double? Value
{
get
{
return myValue.HasValue ? (double?)Math.Round(myValue.Value, 1) : null;
}
set
{
myValue = value;
}
}
private double? myValue;
嗯,有你的財產的問題:
你必須使用一個支持字段,否則你不會能夠存儲/獲取您的價值。
您的代碼就變成了:
private double? _value;
public double? Value
{
get
{
return _value.HasValue ? (double?)Math.Round(_value.Value, 1) : null;
}
set
{
_value = value;
}
}
你的異常會自行消失。
您的堆棧溢出異常來自Math.Round(Value.Value,1)。
您正試圖獲取您的財產的價值。所以,你打電話給你的getter來獲得這個值。然後,你再次打同一行,並再次調用Math.Round(Value.Value,1)。
然後,它再次調用getter,然後... 您會看到這一點。
你的支持變量在哪裏? – GSerg
您需要屬性的支持字段。它在呼喚自己。 –