說我已經提供了,看起來像這樣的功能:如何忽略/放棄c#「out」變量?
int doSomething(int parameter, out someBigMemoryClass uselessOutput) {...}
我想使用這個功能,但我不需要uselessOutput
可變的。如何在不使用uselessOutput
的情況下使函數正常工作,最好不分配任何新內存?
說我已經提供了,看起來像這樣的功能:如何忽略/放棄c#「out」變量?
int doSomething(int parameter, out someBigMemoryClass uselessOutput) {...}
我想使用這個功能,但我不需要uselessOutput
可變的。如何在不使用uselessOutput
的情況下使函數正常工作,最好不分配任何新內存?
沒有辦法簡單地忽略了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
參數,你仍然可以,因爲原來的方法仍然存在。)
當然原始方法仍然會產生不需要的對象,這可能是一個(希望短暫的)浪費資源。如果這是一個選項,最好直接更改原始方法。
簡而言之 - 你不能。或者傳遞一個變量,然後忽略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.
}
}
但是,這並不能解決你的大內存類問題,你應該多次調用它。爲此,您需要重寫該函數。在包裝函數中調用它仍然會需要相同的內存分配。
如果方法執行一些密集的東西來爲該未使用的參數賦值,則內存命中將不會如此微不足道。 – Sehnsucht
@Sehnsucht我打算假設情況並非如此,因爲它通常不是。這個問題沒有具體說明這是一個問題,但如果這是一個更好的解決方案,則需要。 stakx提供了一個解決方案,可能有助於避免這個問題。不過,這可以避免「out」參數。 –
@Sehnsucht此外,如果對參數進行強化操作,那麼性能總是不會出現在那裏?無論方法如何包裝,您都需要刪除執行密集函數的代碼。除非我監督 –
如果您無法修改此方法,則無法執行任何操作,因爲該方法會初始化該方法。如果不使用它,垃圾收集器將在需要時回收該內存。 –