1

以下は機能しません。

    public string foo()
    {
        using (Random myRandomChoice = new Random())
        {
            return myRandomChoice.Next(10).ToString();
        }
    }

エラーは次のとおりです。

    public string foo()
    {
        Random myRandomChoice = new Random();
        return myRandomChoice.Next(10).ToString();
    }

最初のエラーメッセージは、暗黙的にに変換できないことfooに関するものです。RandomSystem.IDisposable

これは、言語の構文を使用した意図的な策略なのでusing、データベース接続を処理する場合など、特定の状況でのみ使用しますか?または、最初の機能が機能するように、明示的Randomにタイプに変換できますか?IDisposablefoo

でより適切に宣言されるタイプの利用可能なリストはありますusingか?

4

4 に答える 4

4

C#の使用を参照してください

usingステートメントに提供されるオブジェクトは、IDisposableインターフェースを実装する必要があります。このインターフェイスは、オブジェクトのリソースを解放するDisposeメソッドを提供します。

Randomを実装していないためSystem.IDisposable、エラーが発生します。

MSDNから

原則として、IDisposableオブジェクトを使用する場合は、usingステートメントで宣言してインスタンス化する必要があります。usingステートメントは、オブジェクトのDisposeメソッドを正しい方法で呼び出します。また、(前に示したように使用する場合)、Disposeが呼び出されるとすぐに、オブジェクト自体もスコープ外になります。usingブロック内では、オブジェクトは読み取り専用であり、変更または再割り当てすることはできません。

于 2012-07-11T07:33:02.173 に答える
1

usingを実装する型で実行することが可能IDisposableです。

このようにして、そのusingタイプに実装されたDispose(..)メソッドは、プログラムの実行がブロックからジャンプするとすぐに実行されます。

try/finallyそれは、コンパイラによって注入されたコンストラクトの「エイリアス」に他なりません。IL

于 2012-07-11T07:33:06.900 に答える
1

usingIDisposableでdisposeを呼び出すためのより良い構文上の方法です(おそらくtry-finallyで):

usingステートメントは、オブジェクトのメソッドの呼び出し中に例外が発生した場合でも、Disposeが呼び出されるようにします。オブジェクトをtryブロック内に配置し、finallyブロックでDisposeを呼び出すことで、同じ結果を得ることができます。

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

于 2012-07-11T07:34:06.840 に答える
0

ステートメントは、例外がスローされた場合でもオブジェクトで呼び出されるusingことを保証する方法です。Disposeしたがって、オブジェクトがを実装していない場合は意味がありませんIDisposable

次のコード例は同等です。

(1)使用ステートメント:

using (MyClass myObj = new MyClass())
{
    ...
}

finally(2)ブロックでの廃棄:

try
{
    MyClass myObj = new MyClass();
    ...
}
finally
{
    myObj.Dispose();
}

ご覧のとおり、usingステートメントが達成するのはオブジェクトの破棄だけです。したがって、オブジェクトがIDisposableを実装していない場合は意味がありません。

FXCopusingには、タイプにステートメントを使用したことを確認するためのルールがありますIDisposable。どのタイプが実装され、usingステートメントで使用できるかを見つける他の方法については、このStackOverflowの質問を参照してください。IDisposable

詳細については、MSDNのドキュメントを参照してください。

于 2012-07-11T07:36:15.723 に答える