2016-07-22 75 views
5

說我已經提供了,看起來像這樣的功能:如何忽略/放棄c#「out」變量?

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

我想使用這個功能,但我不需要uselessOutput可變的。如何在不使用uselessOutput的情況下使函數正常工作,最好不分配任何新內存?

+4

如果您無法修改此方法,則無法執行任何操作,因爲該方法會初始化該方法。如果不使用它,垃圾收集器將在需要時回收該內存。 –

回答

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參數,你仍然可以,因爲原來的方法仍然存在。)

當然原始方法仍然會產生不需要的對象,這可能是一個(希望短暫的)浪費資源。如果這是一個選項,最好直接更改原始方法。

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. 
    } 
} 

但是,這並不能解決你的大內存類問題,你應該多次調用它。爲此,您需要重寫該函數。在包裝函數中調用它仍然會需要相同的內存分配。

+0

如果方法執行一些密集的東西來爲該未使用的參數賦值,則內存命中將不會如此微不足道。 – Sehnsucht

+0

@Sehnsucht我打算假設情況並非如此,因爲它通常不是。這個問題沒有具體說明這是一個問題,但如果這是一個更好的解決方案,則需要。 stakx提供了一個解決方案,可能有助於避免這個問題。不過,這可以避免「out」參數。 –

+0

@Sehnsucht此外,如果對參數進行強化操作,那麼性能總是不會出現在那裏?無論方法如何包裝,您都需要刪除執行密集函數的代碼。除非我監督 –