【发布时间】:2020-09-01 21:10:28
【问题描述】:
我得到了 IEnumerator 的想法,它赋予了类迭代的能力。我明白为什么需要 GetEnumerable() 才能使用 foreach 语句。但我想知道为什么我需要实现 IEnumerator 而我可以将数组声明为属性?我真的很困惑,可以使用一个很好的解释。这是我的代码块,无论有没有 IEnumerator 实现,结果都是一样的。
static void Main(string[] args)
{
Customer customer1 = new Customer
{
Name = "Marty",
Surname = "Bird",
Id = 1
};
Customer customer2 = new Customer
{
Name = "Hellen",
Surname = "Pierce",
Id = 2
};
Customers customers = new Customers();
customers.Add(customer1);
customers.Add(customer2);
//Using a property: This one works without an extra GetEnumerator implementation.
foreach (var item in customers.CustomerList)
{
Console.WriteLine(item.Name);
}
//Using with GetEnumerator()
foreach (Customer item in customers)
{
Console.WriteLine(item.Name);
}
}
class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
}
class Customers:IEnumerable
{
private List<Customer> customerList = new List<Customer>();
public List<Customer> CustomerList { get=> customerList; }
public void Add(Customer p)
{
customerList.Add(p);
}
public IEnumerator GetEnumerator()
{
return customerList.GetEnumerator();
}
}
【问题讨论】:
-
谁说需要实现
IEnumerator? -
foreach 的定义是这么说的。如果你想要一个可迭代的类,你需要它继承自 IEnumerator 接口或继承自 IEnumerator 的类。
-
所以如果你想要可迭代的类 - 你实现它。通常你不会。如果您出于某种原因实现新的集合/可迭代类型,您将需要。同样,通常你不会,你只是重复使用现有的。
-
@muaet 实际上,
foreach只需要你传递给它的东西就有一个GenEnumerator方法,该方法返回带有MoveNext方法和Current属性的东西。 -
CustomerList属性使您的类的用户可以原始访问您的私有字段,这不是很好的数据封装。如果您删除该字段,那么您就可以通过IEnumerable界面进行访问。
标签: c# arrays .net implementation ienumerator