假设我已经拿到了一个类似于下面这样的函数:
int doSomething(int parameter, out someBigMemoryClass uselessOutput) {...}
我想使用这个函数,但我完全不需要uselessOutput
变量。如何在不使用uselessOutput
的情况下让函数工作,最好不要分配任何新的内存?
假设我已经拿到了一个类似于下面这样的函数:
int doSomething(int parameter, out someBigMemoryClass uselessOutput) {...}
我想使用这个函数,但我完全不需要uselessOutput
变量。如何在不使用uselessOutput
的情况下让函数工作,最好不要分配任何新的内存?
简单来说,你不能这样做。要么传递一个变量并忽略之后的out
(如果从分配out
参数产生的内存开销很小,即不需要大量内存),要么自己编辑该函数的代码。
我现在想到的一种方法是将该函数进行包装,这样如果每次都必须传递一个被忽略的out
变量会很麻烦。它不能消除原始函数中的out
,但它提供了一种在调用该函数时完全不关心out
变量的方法。
class OutExample
{
static void Method(out int i)
{
i = 44;
}
static void MethodWrapper()
{
int i = 0;
Method(out i);
}
static void Main()
{
int value;
Method(out value);
// value is now 44
MethodWrapper();
// No value needed to be passed - function is wrapped. Method is still called within MethodWrapper, however.
}
}
然而,这并不能解决你的大内存类问题,如果你经常调用它的话。为了解决这个问题,你需要重写这个函数。不幸的是,在包装函数中调用它仍然需要相同的内存分配。
out
参数。 - Nick Bullout
不会复制任何内容并且会直接写入您提供的变量,因此如果没有访问原始函数的权限,内存问题就无法真正得到解决。 - Scar没有简单地省略out
参数的方法,但您可以通过将方法包装在不带out
参数的扩展方法中,使您的生活更加舒适:
// let's assume the method in question is defined on type `Foo`:
static class FooExtensions
{
public static int doSomething(this Foo foo, int parameter)
{
someBigMemoryClass _;
return foo.doSomething(parameter, out _);
}
}
然后调用该扩展方法,而不是实际的实例方法:
Foo foo = …;
int result = foo.doSomething(42);
(当你确实需要指定 out
参数时,你仍然可以这样做,因为原始方法仍然存在。)
当然,原始方法仍将产生不必要的 someBigMemoryClass
对象,这可能会浪费资源(希望是短暂的)。如果有可能,最好直接更改原始方法。