C#の出力パラメーターに相当するVB.NETはありますか?


95

VB.NETには、C#out関数パラメーターと直接同等のものがありますか?関数に渡される変数を初期化する必要はありませんか?

回答:


98

いいえ、outVB にはキーワードに相当するものはありません。

ただし、VBはメソッド内のすべてのローカル変数を自動的に初期化するので、 ByRef、最初に変数を明示的に初期化する必要なく。

例:

Sub Main()
  Dim y As Integer
  Test(y)
End Sub

Sub Test(ByRef x As Integer)
  x = 42
End Sub

(フレームワーク内のコード(Double.TryParseなど)を調べると、<OutAttribute>パラメーターに追加されていることがわかりますが、これは、呼び出しがCOM相互運用機能またはプラットフォーム呼び出しに対してマーシャリングされている場合にのみ、違いを生じます。)


2
@Spolto:VBScriptをVBに変換する場合は、必ずExplicitおよびStrictモードをオンに設定してください。より多くのエラーメッセージが表示されますが、ほとんどの場合、二次的な問題(たとえばObject、型なしで宣言された変数はになるため、ByRef x As Integerパラメーターに使用できません)ではなく、問題の原因(たとえば、型なしで宣言された変数)を指摘します。
Guffa

4
@Guffa:バージョンかどうかはわかりませんが、初期化されていない参照型変数をByRefパラメーターとして渡すと、コンパイラの警告も表示されます。(値型パラメーターでは発生しません。)
Dan Tao

4
@Dan Tao、Spolto:それは違いのようです。参照型についても警告が表示されます。outパラメータを指定できないことは、言語の制限であり、警告を取り除くために変数を初期化する必要があるだけです。Nothing結果を変更しなくても、それらに割り当てても警告は表示されません。
Guffa

1
@Guffa:はい、私はNothingこれまで彼らに割り当ててきました。大規模なレガシーWebサイトで何百回も実行しなければならないので、時間がかかるだけです。調査ありがとうございます。
cspolton

3
@MarkHurd:次に、Out属性がC#キーワードと同等ではないことをすでに説明したので、反対票は不当outです。
Guffa

32

いいえ、そこに私の中で述べたように、非初期化変数が警告なしメソッドに渡すことができますが、ない同等の構造ではありません質問と回答の指定<Out()>属性ByRefVBはそれを無視するものの、パラメータ定義は、された C#と治療しますoutパラメータとして。

したがって、参照変数をあらかじめ初期化し、その意図を示すようNothing 指定<Out()> ByRefします(C#ユーザーがメソッドにアクセスする場合に機能します)。

あなたがデフォルトにアクセスしようとするとき、あなたが知っていると感じた場合はNothing、あなたが「警告の設定」を設定することができますそれ以外の場合は、割り当てられていない参照変数に「代入する前に、」変数の使用をするなし「」あなたはおそらく(プロジェクトのプロパティ>コンパイル、プロジェクトレベルでとこの設定を変更する前に構成を「すべての構成」に設定したい場合)、またはVS2015(VB.NET 14)ではを使用できます#Disable Warning BC42030


3
これは重要です。MembershipProviderのVBサブクラスがあり、次にVBサブクラスのC#サブクラスがありました。MembershipProvider基本クラスで指定されたパラメーターのVBクラスの属性を適用するまで、C#コードはMembershipProviderの抽象メソッドが既に実装されているという事実を認識していませんでした。
Richard Collette

@RichardColletteそれはおそらく私のリンクされた質問への答えになる価値があります!
Mark Hurd、2014年

9

C#バージョン

  void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}

Vb.netバージョン

    Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
  x += 1
  y += 1 
  z = 5 
End Sub

ここで答えが見つかりました

更新

コメントで述べたように、outスロットで使用されるパラメータを初期化することを忘れないでください


一般的に、ByRefが最も近いものであることに同意ます。ただし、質問が尋ねるように、初期化されていない変数を渡すと、ByRefは引き続き警告をスローします。
Richard

私の反対票はかなり前からのものでした。リンクしたWebサイトは非常に一般的です。特定の問題、違い、専門性については記載していません。また、あなたの答えはまだ質問に答えません。
Mark Hurd、2012年

1

VB.NETで、配列を返す関数を「参照」で呼び出すという問題がありました。

コンパイラは警告としてフラグを立てましたが、問題ありませんでした。修正は非常に簡単で、おそらく良いプログラミング方法です。

私が変更され

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing

fnRetArray(m_arr_values)

変数名が説明的であるかどうかをコーディングするときにも役立ちます...

Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
    ...
End Sub

3
ハンガリー語表記は、.NETフレームワーク設計ガイドラインに違反しています。
Gqqnbig 2017年

0

VB.NETの参照渡しメソッドを使用できます。

初期化しないと変数を使用できないため、C#のOutパラメーターメカニズムが必要です。

VB.NETは、それ自体で自動的に行うため、特別なキーワードを必要としません。

ByRefを使用してください。


3
これは質問に答えません、そしてそれはC#に関して間違っています。
cspolton 2012

byrefを使用すると、初期化せずに、params値を変更できます。ただし、C#の出力パラメーターとは対照的に、パラメーターを値で初期化して関数で使用することは許可されていますが、C#の出力キーワードでは、これを出力パラメーターとしてのみ使用し、入力パラメーターとして使用することはできません。関数。また、関数内でこのパラメーターの値を変更または設定しない場合、C#がコンパイルエラーを発行するのとは対照的に、コンパイラーはそれをエラーとしてキャッチしません。
pashute 16


-5

変数の前にキーワードByRefを使用します。


4
ByRefrefC#のパラメーターに相当し、関数に渡す前に初期化する必要があります。
cspolton
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.