C# 迭代器使用大量编译器魔法在后台自动创建枚举数和枚举数。请参阅:
作为C#迭代器的一个示例,让我们用它们来实现您的示例(我删除了setter,因为它在这里碍手碍脚):C# 迭代器使用大量编译器魔法在后台自动创建枚举数和枚举数。请参阅:,c#,.net,C#,.net,作为C#迭代器的一个示例,让我们用它们来实现您的示例(我删除了setter,因为它在这里碍手碍脚): IEnumerable完全等同于Java的Iterable。好的,但是在这个特定的例子中,实现IEnumerable接口的类是什么?@AndreaNobili-你能用Java回答同样的问题吗不,C#也是如此:查看接口无法知道哪个类将实现它。你可以说一个类实现了接口(比如List实现了IEnumerable),但是没有办法说在这个特殊情况下是否使用了List。更新了响应。+1以解释接口的内部实现。
IEnumerable
完全等同于Java的Iterable
。好的,但是在这个特定的例子中,实现IEnumerable接口的类是什么?@AndreaNobili-你能用Java回答同样的问题吗不,C#也是如此:查看接口无法知道哪个类将实现它。你可以说一个类实现了接口(比如List
实现了IEnumerable
),但是没有办法说在这个特殊情况下是否使用了List
。更新了响应。+1以解释接口的内部实现。回答得好!从语言的角度来看,LINQ并没有真正改变IEnumerable的功能。您只需调用helper方法,这些方法在后台只是迭代序列并使用它进行操作。早在LINQ出现之前,就有很多方法可以使用IEnumerable
,并用它做一些有用的事情,从那以后就有了更多的方法。LINQ是非常有用、广泛使用且用途相当广泛的方法,但这些都没有改变语言使用IEnumerable
@Servy所能做的基本功能,这就是为什么我明确指出它们是扩展方法。虽然很方便,但是语法扩展方法允许会导致接口显式提供什么和扩展方法提供什么的混淆。
namespace DataModel.MaliciousCode
{
public class PagedMalicious : Shared.Paged
{
public IEnumerable<MaliciousSmall> MaliciousCode { get; set; }
}
}
public class PagedMalicious : Shared.Paged
{
public IEnumerable<MaliciousSmall> MaliciousCode { get; set; }
public PagedMalicious()
{
MaliciousCode = new List<MaliciousSmall>();
}
// other private methods that add to MaliciousCode
}
private void Form3_Load(object sender, EventArgs e)
{
Parent parent = new Parent();
parent.Child = new List<Child>(); // -> this is where implementer is decided.
//Before this line, Child property is not instantiated and is not referring to any object.
}
public class Parent
{
public IEnumerable<Child> Child { get; set; }
}
public class Child
{
public int MyProperty { get; set; }
}
public class PagedMalicious : Shared.Paged
{
public IEnumerable<MaliciousSmall> MaliciousCode
{
get
{
using (var conn = new SqlConnection("<my server connection>")) {
var cmd = new SqlCommand("SELECT name, number FROM myTable", conn);
conn.Open();
using (var reader = cmd.ExecuteReader()) {
while (reader.Read()) {
var maliciousSmall = new MaliciousSmall {
Name = reader.GetString(0),
Number = reader.GetInt32(1)
};
yield return maliciousSmall;
}
}
}
}
}
}
var pagedMalicious = new PagedMalicious();
int sum = 0;
foreach (MaliciousSmall item in pagedMalicious.MaliciousCode) {
sum += item.Number;
}