【发布时间】: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