当试图将公共值分配给私有支持字段时,StackOverflowException

本文关键字:支持 字段 StackOverflowException 分配 | 更新日期: 2023-09-27 17:50:02

我有一个像下面这样的私有支持的公共属性。在行selected = Selected;上,我得到一个SO异常。看起来赋值会导致无限递归。有人能更详细地解释一下发生了什么吗?代码应该是什么呢?

    //other class stuff AssetTypes is an enum btw.
    private AssetTypes? selected = null;
    public AssetTypes? Selected
    {
        get
        {
            return selected;
        }
        set
        {
            selected = Selected;
            if (selected == AssetTypes.Image)
            {
                image.Click();
            }
            else if (selected == AssetTypes.Video)
            {
                video.Click();
            }
            else
            {
                selected = null;
            }
        }
    }

唯一可以修改的部分是setter中的赋值。if-else逻辑需要保持不变

当试图将公共值分配给私有支持字段时,StackOverflowException

setter有一个名为value的参数,该参数是要设置属性的值。你应该从那里得到新的值,而不是从Selected,它只是调用getter,返回之前的值。

因此,这一行什么也不做:

selected = Selected;

你永远不应该在Selected自己的setter中给它赋值,因为它调用了同一个setter,因此你的无限递归。

试试这个:

set
{        
    if (value == AssetTypes.Image)
    {
        image.Click();
        selected = value;
    }
    else if (value == AssetTypes.Video)
    {
        video.Click();
        selected = value;
    }
    else
    {
        selected = null;
    }
}

我认为问题在else: Selected = null

使用小写s的selected = null

问候!

你在Selected = null上有一个无限递归,这就是为什么你得到一个stackoverflow异常。它一遍又一遍地调用Selected set,直到最终产生一个异常。修改

selected = null;

selected = selected不做任何操作

传递给Set的是value;

public AssetTypes? Selected
{
    get
    {
        return selected;
    }
    set
    {
        if (selected == value) return;  // use this to not do it again
        selected = value;
        if (selected == AssetTypes.Image)
        {
            image.Click();
        }
        else if (selected == AssetTypes.Video)
        {
            video.Click();
        }
        else
        {
            selected = null;   // Selected = null; was the recursion
        }
        NotifyPropertyChanged("Selected");  // this optional and only if you implement INPC
    }
}