2016-06-22 8 views
1

現在、プロジェクトをVBからC#に変換しています。私はVBプロジェクトでWeb Referenceを持っていますが、これはC#プロジェクト(Add Web Reference)で参照しています。 署名は同じです。vbからc#への引数

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

私が持っている問題は、それがコンパイルされませんということで、エラーを思い付く:私はこのように渡っていることをひそかしようとしてい

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

:VBのコードは次のようになります

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 ByRefまたはByVal(どちらも指定されていない場合はデフォルトでByVal)が呼び出され、メソッドの呼び出し時に指定されません。

C#では、メソッドがパラメータにrefを指定する場合、メソッドを呼び出すときにも 'ref'を指定する必要があります。

-2

あなたは短い答えはノーである、あなたがする必要はありません

VB.NETでのByRefを指定する必要はありません。

理由:VB.NETがあなたに代わって、関数に渡されるオブジェクトであれば、自動的に参照渡しされます。だから、VB.NETはあなたのためにそれを追加します。 VB.NETは、ByRefを指定しない限り、単純なデータ型(文字列、整数など...)ByValを自動的に渡します。

個人的には、私が参考にして何かを渡すことを意味するときには、ByRefを明示的に使用してコードを書いています。また、次のコンパイラオプションを使用します。

Option Explicit On 
Option Strict On 

VBが自動的に行う処理の量を制限します。しかし、それは参照によってpassignオブジェクトに影響を与えているとは思わない。

+2

'関数に渡されるオブジェクトの場合、自動的に参照渡しされます.'それはfalseです。デフォルトでは、値渡しされます。ここで起こっている唯一のことは、メソッド定義がパラメータを参照渡しとして定義している場合、呼び出し側は明示的に記述する必要もないことです。暗黙のうちに、メソッド定義*は明示的にそれを述べる必要があります。 – Servy

+1

あまりにも多くのプログラマーはこれを得ていません - 参照型は 'byref'に自動的に渡されません。 'ByRef'パラメータは、オブジェクトを新しいインスタンスまたは別のインスタンスに再割り当てし、その変更をコールロケーションで確認できることを意味します。パラメータが 'ByVal'の場合、オブジェクト 'identity'を変更してもメソッドの外には何の効果もありません。 –

関連する問題