C# 堆栈溢出状态

本文关键字:状态 栈溢出 堆栈 | 更新日期: 2024-11-05 05:38:45

在我的基类中,其他基类继承的基类具有以下属性:

private int DEFAULT_DISPLAY_ORDER = 999999;
private DateTime DEFAULT_DT = new DateTime(1111,1,1);
public int? Id {
    get 
    { 
        return Id.GetValueOrDefault(0);  
    }
    set 
    {
        if (DisplayOrder == null) DisplayOrder = DEFAULT_DISPLAY_ORDER;
        Id = value;
    }
}
public String Description { get; set; }
public int? DisplayOrder { get; set; }

但是当我执行它时,我收到此错误:

+ $exception {
     Cannot evaluate expression because the current thread is in a stack 
     overflow state.}
     System.Exception {System.StackOverflowException}

在线

if (DisplayOrder == null) DisplayOrder = DEFAULT_DISPLAY_ORDER;

这到底是怎么回事?

C# 堆栈溢出状态

看看这个:

public int? Id {
    get 
    { 
        return Id.GetValueOrDefault(0);  
    }

在这里,访问Id需要您首先获取... Id .砰。

下一个:

set 
{
    if (DisplayOrder == null) DisplayOrder = DEFAULT_DISPLAY_ORDER;
    Id = value;
}

请看第二部分。为了设置Id,您必须...打电话给二传手Id .砰。

为此需要一个字段:

private int? id;
// Now use the field in the property bodies
public int? Id {
    get 
    { 
        return id.GetValueOrDefault(0);  
    }
    set 
    {
        if (DisplayOrder == null) DisplayOrder = DEFAULT_DISPLAY_ORDER;
        id = value;
    }
}

你从自身内部调用 Id - 无限递归...不好:)

public int? Id {
    get 
    { 
        return Id.GetValueOrDefault(0); // This will keep calling the getter of Id. You need a backing field instead.
    }
    set 
    {
        if (DisplayOrder == null) DisplayOrder = DEFAULT_DISPLAY_ORDER;
        Id = value; // And here...
    }
}

ID = value将引发循环。你应该有一个像 _id 这样的私有变量,并在属性的 setter 和 getter 部分中使用它。

您正在创建一个无限循环,因为您在 Get 和 Id 属性:P集中引用 Id 属性。所以在得到,你会得到得到;)。在集合中,您正在设置。奇怪吧?:)

Id = value;

这确实如此。您正在对同一属性中的属性执行递归赋值。

当你调用 Id 时,它会一遍又一遍地递归调用 Id。

return Id.GetValueOrDefault(0);