4

私は C# が初めてで、Depth で C# を見つけるまでパスカル愛好家でした。Delphi には、C# でも実装されている try{} ステートメントがあります。

ただし、「Try{} よりも Using(){} の方が優れている」と言う人もいます。

次に例を示します。

   //This might throw an exception
   sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
   sock.Connect(ip, port);

   //Try statement
   try
   {
       sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
       sock.Connect(ip, port);
   catch
   {
   }

   //using(){}
   using(sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
   {
          sock.Connect(ip, port);
   }

私の質問:

  1. 「using」ステートメント内で例外が発生した場合はどうなりますか?

  2. 「try」よりも「using」を使用する必要がある場合と、「using」よりも「try」を使用する必要があるのはいつですか?

  3. 「使用」ステートメントの目的は何ですか?

前もって感謝します!

4

7 に答える 7

10

using と try は 2 つの非常に異なるものであり、完全に直交しています。

例外が発生し、それが try ブロック内にない場合、適切な例外ハンドラーが見つかるまでスタックがアンワインドされます。これは、using ステートメントに関係ありません。

使用using {}後にオブジェクトが正しく整理されていることを確認する場合に使用します。例では、sock は using ブロックの後に正しく破棄されます。

using" " の Web 上の検索 (または SO)の使用に関する詳細については、IDisposable.

于 2009-04-22T12:36:48.617 に答える
7

using ステートメントは、IDisposable を実装する新しいオブジェクトを作成 (および使用) するときに使用されます。using ステートメントは、using ブロック内で例外が発生した場合でも、常にオブジェクトを破棄します。

通常、try/catch ステートメントはまったく異なる目的を果たしますが、try/catch/finally または try/finally の種類の finally ブロックは、無条件に実行されるため、同じ目的を果たします。using ステートメントは、破棄するための自動呼び出しを購入します。

David Hayden の記事をお勧めします: C# Code Review - C# Using Statement - Try / finally - IDisposable - Dispose() - SqlConnection - SqlCommand

using ステートメントに関する
MSDN の記事 Try/Catch/Finallyに関する MSDN の記事

于 2009-04-22T12:34:54.287 に答える
4

usingtry/catch とはまったく異なります。usingブロックは、IDisposableist が確実に破棄されるようにするために使用されます。つまり、Dispose()呼び出されます。試して、キャッチして、最後に例外を処理します。usingブロックは次のようになります。

IDisposable d; try { d = m; } finally { d.Dispose(); }

this と a の違いusingは変数のスコープですusing。with はブロック内で作成されるためです。

m任意のオブジェクト構築のプレースホルダーです。詳細については、MSDN の を参照してusingくださいIDisposable。特に、破棄、ガベージ コレクション、および管理されていないリソースに関する情報は、読む価値があります。

于 2009-04-22T12:36:05.763 に答える
3

using ステートメントは、IDisposable が使用後に確実に破棄されるようにします。

例外は、説明できない例外をキャッチするために使用されます。

したがって、それらは実際には交換可能ではありません。

于 2009-04-22T12:36:15.873 に答える
2

「try」ではなく、 try/ finallyおよび/または try/ catchについてです。そして、それらは完全に異なる目的を持っています。

using は、 のわずかに短くて使いやすい表記であるためtry{}finally{ Dispose() }、推奨されます。

于 2009-04-22T13:10:16.383 に答える
1

using は、IDispose を実装する何かの dispose() メソッドを最後に呼び出す try {} finally {} です。したがって、オブジェクトが IDispose をサポートしている場合の経験則として ... using{} を使用します。

于 2009-04-22T12:40:58.170 に答える
0

トライブロックは、予期せぬ事態 (データベースの障害、接続の障害など) が含まれている可能性のあるコード ブロックを対象としており、それ以外の目的で使用する必要はありません。例外をキャッチする準備ができていると、かなりのリソースを消費するため、try-catch-blocks の使用を制限できる場合は、そのほうがよいでしょう。とはいえ、それらは防御的プログラミングのための非常に強力なツールであり、例外ログから問題に関する多くの情報と統計を収集できるため、パフォーマンスの低下は間違いなく価値があります.

Using-blocks は、変数のスコープを厳密に設定するために使用され、非常に短期間しか必要としない、メモリを大量に消費するオブジェクトなどに役立ちます。それらは基本的に、「このブロックの後、オブジェクトを取り除く」というランタイムへのメッセージです。

于 2009-04-22T12:37:25.200 に答える