我有一个堆栈溢出错误,我相当确信我没有任何种类的无限递归(至少我已经盯着错误现在几个小时,我无法想象如何无限循环)。堆栈溢出异常没有无限循环(据我所知)
下面是代码:
public decimal? Amount
{
get
{
if (!string.IsNullOrEmpty(_savedWork.Amount))
return decimal.Parse(_savedWork.Amount);
else
return null;
}
set
{
if (value.HasValue)
{
_savedWork.Amount = value.Value.ToString();
Percent = null;
}
else
_savedWork.Amount = "";
OnPropertyChanged("Amount");
}
}
#Note我有一栋为空的十进制字符串,这就是为什么我转换了。请不要让我陷入为什么我要这样做。
行savedWork.Amount = value.Value.ToString()
是我得到的错误。
基本上我在想我的堆栈太小(或者我的代码太大了,我想)。 我基本上运行这个代码两次,它在一种形式时工作,但不是当我制作另一种形式并将它放在那里时,所以我认为这两种形式之间的区别在于小费。
有没有一种方法来确定我做错了什么?我想知道哪部分代码占用太多或者持续时间过长等。
我已经做了一些关于堆栈/堆的工作原理和我对PerfMon.exe的了解,但作为据我所知,它只适用于堆。是否有类似的工具可以用于我的程序正在运行的堆栈?
我发现this post约2个工具叫的WinDbg和CDB但我不能找到太多有关如何安装/使用它们。这些工具是否正确?
或者,如果有一个无限循环或什么是好的。
编辑
这里是请求金额属性的代码(由它的EntityFramework自动生成),正如我所说的意见,步入甚至没有到达这里。我真的认为我的堆栈限制已经达到。
public global::System.String Amount
{
get
{
return _Amount;
}
set
{
OnAmountChanging(value);
ReportPropertyChanging("Amount");
_Amount = StructuralObject.SetValidValue(value, true);
ReportPropertyChanged("Amount");
OnAmountChanged();
}
}
最后编辑
好了,所以元骑士的回答给我看,我的确有一个无限循环。我有一个事件处理程序订阅DisplayTypeOfInvestment(金额属性所属的类)的PropertyChanged事件。该处理程序是这样的:
void DisplayTypeOfInvestmentList_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
_typeOfInvestmentFormSavedWork.TypeOfInvestment.Clear();
foreach (DisplayInvestmentFund d in _displayInvestmentFundList)
{
_typeOfInvestmentFormSavedWork.TypeOfInvestment.Add(d.SavedWork);
}
OnPropertyChanged("TypeOfInvestmentFormSavedWork");
}
的TypeOfInvestmentFormSavedWork
是一个完全不同的类,它包含了它,它自己版本的SavedWork类,我们可以看到,使用了金额属性。此方法的要点是在Amount属性更改时将此TypeOfInvestmentFormSavedWork属性更新为_savedWork的新值。出于某种原因,这会触发DisplayTypeOfInvestment视图模型的PropertyChanged。我没有搞清楚,但我改变看起来像这样的方法:
void DisplayTypeOfInvestmentList_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "Amount" || e.PropertyName == "Percent")
{
_savedWork.TypeOfInvestment.Clear();
foreach (DisplayInvestmentFund d in _displayInvestmentFundList)
{
_savedWork.TypeOfInvestment.Add(d.SavedWork);
}
OnPropertyChanged("CurrentWork");
}
}
if语句停止怪异特性在DisplayInvestmentFund被更改时添加方法被调用。
我意识到这个答案没有多大意义,但对于我来说详细解释这将需要很长的时间非常。我也意识到这可能意味着我的代码很糟糕。我不知道该怎么做。谢谢你们的帮助。
你是否已经通过代码确认没有无限递归? – jrummell
什么是您的OnPropertyChanged(“金额”);? –
什么是'_savedWork'?它是这个类的一个实例,还是包含这个类的成员?闻起来像我无限的递归。 –