【问题标题】:How can I modify a value type variable passed to a lambda in C#如何在 C# 中修改传递给 lambda 的值类型变量
【发布时间】:2014-02-03 18:45:14
【问题描述】:

我正在编写一些简单的代码来用户初始化从池中返回的对象。

虽然我会在 Pool 端使用 Action 来执行此操作,并传递一个简单的 Lambda 表达式作为参数来定义该初始化。

为了完成这项工作,我需要通过引用将变量传递给 lambda,但对于值类型(例如 Unity3D 中的 int 或 Vector3),我找不到执行此操作的方法。

是否可以通过引用传递它们,如果不能,那么我的下一个最佳选择是什么?

我的单元测试代码是(让我们忽略检查浮点数是否直接相等的问题:)):

pool.SetObjectInitializer(
            (objectInPool) => { 
                objectInPool.x = 1.0f; 
                objectInPool.y = 1.0f; 
                objectInPool.z = 1.0f; });

Vector3 objectFromPool = pool.Get();
Assert.AreEqual(new Vector3(1, 1, 1), objectFromPool);

【问题讨论】:

  • 你为什么不直接使用Func<T, T> 呢?这会比使用ref 更简单。
  • @JonSkeet 如果你打算这样做,那么使用Func<T> 而不是Func<T, T> 可能会更容易,因为你可能只是构建一个新的,而不是改变现有对象。
  • 我想确保没有复制(因此是池:))但我认为你是对的,在这种情况下它可能没有太大区别,我可以打电话从池中返回 objectInitialized(...) - 谢谢! :)
  • 尤其是池化和值类型的想法并不能很好地结合在一起,真的。
  • @rsenna 当然,但这不是这里发生的事情。他正在处理一个向量并设置所有三个字段,因此很明显在这种情况下从头开始创建一个新字段会更容易。

标签: c# lambda parameter-passing


【解决方案1】:

ActionFunc 不要在任何重载中通过引用传递它们的任何参数。要让代表拥有您想要的签名,您需要创建自己的:

public delegate void RefAction<T>(ref T param);

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 2021-08-15
    • 2017-10-29
    • 2014-04-03
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多