我被Adam "Asp“一书困住了,我读了很多关于IEnumerable和IEnumerator界面的书,但是仍然很难理解一些结果。我有这两门课。
public class ShoppingCart : IEnumerable<Product>
{
public IEnumerable<Product> Products { get; set; }
public IEnumerator<Product> GetEnumerator()
{
return Products.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}第一个的延伸,
public static class MyExtensionMethods
{
public static decimal TotalPrices (this IEnumerable<Product> products)
{
decimal total = 0;
foreach (Product prod in products)
{
total += prod?.Price ?? 0;
}
return total;
}
}产品是一个简单的类,有一些领域,如名称,价格等。我有很多疑问。首先,我不明白c#是如何知道MyExtensionMethods是ShoppingCart的扩展的,然后我不明白TotalPrices如何知道prod来自ShoppingCart类中的产品。有人能简单地解释一下这几条线背后的逻辑吗?
谢谢大家,很抱歉提出这个愚蠢的问题。
发布于 2020-02-27 16:05:03
首先我不明白c#怎么知道MyExtensionMethods是ShoppingCart的扩展
它不是这样的;这里的“魔力”是this IEnumerable<Product> products,它说“该方法是对任何IEnumerable<Product>的扩展方法”--因为ShoppingCart满足这一点,所以它可以工作。
,那么我不明白TotalPrices怎么能知道ShoppingCart类中的产品
它不访问Products on ShoppintCart;它是通过GetEnumerator()访问的;这是因为foreach (Product prod in products)可以处理(除其他外)一些东西是IEnumerable<Product> --我们知道products是这样的,因为它就是这样定义的。这基本上变成:
public static decimal TotalPrices (this IEnumerable<Product> products)
{
decimal total = 0;
using (var iter = products.GetEnumerator())
{
while (iter.MoveNext())
{
var prod = iter.Current;
total += prod?.Price ?? 0;
}
}
return total;
}所有这些都是通过IEnumerable<T>定义的。好消息是:通常不需要知道这一点--只要知道foreach在序列上工作,IEnumerable<T>就是T序列。
https://stackoverflow.com/questions/60437193
复制相似问题