标签: captured-variable

C#中循环中的捕获变量

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

List<Func<int>> actions = new List<Func<int>>();

int variable = 0;
while (variable < 5)
{
    actions.Add(() => variable * 2);
    ++ variable;
}

foreach (var act in actions)
{
    Console.WriteLine(act.Invoke());
}
Run Code Online (Sandbox Code Playgroud)

我希望它输出0,2,4,6,8.但是,它实际输出5个10.

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

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

c# closures captured-variable

202
推荐指数
7
解决办法
5万
查看次数

如何避免捕获变量?

我遇到了问题

foreach(var category in categories)
{
    foreach(var word in words)
    {
        var waitCallback = new WaitCallback(state =>
        {
            DoSomething(word, category);
        });

        ThreadPool.QueueUserWorkItem(waitCallback);
    }
}
Run Code Online (Sandbox Code Playgroud)

DoSomething执行get时,它会接收每个捕获变量的最新值,而不是我想要的值.我可以想象一个解决方案,但它想象你们可以提出更好的解决方案

.net c# concurrency delegates captured-variable

6
推荐指数
1
解决办法
374
查看次数

捕获的变量......"捕获"实际代表什么?

在"捕获的变量"中如何捕获变量?

"捕获"一词究竟代表什么?

这是否意味着引用值类型而不涉及拳击?

谢谢

.net c# casting captured-variable

5
推荐指数
1
解决办法
164
查看次数

在ParameterizedThreadStart中捕获变量

我有以下代码创建10个线程,然后将消息写入控制台:

for (int i = 0; i < 10; i++)
{
    {
        Thread thread = new Thread((threadNumber) =>
            {
                for (int j = 0; j < 10; j++)
                {
                    Thread.Sleep(200);
                    Console.WriteLine(string.Format("Thread: {0}, Line: {1}", threadNumber, j));
                }                           
            });
        thread.Start(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的理解是ParameterizedThreadStart将一个引用副本的对象发送到该线程.如果是这种情况,因为我没有i在每个循环中创建一个本地副本,所有新线程将指向相同的内存位置,这意味着某些线程号可能被"遗漏".虽然运行了这个(甚至对更多的线程/休眠时间),每个值i都有自己的线程.有谁能解释为什么?

c# multithreading captured-variable

5
推荐指数
1
解决办法
90
查看次数

Java中捕获的变量存储在哪里?

我试图理解 Java 中捕获变量的概念。

我找到了关于它的非常详细的文章:http : //www.devcodenote.com/2015/04/variable-capture-in-java.html

我不确定字节码部分:

类似地,为了访问封闭方法的局部变量,会制作变量的隐藏副本并将其保存在内部类文件中,从那里访问变量。

在编译时可能不知道最终原始值时,如何将其保存到类文件中(在编译期间)?

例如:

void foo(int x){
    final int y = 10 + x;

    class LocalClass(){
        LocalClass(){
            System.out.println(y);  // works fine
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果作者错了,运行时是否将局部变量复制到方法区的LocalClass空间中?

java captured-variable

2
推荐指数
1
解决办法
226
查看次数

捕获变量实例化问题

我目前正在思考一些我无法做对的想法.

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

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

我知道变量在第二个lambda中使用时实例化,但编译器却没有.

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

class Program
{
    static void Main(string[] args)
    {
        SqlCommand cmd;

        using (new DisposableComposite(
            () => cmd = new SqlCommand(),
            () => cmd.Connection)) // <- compiler error - variable not instantiated
        {
            // code
        }
    }
}

class DisposableComposite : IDisposable
{
    private List<IDisposable> _disposables = new List<IDisposable>();

    public DisposableComposite(params Func<IDisposable>[] disposableFuncs)
    {
        // ensure the code is actually executed
        foreach (var func in disposableFuncs)
        {
            IDisposable obj = func.Invoke();
            _disposables.Add(obj);
        } …
Run Code Online (Sandbox Code Playgroud)

c# lambda captured-variable

1
推荐指数
1
解决办法
374
查看次数

如何计算IEnumerable <T>的等级并将其存储在T类中

我想计算IEnumerable列表中元素的等级并将其分配给成员.但是下面的代码仅在第一次调用时起作用.第二次通话从最后一个等级值开始.所以我没有输出012和012,而是输入了012和345

    class MyClass
    {
        public string Name { get; set; }
        public int Rank { get; set; }
    }

    public void SecondTimeRankEvaluvate()
    {
        MyClass[] myArray = new MyClass[] 
        {
            new MyClass() { Name = "Foo" },
            new MyClass() { Name = "Bar" },
            new MyClass() { Name = "Baz" }
        };

        int r = 0;
        var first = myArray.Select(s => { s.Rank = r++; return s; });

        foreach (var item in first)
        {
            Console.Write(item.Rank);
        }
        // Prints 012
        Console.WriteLine("");
        foreach …
Run Code Online (Sandbox Code Playgroud)

c# closures captured-variable

0
推荐指数
1
解决办法
357
查看次数