C# 收益率行为
我有以下代码:C# 收益率行为,c#,ienumerable,yield,yield-return,C#,Ienumerable,Yield,Yield Return,我有以下代码: virtual public IEnumerable<string> GetSelectedIds(){ if (_kids == null) yield return null; foreach (var current in _kids.Nodes) yield return current; } virtualpublic IEnumerable getSelectedId(){ 如果(_=null) 收益返回空;
virtual public IEnumerable<string> GetSelectedIds(){
if (_kids == null)
yield return null;
foreach (var current in _kids.Nodes)
yield return current;
}
virtualpublic IEnumerable getSelectedId(){
如果(_=null)
收益返回空;
foreach(节点中的var电流)
产生回流电流;
}
如果\u kids==null
如果\u kids==null
,我希望这个方法在前提条件级别返回,但是它没有
问题
为什么方法开头的前提条件没有效果?试试这个:
virtual public IEnumerable<string> GetSelectedIds(){
if (_kids == null){
yield return null;
yield break;
}
foreach (var current in _kids.Nodes)
yield return current;
}
virtualpublic IEnumerable getSelectedId(){
如果(_=null){
收益返回空;
屈服断裂;
}
foreach(节点中的var电流)
产生回流电流;
}
试试这个:
virtual public IEnumerable<string> GetSelectedIds(){
if (_kids == null){
yield return null;
yield break;
}
foreach (var current in _kids.Nodes)
yield return current;
}
virtualpublic IEnumerable getSelectedId(){
如果(_=null){
收益返回空;
屈服断裂;
}
foreach(节点中的var电流)
产生回流电流;
}
更改
if (_kids == null)
yield return null;
到
这将返回一个空序列,用户不必检查返回值
或者你可以重写如下
public IEnumerable<string> GetSelectedIds(){
if (_kids == null)
return null;
return GetSelectedIds2();
}
private IEnumerable<string> GetSelectedIds2()
{
foreach (var current in _kids.Nodes)
yield return current;
}
public IEnumerable getSelectedId(){
如果(_=null)
返回null;
返回getselecteds2();
}
私有IEnumerable GetSelecteds2()
{
foreach(节点中的var电流)
产生回流电流;
}
更改
if (_kids == null)
yield return null;
到
这将返回一个空序列,用户不必检查返回值
或者你可以重写如下
public IEnumerable<string> GetSelectedIds(){
if (_kids == null)
return null;
return GetSelectedIds2();
}
private IEnumerable<string> GetSelectedIds2()
{
foreach (var current in _kids.Nodes)
yield return current;
}
public IEnumerable getSelectedId(){
如果(_=null)
返回null;
返回getselecteds2();
}
私有IEnumerable GetSelecteds2()
{
foreach(节点中的var电流)
产生回流电流;
}
您的yield return null
几乎肯定不是您想要的-它不会停止迭代运行(正如您所发现的),而且您可能根本不想将null字符串返回到集合中
用屈服断裂代替它。这样你会得到一个空的集合
如果(_kids!=null),则将foreach
包装在中,这可能更清楚
至于为什么先决条件不停止执行-这就是产生返回的方式
的工作原理-想象这样一种方法:
IEnumerable<String> GetStrings()
{
yield return "MyFirstString";
yield return "MySecondString";
yield return "MyThirdString";
}
IEnumerable GetStrings()
{
收益返回“MyFirstString”;
收益返回“MySecondString”;
收益率返回“MyThirdString”;
}
这将返回三个字符串的集合-即,在第一次产生返回后,它不会停止 您的yield return null
几乎肯定不是您想要的-它不会停止迭代的运行(正如您所发现的),而且您可能无论如何都不想将null字符串返回到集合中
用屈服断裂代替它。这样你会得到一个空的集合
如果(_kids!=null)
,则将foreach
包装在中,这可能更清楚
至于为什么先决条件不停止执行-这就是产生返回的方式
的工作原理-想象这样一种方法:
IEnumerable<String> GetStrings()
{
yield return "MyFirstString";
yield return "MySecondString";
yield return "MyThirdString";
}
IEnumerable GetStrings()
{
收益返回“MyFirstString”;
收益返回“MySecondString”;
收益率返回“MyThirdString”;
}
这将返回三个字符串的集合-即,在第一次产生返回后,它不会停止 <代码>收益返回< /代码>不停止枚举-您应该使用<代码> YILDD中断<代码>作为金刚协议,如果代码< >孩子= = null >,您会考虑返回空序列吗?这应该是好的。<代码>收益返回< /代码>不会停止枚举-您应该使用<代码> YILDD Bug <代码>作为金刚协议,如果代码< >孩子= = null < /代码>,您会考虑返回一个空序列吗?这应该很好。不,如果\u kids
是null
@lazyberezovsky OP没有这样说,那么OP希望从枚举器返回null
,我认为最好返回一个空序列。+1!谢谢你的快速回答,这可能是最好的回答,因为我需要返回一个空的枚举:)@lazyberezovsky我打赌他不会。而且他不应该想要,即使他认为他想要…@Willden同意,我倾向于不从方法返回空值。但我不明白OP为什么会这样做(他可以使用简单的if..else
而不产生任何结果)不-OP希望从枚举器返回null
,如果\u kids
是null
@lazyberezovsky OP没有这样说,我认为最好返回一个空序列。+1!谢谢你的快速回答,这可能是最好的回答,因为我需要返回一个空的枚举:)@lazyberezovsky我打赌他不会。而且他不应该想要,即使他认为他想要…@Willden同意,我倾向于不从方法返回空值。但是我不明白为什么OP会这样做(他可以使用简单的if..else
而不产生任何结果)或者更简单,只需在foreach
之前插入else
。如果你使用yield break
,你的if(\u kids!=null)
也将是多余的。这一点就是我所评论的(在你扩展你的答案之前)。或者更简单,在foreach
之前插入else
。如果你使用yield break
,你的If(_kids!=null)
也将是多余的。这一点是我的全部评论(在你扩展你的答案之前)。+1!谢谢你的快速回答。然而,我觉得收益返回null
是redandent。@GETah是的,这取决于OP。我认为让它收益中断代码>更好。确实如此。顺便说一下,我是OP:D@GETah啊,我甚至没有注意到:),是的,如果这样,你可以删除它,如果你喜欢。+1!谢谢你的快速回答。然而,我觉得收益返回null
是redandent。@GETah是的,这取决于OP。我认为让它收益中断代码>