问题标签 [captured-variable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
10 回答
61785 浏览

c# - 在 C# 的循环中捕获的变量

我遇到了一个关于 C# 的有趣问题。我有如下代码。

我希望它输出 0、2、4、6、8。但是,它实际上输出了 5 个 10。

似乎这是由于所有操作都引用了一个捕获的变量。结果,当它们被调用时,它们都具有相同的输出。

有没有办法绕过这个限制,让每个动作实例都有自己的捕获变量?

0 投票
3 回答
387 浏览

c# - 捕获的变量实例化问题

我目前正在思考一些我无法做到的想法。

问题是我想使用一个 lambda 函数来实例化捕获的变量和另一个 lambda 来访问该变量的属性。

由于实例化发生在 lambda 中,因此在我想在第二个 lambda 中使用它时,变量实际上并没有被实例化。这是一种鸡和蛋的问题。

我知道该变量在第二个 lambda 中使用时被实例化,但编译器不会。

我的想法有什么可行的方法吗?这是实际的代码:

0 投票
4 回答
1925 浏览

c# - 将变量捕获到事件处理程序中

我可能有点想太多了,但我可以使用一些帮助来确定执行以下操作的方法/最佳方法。

我有一个事件处理程序,它附加到一个对象,该对象是另一个类的属性。在我的事件处理程序中,我需要有关导致事件的对象的其他元数据(即包含它的对象的 ID)。从发送者和事件信息中无法获得我需要的信息。我的倾向是这将是一个使用捕获变量的好地方,但我不确定我的实现想法。

因此,为了在代码中说明,我有一个事件处理程序:

(作为说明,我在这里使用基本 EventArgs,但在我的实际实现中,它是一个专门的子类,并且事件是使用通用 EventHandler 声明的)

我目前正在像这样附加它:

我后来像这样分离它:

我在处理事件时想要 topObject 的 ID,所以我打算将 MyEventHandler 更改为具有以下签名:

并像这样附加事件处理程序:

我对此的担忧有两个方面。

  1. 一旦我在附加它的函数之外,处理程序实际上会消失而不删除的范围是否存在问题。过去我见过一些奇怪的错误,当我使用 lambda 表达式时,事件处理程序在我身上消失了。并非一直如此,只是在某些情况下。谁能告诉我这些情况可能是什么,以便我知道何时可以安全地使用我拥有的语法。
  2. 我记不清了,但我认为如果我使用这种语法,我永远不会删除事件处理程序,因为创建的隐式对象是不一样的。

由于这两个问题,我的想法是创建一个动作并保存该动作并使用它,直到我需要删除事件处理程序。我做了以下事情:

我知道该操作无法强制转换为事件处理程序。是否有一些简单的方法可以进行这种转换,仍然可以确保我可以分离事件处理程序?我只是在想这个/有没有我现在看不到的方法来做到这一点?

0 投票
1 回答
1187 浏览

c# - 将两个正则表达式组组合成一个键/值对对象?

假设我有以下字符串

和 2 个正则表达式组:键和值

我们如何将这两个捕获的组组合成键/值对对象,如 Hashtable?

0 投票
4 回答
495 浏览

c# - How to avoid captured variables?

I'm having a problem with

When the DoSomething gets executed, it receives the latest value for each captured variable instead of the value I desired. I can imagine a solution for this, but it imagine you guys can come up with better solutions

0 投票
3 回答
439 浏览

c# - 如何计算 IEnumerable 的等级并将其存储在类型 T

我想计算 IEnumerable 列表中元素的等级并将其分配给成员。但下面的代码仅在第一次调用时才有效。第二次调用从最后一个排名值开始。所以我得到的是 012 和 345 而不是输出 012 和 012

我知道该变量r在第二次调用时被捕获(关闭)并重用。我不想要那种行为。有什么干净的方法来计算排名并分配它吗?变量(在r实际代码中)也不在foreach存在循环的同一范围内。它在一个返回的函数中var first

0 投票
1 回答
179 浏览

c# - 捕获的变量...“捕获”实际上代表什么?

在“捕获的变量”中如何捕获变量?

“捕获”一词实际上代表什么?

这是否意味着在不涉及装箱的情况下引用值类型?

谢谢

0 投票
1 回答
94 浏览

c# - ParameterizedThreadStart 中捕获的变量

我有以下代码创建 10 个线程,这些线程依次将消息写入控制台:

我的理解是ParameterizedThreadStart需要一个对象,该对象的引用副本被发送到线程。如果是这种情况,因为我没有i在每个循环中制作本地副本,所有新线程都将指向相同的内存位置,这意味着某些线程号可能会“丢失”。虽然运行了这个(甚至针对大量线程/睡眠时间),但每个值i都有自己的线程。谁能解释为什么?

0 投票
1 回答
581 浏览

c# - 在C#中的一个循环中的一个线程中捕获变量,解决办法是什么?

我遇到了这个示例,该示例演示了Captured Variableswithin aThread和 a loop 的情况:

代码 1

结果 1

0223558779

据说建议的解决方案是创建一个临时变量,如下所示:

代码 2

结果 2

0124356879

似乎该解决方案仅通过使用将创建 10 个不同内存位置的变量来消除冗余,但序列仍然没有排序,我理解原因,这与在迭代和启动之前temp线程执行速度不快有关Console.Write(temp)未来的线程,我试图通过睡眠主线程来减慢循环,让每个线程有时间通过​​执行以下操作正确写入:

代码 3

它解决了这个问题,但是当涉及到实际场景时,我不认为这是一个真正的解决方案,我在这里是否缺少一个技巧或练习来显示一个完整的正确序列,例如0123456789

0 投票
0 回答
60 浏览

c# - 为什么我在这里看不到捕获的变量行为?

我在捕获的变量中遇到了这种奇怪的行为。下面是两个循环。我希望两者的行为相同。为什么它的行为不同?

第一个循环打印 1,2,3,4,5 第二个循环打印 5,5,5,5,5