什么是关闭?我们在.NET中有它们吗?
如果它们确实存在于.NET中,您能否提供一个代码片段(最好用C#)来解释它?
编辑:我浏览了Jon Skeet的文章,了解什么是闭包以及如何在.NET中使用它们.
人们在第一次使用LINQ时遇到的根本误解是什么?
例如,他们认为当它真的是别的时候它是一回事吗?
并且,是否有一些最佳实践来避免这些错误?
能否请您在C#中通过热切评估给出一个延迟执行的示例?
我从MSDN上读到LINQ中的延迟执行可以通过惰性或急切评估来实现.我可以在互联网上找到延迟执行延迟执行的示例,但是我找不到任何带有急切评估的延迟执行的示例.
此外,延迟执行与惰性评估有何不同?在我看来,两者看起来都一样.你能为此提供任何一个例子吗?
我正在学习C#.我的意思是关闭 a construct that can adopt the changes in the environment in which it is defined.
示例:
List<Person> gurus =
new List<Person>()
{
new Person{id=1,Name="Jon Skeet"},
new Person{id=2,Name="Marc Gravell"},
new Person{id=3,Name="Lasse"}
};
void FindPersonByID(int id)
{
gurus.FindAll(delegate(Person x) { return x.id == id; });
}
Run Code Online (Sandbox Code Playgroud)
该变量id在FindPersonByID()的范围内声明但是我们仍然可以访问id匿名函数内的局部变量(即)delegate(Person x) { return x.id == id; }
(1)我对封闭的理解是否正确?
(2)我们可以从封闭中获得哪些优势?
Linq是.NET的一个很棒的补充,我发现它在很多情况下都很好用,即使我刚开始学习如何使用Linq.
然而,在我对Linq所做的阅读中,我发现开发人员需要注意一些微妙的事情,这可能会导致麻烦.
我已经提到了一个明确的警告,我发现这是延迟执行的结果.
所以我想知道,对于Linq来说,Linq的新手应该知道哪些其他注意事项?
我有一段代码使用LINQ过滤列表,创建匿名类型的实例列表,并为每个实例分配一个事件处理程序:
// Select every linear expression and create a menu item from it
var items = from expr in expressionList.Expressions
where expr.Type == ExpressionType.Linear
let stdExpr = (StandardExpression)expr
select new
{
Menu = new ToolStripMenuItem(stdExpr.Expression), // string
stdExpr.Slot // int
};
// Wire a Click event handler to each menu to set the tracked line
foreach (var item in items)
{
item.Menu.Click += (s, e) => graph.SetTrackedLine(item.Slot);
menuTrackLineWithMouse.DropDownItems.Add(item.Menu);
}
Run Code Online (Sandbox Code Playgroud)
这很有效,因为事件处理程序有线并且菜单被正确添加.单击菜单项时会出现问题,并触发处理程序.无论哪个菜单项触发了处理程序,只传递最后一个SetTrackedLine.
一个例子是,如果我有两个菜单,"sin(x)",带槽0,"cos(x)",带槽1,两个Click事件都传递1 …