在这个实现中,每次都会对hand进行评估并返回另一个列表吗?
foreach (Card card in hand.Cards)
{
}
我们是否应该用以下内容替换上述实现?
var cards = hand.Cards;
foreach (Card card in cards)
{
}
答案 0 :(得分:4)
没有。实际上这两个片段会产生相同的代码。 在下面的代码段中:
foreach (Card card in hand.Cards)
{
}
hand.Cards
只会被调用一次。
编辑:
我已经创建了一个小片段,我希望它会显示没有任何区别:
void Main()
{
Hand hand = new Hand();
foreach( var card in hand.Cards() )
{
Console.WriteLine("{0}", card);
}
var allCards = hand.Cards();
foreach( var anotherCard in allCards )
{
Console.WriteLine("{0}", anotherCard);
}
}
public class Card
{
private string _cardName;
public Card( string cardName )
{
this._cardName = cardName;
}
public override string ToString()
{
return this._cardName;
}
}
public class Hand
{
public IEnumerable<Card> Cards()
{
yield return new Card("Ace");
yield return new Card("King");
}
}
otuput(两种方法)如下:
Ace
King
Ace
King
答案 1 :(得分:0)
这两者之间没有区别。此外,如果它们是EF,它们是相同的查询。也在下面的语法中:
foreach (Card card in hand.Cards.AsEnumerable())
{
}
hand.Cards.AsEnumerable()
将首先进行评估,并将保存在临时变量中,实际上这不会在每次迭代中发生。
P.S:一般来说,不需要在foreach循环中调用AsEnumerable,我只是提到了这个来详细说明foreach评估。
答案 2 :(得分:0)
没有区别。
但是如果你在其他代码中使用hand.Cards
,那么第二个应该没问题。
答案 3 :(得分:0)
您在上面发布的两个代码段是相同的。当您枚举实现IEnumerable接口的集合时,它使用GetEnumerator
方法循环遍历项目,并且它不会创建对象的副本。
上面唯一的区别是你创建的第二个变量与原始集合保持相同的引用,在这种情况下对你没有任何好处。