2011-07-19 20 views
9

VB.NET沒有out參數,但您可以在COM和P/Invoke方法上指定<Out()> ByRef以獲得外部方法的相同效果。在ByRef內部方法中指定OutAttribute是否目前執行任何操作?

對內部方法(即僅由.NET代碼調用的方法)是否確實有助於Jitter(或VB.NET編譯器)?或者它目前僅作爲程序員筆記使用。

是否有可能在未來的Jitter中使用它,或者編譯時該屬性是否丟失?

回答

9

我已確認VB.NET <Out()>的確會導致C#客戶端需要out參數,所以它看起來確實是一樣的。

此外,C#客戶端將其當前值的參數傳入方法中,但這並不令人意外,因爲與COM或P/Invoke不同,它不需要進行編組。 (並且C#不允許直接通過out參數設置屬性,所以似乎沒有辦法查看C#是否會優化掉以前不需要的分配。)

所以看起來答案它確實有助於將來的C#客戶端使用代碼,並且如果抖動曾經調整C#等價物,它在這裏也會這樣做。雖然因爲VB這樣的語言存在,但它不能做太多,因爲他們自己並不尊重Out attribute

+1

是的,它*完全相同。 C#'out'關鍵字編譯成包含''屬性的IL代碼。 VB.NET只是沒有關鍵字。您可以通過編譯兩個測試項目並使用ILdasm進行比較來驗證這一點。 –

+0

我假設這是指名稱空間System.Runtime.InteropServices中的Out屬性。是這樣嗎? – jswolf19

+0

@ jswolf19是的,修改,也在我的答案鏈接的問題。 –

1

我使用VB類對子類MembershipProvider進行了分類,我們將其稱爲A,然後用C#類對子類A進行調用B.C#代碼B並沒有意識到事件中的抽象方法MembershipProvider已經在VB子類A中實現,直到我在VB類中應用OutAttribute,該參數在MembershipProvider基類抽象方法中指定爲out。這不僅僅是COM或P/Invoke的影響。

相關問題