Tag: closures

关闭有什么特别之处?

我一直在读这篇文章关于他们说的闭包 : “所有的管道都是自动的” 编译器“创建一个包装类”并“延长变量的生命周期” “你可以毫无顾虑地使用局部变量” .NET编译器为您处理管道等。 所以我根据他们的代码做了一个例子,对我而言,闭包似乎就像常规的命名方法一样,也“无需担心地处理局部变量”,其中“所有的管道都是自动的”。 或者这个“局部变量的包装”解决了什么问题,使得闭包如此特殊/有趣/有用? using System; namespace TestingLambda2872 { class Program { static void Main(string[] args) { Func AddToIt = AddToItClosure(); Console.WriteLine(“the result is {0}”, AddToIt(3)); //returns 30 Console.ReadLine(); } public static Func AddToItClosure() { int a = 27; Func func = s => s + a; return func; } } […]

multithreading重入问题

我正在尝试为某些处理生成不同的线程。 我for每个线程中的一些逻辑使用for循环索引。 如何在下面的代码中获取不同的线程来打印1,2,3,4,5? 每次我运行这个,我得到不同的数字作为输出 – 3,3,3,4,6,6和2,2,3,5,5,6等。 我尝试使用锁定对象,但它没有正确执行。 任何人都可以帮我解决这个问题。 我只是想确保每个线程/任务获得正确的索引。 请注意,每个任务都被强制在单独的线程上运行。 List tasks1 = new List(); for (int j = 1; j { Console.WriteLine(j); } , new CancellationToken() , TaskCreationOptions.LongRunning , TaskScheduler.Default) ); } Task.WaitAll(tasks1.ToArray()); Console.Read();

使用闭包来跟踪变量:好主意或肮脏的技巧?

好吧,我需要能够跟踪作为另一个对象属性的值类型对象,如果没有这些属性实现IObservable接口或类似属性,则无法完成。 然后我想到了闭包和Jon Skeet的着名例子以及它如何打印出9次(或10次)而不是数字的升序。 所以我想为什么不这样做: Class MyClass { … Func variable; … public void DoSomethingThatGetsCalledOften() { MyValueType blah = variable(); //error checking too not shown for brevity //use it } … } … in some other consuming code … MyClass myClass = new MyClass(); myClass.variable = () => myOtherObject.MyOtherProperty; //then myClass will get the current value […]

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 […]

LINQifying我的代码是否值得在闭包中访问foreach变量?

让人想起过去的滚石乐队滚石乐队唱片的标题,Resharper比我以往任何时候都更加清晰; 因为我检查了我的代码,它告诉我关于闭包: 1)“循环: foreach (var item in PlatypiIds) { var query = db.Table().Where(l => l.PlatypusId == item). Where(l=> l.SentTimeUTC >= EarliestToShow). Where(l=> l.SentTimeUTC l.SentTimeUTC); if (query != null) { foreach (var q in query) { listLocs.Add(q); } } } …可以转换为LINQ表达式: listLocs.AddRange(from item in PlatypiIds select db.Table().Where(l => l.PlatypusId == item).Where(l => l.SentTimeUTC >= EarliestToShow).Where(l => […]

来自lambda的RelayCommand和构造函数参数

如果在XAML文件中,我将Button从以下类绑定到“Command”,则单击Button不会导致执行DoIt: class Thing() { public Thing(Foo p1) { Command = new RelayCommand(() => DoIt(p1)); } private DoIt(Foo p) { p.DoSomething(); } public ICommand Command { get; private set; } } 但是,如果我从p1初始化一个字段并将该字段作为参数传递给lambda中的方法调用,它确实有效: class Thing() { private Foo field; public Thing(Foo p1) { field = p1; Command = new RelayCommand(() => DoIt(field)); } private DoIt(Foo p) { […]

Lambda捕获问题与迭代器?

如果已经问过这个问题,请道歉,但假设我们有这个代码(我用Mono 2.10.2运行它并用gmcs 2.10.2.0编译): using System; public class App { public static void Main(string[] args) { Func f = null; var strs = new string[]{ “foo”, “bar”, “zar” }; foreach (var str in strs) { if (“foo”.Equals(str)) f = () => str; } Console.WriteLine(f()); // [1]: Prints ‘zar’ foreach (var str in strs) { var localStr […]

获得处置关闭 – 标记方法是安全的

这是关于ReSharper的警告“进入废弃封闭”,这通常在后来处置的物体用于lambda时出现。 在C#中获得处置关闭? 更详细地讨论了这一点。 我的问题是:对于采用这种lamdbas并立即执行它们的方法(所以你可以确定它们总是在处理掉所述对象之前执行): 有没有办法将它们标记为安全,以便使用该方法的任何代码都不再产生这些警告? 例: using (var myObject = new MyDisposableObject()) { DoThisTwice(() => myObject.DoSomething()); } … void DoThisTwice(Action do) { do(); do(); } DoThisTwice接受委托(或lambda)并同步执行它。 到方法返回时,将不再执行lambda。 只有这样才能处理myObject ,所以我们很高兴。 我们可以用注释来标记调用DoThisTwice的行,但必须以类似的方式在所有地方使用该方法完成。 相反,我想将DoThisTwice标记为安全,因此Resharper不会为该方法的任何调用者显示任何警告。

用C#写我的第一个DSL,然后挂上func &Action

我正在努力编写我的第一个DSL用于工作中的简单工具。 我正在使用构建器模式来设置复杂的父对象,但我遇到了砖墙,用于构建父对象的子集合。 这是一个示例: 使用: var myMorningCoffee = Coffee.Make.WithCream().WithOuncesToServe(16); 关闭的样本(我认为这就是他们所谓的): var myMorningCoffee = Coffee.Make.WithCream().PourIn( x => { x.ShotOfExpresso.AtTemperature(100); x.ShotOfExpresso.AtTemperature(100).OfPremiumType(); } ).WithOuncesToServe(16); 示例类(没有子PourIn()方法,因为这是我想要弄清楚的。) public class Coffee { private bool _cream; public Coffee Make { get new Coffee(); } public Coffee WithCream() { _cream = true; return this; } public Coffee WithOuncesToServe(int ounces) { _ounces = ounces; return […]

foreach和list.ForEach()之间的闭包有何不同?

考虑这段代码。 var values = new List {123, 432, 768}; var funcs = new List<Func>(); values.ForEach(v=>funcs.Add(()=>v)); funcs.ForEach(f=>Console.WriteLine(f()));//prints 123,432,768 funcs.Clear(); foreach (var v1 in values) { funcs.Add(()=>v1); } foreach (var func in funcs) { Console.WriteLine(func()); //prints 768,768,768 } 我知道第二个foreach打印768次3次因为lambda捕获的闭包变量。 为什么在第一种情况下不会发生? foreach关键字与Foreach方法有何不同? 是不是因为当我做值时,表达式被评估values.ForEach