C# StackOverflowException尝试将公共值分配给私有备份字段时
我有一个像下面这样有私人支持者的公共财产。在C# StackOverflowException尝试将公共值分配给私有备份字段时,c#,.net,C#,.net,我有一个像下面这样有私人支持者的公共财产。在selected=selected行上我得到一个如此异常。赋值似乎导致了某种无限递归。有人能对正在发生的事情作更详细的解释吗?代码应该是什么 //other class stuff AssetTypes is an enum btw. private AssetTypes? selected = null; public AssetTypes? Selected { get {
selected=selected行上代码>我得到一个如此异常。赋值似乎导致了某种无限递归。有人能对正在发生的事情作更详细的解释吗?代码应该是什么
//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逻辑需要保持不变。在Selected=null
上有一个无限递归,这就是为什么会出现stackoverflow异常。它一次又一次调用Selected
set,直到最后出现异常。换成
selected = null;
我认为问题出在else:Selected=null
将selected=null
与小写字母s一起使用
你好 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
}
}
setter有一个名为value
的参数,该参数是属性要设置的值。您应该从中获取新值,而不是从所选的中获取新值,它只调用getter,getter返回以前的值
因此,该行不起任何作用:
selected = Selected;
您永远不应该从它自己的setter中分配给Selected
,因为它调用同一个setter,因此您的递归是无限的
请尝试以下方法:
set
{
if (value == AssetTypes.Image)
{
image.Click();
selected = value;
}
else if (value == AssetTypes.Video)
{
video.Click();
selected = value;
}
else
{
selected = null;
}
}
selected=null
未selected
属性。您正在分配selected=selected。应选择它=值。然后将选定(未选定)设置为空。您如何知道哪1/2是错误的?您接受的答案在接受时是错误的。否您的应用程序没有在selected=selected;上崩溃;。把它作为唯一的线路测试。然后重试Selected=null;作为唯一的一行。你真的因为无法更改逻辑而将else{Selected=null;}留在了应用程序中吗?然后证明它。放置选定项=选定项;回到第一行,应该会失败。他没有循环。他有无限的递归性。这不是循环。@Servy:伙计,我真不敢相信你会因此而否决我。我把它看作一个循环,但我认为这一点很清楚,把它称为递归循环并没有那么重要。用不恰当的术语(特别是与正确的术语完全相反的术语)来描述这个问题无疑是非常重要的。@Servy:我说它是一个循环,因为它在一个over上不停地执行相同的逻辑。这对我来说是一个循环。我认为这是次投票,不足以否决,但无论如何还是要感谢你。虽然我在某些情况下同意你的观点,但这种情况恰恰是区别的关键所在。无限循环不会溢出堆栈,但递归会溢出堆栈。不,那不是递归。它只是不改变值。递归是当他分配给Selected
@Blorgbeard OK时,它被破坏了,我发布了一个有效的修复程序。你的修复程序会工作,但你的答案仍然包含错误的语句,顶部的if
不是防止递归的必要条件,但会改变OP的逻辑。现在,设置相同的值两次不会单击图像两次。@Blorgbeard我的答案执行正确的单击。评论州用这个来表示不再这样做。顺便说一句,我已经把我的反对票转为赞成票。剩下的否决票不是我的。你否决了我对递归的错误陈述。我的回答是正确的行动。有图像。点击()和视频。点击()很好!固定的我对你的答案投了否决票,因为它包含一个关于递归所在位置的错误语句(“selected=selected
is recursion”)。如果你修好了,我就投你一票!修正了,我从未投你反对票。我必须测试自己,以验证这不是递归。仍然是错误的和被接受的答案。selected==AssetTypes.Image将比较当前选择的值(不是传递给集合的值),我没有投票否决您或OP。