3

次のコードを検討してください。

public int DownloadSoundFile()
{
   using (var x= new X())
   {
       return x.Value;
   }
}

そしてこのコード:

public int DownloadSoundFile()
{
    if (x!=null)
    {
       return x.Value;
    }
}

最初のコードではコンパイル時のエラーは発生しませんが、2 番目のコードでは次のエラーが発生します。

すべてのコード パスが値を返すわけではない

ifこれは、スコープ外の値を返す必要があることを意味します。

ifスコープ外の値を返す必要があるのに、スコープ外の値を返す必要がないのはなぜusingですか?

4

4 に答える 4

20

if スコープから値を返す必要があるのに、using スコープから値を返す必要がないのはなぜですか?

ifスコープは (条件が満たされない場合) 実行されない可能性があるため、スコープの本体はusing常に実行されることが保証されています (結果を返すか、コンパイラに受け入れられる例外をスローします)。スコープのif場合、条件が満たされていない場合、メソッドは未定義であり、コンパイラはそれを拒否します。

したがって、記述した条件が満たされない場合に返す値を決定する必要があります。

public int DownloadSoundFile()
{
    if (x != null)
    {
       return x.Value;
    }

    // at this stage you should return some default value
    return 0;
}
于 2013-07-22T07:46:44.470 に答える
7

そのため、if スコープの外で値を返す必要があります。

いいえ。 から値を返す必要がありますint method()if()vsとは関係ありませんusing()

public int DownloadSoundFile()
{
    if (x!=null)
    {
        return x.Value;
    }
    // and now?? no return value for the method
    // this is a 'code path that does not return a value'
}
于 2013-07-22T07:46:55.633 に答える
0

using次のコードのエイリアスです。

IDisposable x = null;
try
{
     x= new X();
     //inside the using
     return x.Value;
}
finally
{
     if(x != null)
        x.Dispose();
}

したがって、すべてのパスが値を返すことがわかります。実際、パスは 1 つしかありません (または、例外かもしれません)。

于 2013-07-22T08:09:24.850 に答える
0
public int DownloadSoundFile()
{
    if (x!=null)
    {
        return x.Value;
    }
}

このコードでは、 xnull!!!の場合はどうでしょうか。この状態で、関数がどのように値を返すか。したがって、正しいコードは次のようになります。

public int DownloadSoundFile()
{
    if (x!=null)
    {
        return x.Value;
    }
    else
    {
        // your return statement;
    }
}

以下のコードも使用できます。

return x != null ? x.value : *something else*

using は何かを返すために使用されるのではなく、主に例外によってコードが壊れないようにするために使用されます。主にデータベース接続は using ステートメントで作成されます。これにより、接続の例外が抑制され、接続がスコープ外になると接続が閉じられるようになるためです。通常、IDisposable から継承されたオブジェクトは、dispose() メソッドが呼び出されるように using ステートメント内で使用されます。

于 2013-07-22T07:49:40.670 に答える