Tag: closures

访问Lambda表达式中的Modified Closure

foreach(var category in categories) { a.AddRange(_db.Articles.Where(c => c.Categories.Contains(category))); } 代码运行正常,但我在lambda表达式中使用的category得到关于“访问修改后的闭包”的警告。 问题:在这种情况下是否有任何后果的警告?

Linq哪里有本地计数器关闭不同结果VS手表

我尝试使用LinQ Where扩展函数删除array前3个元素。 这是一个例子: var array = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; var count = 3; var deletedTest1 = 0; var test1 = array.Where(x => ++deletedTest1 > count).ToList(); Console.WriteLine($”{{{String.Join(“, “, test1)}}}”); var deletedTest2 = 0; var test2 = array.Where(x => ++deletedTest2 > count).AsEnumerable(); Console.WriteLine($”{{{String.Join(“, “, test2)}}}”); var deletedTest3 = […]

这个Resharper修复处理关闭警告是否有意义?

我正在努力摆脱静态代码分析中的一些警告。 在一个特定情况下,没有在ManualResetEvent上进行处理。 有问题的代码在主线程上执行Func并阻塞调用线程一定的毫秒数。 我意识到这听起来像一个奇怪的事情,但它超出了这个问题的范围,所以请耐心等待。 假设我像这样添加一个using语句: object result = null; using (var completedEvent = new ManualResetEvent(false)) { _dispatcher.BeginInvoke((Action)(() => { result = someFunc; completedEvent.Set(); // Here be dragons! })); completedEvent.WaitOne(timeoutMilliseconds); return result; } 现在,我意识到这可能会导致问题。 我也碰巧使用了Resharper ,它通过“访问处理关闭”的消息警告我。 Resharper建议通过将违规行更改为: if (completedEvent != null) { completedEvent.Set(); } 现在,提出的解决方案让我很困惑。 在正常情况下,没有理由通过using语句将变量设置为null 。 .NET中的闭包是否有一些实现细节可以保证在已经关闭的变量处理后变量为null ? 作为一个额外的问题,处理ManualResetEvent问题的解决方案是什么?

使闭包捕获的变量变为volatile

闭包捕获的变量如何与不同的线程交互? 在下面的示例代码中,我想将totalEvents声明为volatile,但C#不允许这样做。 (是的,我知道这是不好的代码,这只是一个例子) private void WaitFor10Events() { volatile int totalEvents = 0; // error CS0106: _someEventGenerator.SomeEvent += (s, e) => totalEvents++; while(totalEvents < 10) Thread.Sleep(100); } 编辑 :人们似乎忽略了我的问题。 我知道我不能在本地变量上使用volatile 。 我也知道示例代码很糟糕,可能以其他方式实现,因此我的“坏代码”免责声明。 这只是为了说明问题。 无论如何,似乎没有办法强制将volatile语义强加到捕获的局部变量上,所以我将实现一种不同的方式。 谢谢你的答案,无论如何我已经学到了很多有用的东西。 🙂

Java中的Lambda表达式?

我需要将部分项目从C#切换到Java。 但在此之前,我想仔细和完整地比较两种语言。 关于lambda表达式,我可以通过C#编写非常优雅的代码,问题是如何在Java中优雅地实现相同的function? 提前致谢! class Program { enum Gender { Male, Female } class Student { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public Gender Gender { get; set; } public override string ToString() { return string.Format(“Id: {0}, Name: {1}, Age: […]

奇怪的lambda行为

我偶然发现了这篇文章并发现它非常有趣,所以我自己进行了一些测试: 测试一: List actions = new List(); for (int i = 0; i Console.WriteLine(i)); foreach (Action action in actions) action(); 输出: 5 5 5 5 5 测试二: List actions = new List(); for (int i = 0; i Console.WriteLine(j)); } foreach (Action action in actions) action(); 输出: 0 1 2 3 4 根据文章,在Test One中,所有lambdas都包含对i的引用,这使得它们全部输出5.这是否意味着我在测试2中得到了预期的结果,因为为每个lambda表达式创建了一个新的int ?

在匿名代表中捕获的私有字段

class A { public event EventHandler AEvent; } class B { private A _foo; private int _bar; public void AttachToAEvent() { _foo.AEvent += delegate() { … UseBar(_bar); … } } } 由于委托捕获变量this._bar,它是否隐式持有B的实例? 将B的实例通过事件处理程序引用并通过A的实例捕获变量吗? 如果_bar是AttachToAEvent方法的局部变量,它会有所不同吗? 因为在我的情况下,A的实例寿命更长并且远小于B的实例,所以我担心通过这样做会导致“内存泄漏”。

C#Action,Closure和Garbage Collection

我是否需要将MyAction设置为null,以便垃圾收集能够继续使用这些类中的任何一个? 当两个class级的生命周期几乎相同时,我不太关心。 当Class1的寿命比Class2长得多或者Class2的寿命比Class1长得多时,我的问题更合适。 这里的代码被删除了。 假设Class1和Class2都包含可能影响其生命周期的其他成员和方法。 public class Class1 : IDisposable { public Action MyAction { get; set; } // Is this necessary? public void Dispose() { MyAction = null; } } public class Class2 { string _result = string.Empty; public void DoSomething() { Class1 myClass1 = new Class1(); myClass1.MyAction = s => _result = s; […]

有人可以用真正的简单语言向我解释什么是封闭?

可能重复: 什么是.NET中的’闭包’? 我目前正在研究lambda表达式,并且关闭这个词仍在继续。 有人可以用真正简单的语言向我解释。

在C#中,闭包不是不可变的有什么好的理由吗?

我一直在脑子里反复思考,而且我似乎无法想出为什么C#闭包是可变的。 如果您不知道究竟发生了什么,这似乎是一种获得意想不到的后果的好方法。 也许知识渊博的人可以阐明为什么C#的设计者会允许状态在闭包中改变? 例: var foo = “hello”; Action bar = () => Console.WriteLine(foo); bar(); foo = “goodbye”; bar(); 这将为第一个呼叫打印“hello”,但外部状态在第二个呼叫时改变,打印“再见”。 更新了闭包的状态以反映局部变量的更改。