我尝试在 C# 中使用抽象类作为变量类型,并在尝试读取 ResultData.ValuesDescription 时出现 System.StackOverflowException: 'Exception_WasThrown'
错误public abstract class Plugin
{
public abstract string Name { get; }
public abstract string Description { get; }
public abstract Results ResultData { get; }
public abstract bool Init(string Symbol);
}
public abstract class Results
{
public abstract bool Values { get; set; }
public abstract string ValuesDescription { get; set; }
}
public class Test : Plugin
{
public override string Name { get => "Lortem Ipsum Moving Average"; }
public override string Description { get => "Lorem Ipsum dolor sit amet, consectetur adipiscing elit."; }
public override Results ResultData {
get {
ResultData.Values = true;
ResultData.ValuesDescription = "Lorem Ipsum result in numeric format";
return ResultData;
}
}
public override bool Init(string Symbol)
{
return true;
}
}
对发生的事情有什么建议吗?
预先感谢
DPZ
属性(实际上)是一个 getter 和 setter 方法。如果您将
ResultData
属性(及其实现)替换为方法,您很快就会明白为什么会收到 StackOverflowException:
public override Results GetResultData() {
GetResultData().Values = true;
GetResultData().ValuesDescription = "Lorem Ipsum result in numeric format";
return GetResultData();
}
现在你明白发生了什么了吗?您正在尝试从
ResultData
getter 中访问 ResultData
。这样就会运行 ResultData
getter,它会再次运行它,然后再次......
要解决这个问题,您实际上必须在某处存储一个
Results
变量。这被称为“支持场”:
private Results _resultsData = new Results();
public override Results ResultData {
get {
_resultsData.Values = true;
_resultsData.ValuesDescription = "Lorem Ipsum result in numeric format";
return _resultsData;
}
}