如何忽略/丢弃c“;out”;变量

本文关键字:out 变量 何忽略 丢弃 | 更新日期: 2023-09-27 17:58:08

假设我被提供了一个看起来像这样的函数:

int doSomething(int parameter, out someBigMemoryClass uselessOutput) {...}

我想使用这个函数,但我根本不需要uselessOutput变量。在不使用uselessOutput的情况下,最好不分配任何新内存,如何使函数工作?

如何忽略/丢弃c“;out”;变量

简单地说,你不能。要么传递一个变量,然后忽略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参数,但您可以通过将方法封装在没有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);

(无论何时do想要指定out参数,您仍然可以,因为原始方法仍然存在。)

当然,原始方法仍然会产生不需要的someBigMemoryClass对象,这可能是(希望是短暂的)资源浪费。如果可以的话,最好直接更改原始方法。