【问题标题】:Unexpected StackOverflowException reading from a property [duplicate]从属性读取意外的 StackOverflowException [重复]
【发布时间】:2026-02-03 08:30:01
【问题描述】:

我在公共代码中发现了错误,但我不知道我在哪里犯了错误。看起来我的大脑也有堆栈溢出:-)。 下面是堆栈溢出的来源代码:

public ObservableCollection<TestStep> TestSteps
{
    get { return TestSteps; }
    set { TestSteps = value; }
} 

【问题讨论】:

  • get { return TestSteps; } 在该行代码上放置一个断点。运行直到你遇到断点。然后跳到下一行代码。这样做几次。发生什么了?你认为为什么会这样?

标签: c#


【解决方案1】:

该属性需要一个支持字段

private ObservableCollection<TestStep> testSteps;
public ObservableCollection<TestStep> TestSteps
{
    get { return testSteps; }
    set { testSteps = value; }
}

或者你使用一个自动实现的属性:

public ObservableCollection<TestStep> TestSteps { get; set; }

由于您通常只创建一次 ObservableCollections 并且以后只添加或删除项目,因此该属性应该是只读的并已初始化:

public ObservableCollection<TestStep> TestSteps { get; }
    = new ObservableCollection<TestStep>();

如果它确实需要可设置,并且由于它似乎是视图模型中的属性,您应该在其设置器中触发属性更改通知,例如INotifyPropertyChanged 接口的 PropertyChanged 事件:

private ObservableCollection<TestStep> testSteps;
public ObservableCollection<TestStep> TestSteps
{
    get { return testSteps; }
    set
    {
        testSteps = value;
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TestSteps)));
    }
}

【讨论】:

    【解决方案2】:

    属性的getter和setter都递归调用自己。

    【讨论】: