假设我已经提供了一个看起来像这样的函数:
new CultureInfo("nl-NL", useUserOverride: false)
我想使用此功能,但我根本不需要intl.cpl
变量。如何在不使用int doSomething(int parameter, out someBigMemoryClass uselessOutput) {...}
的情况下使函数工作,最好不分配任何新内存?
答案 0 :(得分:9)
简单地说 - 你不能。要么传递变量而忽略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.
}
}
但是,如果你多次调用它,这并不能解决你的大内存类问题。为此,您需要重写该功能。不幸的是,在包装函数中调用它仍然需要相同的内存分配。
答案 1 :(得分:2)
没有办法简单地省略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
对象,这可能是(希望是短暂的)浪费资源。如果可以选择,最好直接更改原始方法。