4

私はVB6コードを見ていて、次のようなステートメントを見ています -

       Public Sub CheckXYZ(abc As Integer)

       If abc <> pqr Then SetVars abc

SetVars の [定義に移動] をクリックすると、次の定義が表示されます。

      Private Sub SetVars(i As Integer)

私はVBが初めてです。これは、括弧なしで関数呼び出しを許可するために、VB で一般的なものですか?

4

4 に答える 4

8

Ryan が指摘したように、括弧は値を返す関数を呼び出す場合にのみ使用する必要があります。

追加したい落とし穴の 1 つは、実際に Sub を呼び出すときに意図せずに括弧を使用すると、VB6 は参照ではなく値でパラメーターを渡すことです。

Sub が複数のパラメーターを取る場合、これは VB6 では違法な構文であるため、リスクはありません。

SomeFunc (arg1, arg2)

しかし、次の例を考えてみましょう:

Sub AddOne(ByRef i As Integer)
  i = i + 1
End Sub

Sub Command1_Click()
  Dim i as Integer

  i = 1
  AddOne i    'i will be passed by reference and increased by 1
  Msgbox i    'Will print "2"
  AddOne (i)  'i will be passed by value, so the return value will be lost!!
  MsgBox i    'Will still print "2"!!
End Sub

したがって、括弧の使用方法に注意してください。小さな変更が予期しない影響を与える可能性があります。

于 2012-04-11T14:53:49.573 に答える
4

これは VB6 の機能(喜んで VB.NET で取り除かれました) であり、正当な構文です。

ただし、コードが読みにくくなる可能性があり、注意しないとメソッド宣言が ByRef の場合に @GTG が指摘したように ByVal が強制される可能性があるため、使用はお勧めしません。

(これについては、こちらの MS ドキュメントを参照してください)

そのため、私のアドバイスは常に括弧を使用することです。次のように、メソッド名と最初の括弧の間にスペースがある場合:

SomeSubName (abc)

これは、何かが間違っているという事実を警告するため (つまり、 abc を強制的に渡すByVal必要がある場合)、使用する必要がCallあり、スペースが削除されます。

Call SomeSubName(abc)

これにより、すべてのメソッド呼び出しがコード内で一貫したものになります。

強制的に通過させたいまれな状況では、これを行うことができます。これにより、より明確になります。abcByVal

Call SomeSubName((abc))

于 2012-04-12T10:28:03.193 に答える
2

パラメータ付きのサブ呼び出しでは、括弧は必要ありません。括弧は、結果を返す関数にのみ必要です。

Private Sub Testy1()
    Function1 "Testy2" ' does not require parenthesis
    Debug.Print Function1("Testy3") ' does require parenthesis
End Sub

Private Function Function1(str as String) as Boolean
    Function1 = True
End Function
于 2012-04-11T14:19:59.597 に答える
0

私は個人的に Call ステートメントを使用したり、使用を推奨したりしません。私は個人的に、機能を持つ括弧とサブを持つ括弧の欠如が2つを効果的に区別していることを発見しました. そうは言っても、Matt の call ステートメント/byval/二重括弧の使い方がとても気に入っています。これが必要なまれな状況では、Call ステートメントを使用する唯一の場所である場合、他のすべての呼び出しよりもさらに目立ちます。私が必要なだけ長生きするなら、私はそれを使うつもりです。:)

于 2012-04-13T14:04:04.783 に答える