1

これが常に空の変数を返す理由を理解するのに苦労しています

    Private Function checkEnvelopeStatus(aEnvelopeID As String) As String
    Dim lEnvelopeStatusMessage As String

    Try
        Dim lEnvelopeStatus = mDsapi.RequestStatusEx(aEnvelopeID)
        lEnvelopeStatusMessage = "Subject:" & lEnvelopeStatus.Subject & vbCrLf & "Status Code: " & lEnvelopeStatus.Status
    Catch ex As Exception
        MessageBox.Show(ex.StackTrace, ex.Message)
    End Try

    Return lEnvelopeStatusMessage
End Function

しかし、これは私が望むメッセージを返します

    Private Function checkEnvelopeStatus(aEnvelopeID As String) As String
    Dim lEnvelopeStatusMessage As String

    Try
        Dim lEnvelopeStatus = mDsapi.RequestStatusEx(aEnvelopeID)
        aEnvelopeID = "Subject:" & lEnvelopeStatus.Subject & vbCrLf & "Status Code: " & lEnvelopeStatus.Status
    Catch ex As Exception
        MessageBox.Show(ex.StackTrace, ex.Message)
    End Try

    Return aEnvelopeID 
End Function

関数に対してローカルな変数である場合の文字列の値は、TRyキャッチが閉じた後にクリアされているようです。それでも、入ってくるパラメーターで置き換えると、Try Catchの外部の文字列を保持できますか?私は主にC#/ C ++開発者なので、これは私にとって紛らわしい振る舞いです。なぜこれが起こるのか誰かが説明できますか?

上記のコードのはるかにサニタイズされたバージョンは次のとおりです

Public Function foo(a As String) As String
    Dim b As String
    Try
        b = "banana:"
    Catch ex As Exception

    End Try

    Return b
End Function

同じ動作を示します。

4

4 に答える 4

3

C#では、実行フロー内に、戻り値を初期化せずにメソッドを終了する可能性のあるパスが存在するメソッドのコードをコンパイルすることはできません。割り当てられていない変数を使用すると、コンパイラエラーが発生します。

VB.NETでは、プロジェクトオプションの[ビルド]ページで[割り当て前の変数の使用]オプションを[警告]から[エラー]に変更した場合、エラーを回避できたはずです 。(そして私はそうすることを強くお勧めします)

(ローカライズされたバージョンのVisual Studioを使用しているため、オプションの正確な名前はわかりません)

于 2012-12-27T22:21:25.280 に答える
1

そのコードはコンパイルされないはずです、私はこれを試しました、そしてそれは私にコンパイラエラー「エラー3割り当てられていないローカル変数'b'の使用」を与えました

コンパイラに問題があります。何を使用していますか?

    static public string foo(string a)
    {
        String b;
        try
        {
            b = "banana";
        }
        catch
        {

        }

        return b;
    }
于 2012-12-28T00:30:19.770 に答える
1

抜粋を再スローするまでコンパイルされません。次のことを検討してください。

public String foo(String a) {
    String b;

    try {
        b="banana:";
    }
    catch {
        throw;
    }

    return b;
}

例外が発生した場合は再スローされるため、このコードはコンパイルされます。コンパイラは、到達不能コードなどの論理的な問題を予測します(到達不能コードはエラーではありませんでしたが)。VB.netでの同等性:

Public Function foo(a As String) As String
    Dim b As String

    Try
        b = "banana:"
    Catch ex As Exception
        Throw ex
    End Try

    Return b
End Function

ちなみに、例外をキャッチすることはコーディングの悪い習慣と考えられていました。

于 2012-12-28T00:49:23.653 に答える
0

私はC#で同じコードを書きました

public string foo(string a)
{
    String b;
    try
    {
        b = "banana";
    }
    catch
    {

    }

    return b;
}

}

それは同じ振る舞いを示すようです。私は取り戻されました。もっと考えてみると、それは理にかなっています。私は変数を宣言しているだけで、実際にはまだ何も定義していません。したがって、上記の例を次のようなものに置き換えます。

        public string foo(string a)
    {
        String b = "";
        try
        {
            b = "banana";
        }
        catch
        {

        }

        return b;
    }
}

私のすべての問題を修正しました。これが将来誰かを助けることができることを願っています。知っているほど…。

于 2012-12-27T21:58:49.747 に答える