2016-06-22 35 views
1

我目前正在從VB項目轉換到C#。我在C#項目(添加Web引用)中引用的VB項目中有一個Web參考。 簽名是相同的。 VB代碼如下所示:VB到C#參數

If Not tws.StartSession(tsd) Then 
    Throw New systemMonitor.internalEx.securityEx("Failed to initiate a TROPOS session") 
End If 

我試圖隱蔽跨越就象這樣:

// Start our session 
if (!this._service.StartSession(this._details)) 
    throw new Exception("The TROPOS session failed to start."); 

我的問題是,它不會編譯,並與錯誤出現:

argument 1 must be passed with the 'ref' keyword

所以我改成了這樣:

// Start our session 
if (!this._service.StartSession(ref this._details)) 
    throw new Exception("The TROPOS session failed to start."); 
編譯並運行的

(雖然似乎沒有發生,但這是另一個問題)。 我的問題很簡單。 在VB中,你不必設置ByRef關鍵字?

+0

請問這個http://stackoverflow.com/questions/9207620/why-is-it-not-necessary-to-indicate-byval-byref-anymore有什麼幫助嗎? – bi0phaz3

+0

也顯示全班。對彼此而言。 vb和c# – Seabizkit

+0

它解釋了這些差異,但並沒有說它是否需要在VB中呢? – r3plica

回答

1

在VB.NET中ByRefByVal(可選)在被調用的方法中指定(如果沒有指定,則默認爲ByVal),並且在調用方法時未指定它。

在C#中,如果方法爲該參數指定了ref,那麼在調用方法時還必須指定'ref'。

-2

你不需要在VB.NET

簡單的答案是否定的,你不必指定爲ByRef。

這就是爲什麼:VB.NET再一次爲你做事情,如果它是一個傳遞給函數的對象,它將自動被引用傳遞。所以在VB.NET中爲你添加它。除非您指定ByRef,否則VB.NET將自動傳遞簡單的數據類型(字符串,整數等)。ByVal

我個人喜歡用ByRef明確地寫我的代碼,當我的意思是通過引用傳遞某些東西。我還使用以下編譯器選項:

Option Explicit On 
Option Strict On 

這限制了VB爲我自動執行的操作。但我認爲它不會影響通過引用對對象進行導入。

+2

'如果它是一個傳遞給函數的對象,它將自動被引用傳遞'這是錯誤的。默認情況下,它將按值傳遞。這裏唯一發生的事情是,如果方法定義將參數定義爲被引用傳遞,調用者不需要*明確地聲明它;這是隱含的,但方法定義*仍然需要明確說明它。 – Servy

+1

太多的程序員只是不明白 - 引用類型是* not *自動通過'byref'。 'ByRef'參數意味着您可以將該對象重新分配給新的或不同的實例,並在呼叫位置處看到更改。如果參數是'ByVal',那麼改變對象'身份'不會對方法產生任何影響。 –