web-dev-qa-db-ja.com

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

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

82
cspolton

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

ただし、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相互運用またはプラットフォーム呼び出しのために呼び出しがマーシャリングされる場合にのみ違いが生じます。

89
Guffa

いいえ、警告なしで初期化されていない変数をメソッドに渡すことを許可する同等の構造はありませんが、私の question and answer で指定されているように <Out()>属性ByRefパラメーター定義では、VBは無視しますが、isはC#として扱われますoutパラメーター。

したがって、参照変数を事前に初期化してNothingandを指定して<Out()> ByRefを指定し、意図を示します(C#ユーザーがアクセスした場合に機能します)あなたの方法)。

割り当てられていない参照変数のデフォルトNothingにアクセスするタイミングがわかっている場合は、「警告構成」「割り当て前の変数の使用」to "None"プロジェクトレベル(Project Properties> Compileで、Configurationを "All Configurations"に設定します。 「この設定を変更する前に)、またはVS2015(VB.NET 14)では、#Disable Warning BC42030

30
Mark Hurd

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

ここで答えを見つけました

更新

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

7
David

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
1
TheWhitde

VBにはC#outと同じ属性がありますが、今日使用しても警告が表示されます。 githubのvblangエリアに修正方法の詳細があります。 https://github.com/dotnet/vblang/issues/67

0
Paul Cohen

VB.NETの参照渡し方法を使用できます。

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

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

ByRefを使用するだけです。

0
Josh