3

私はC#に慣れていません。DepthにC#が見つかるまでは辛抱強い恋人でした。Delphiにはtry {}文があり、これもC#に実装されています。

しかし、「Using(){}はtry {}よりも優れている」と言及している人もいます。

これが一例です。

   //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"を使用するべきですか そして、「使う」より「試す」ときはいつですか。

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

前もって感謝します!


7 답변


10

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

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

つかいますusing {}オブジェクトが使用後に正しく整頓されていることを確認したい場合 - あなたの例では、靴下は使用ブロックの後に正しく処分されます。

の使用に関する詳細情報using"(またはSO)で"の検索IDisposable"


7

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

通常、try / catchステートメントはまったく異なる目的を果たしますが、try / catch / finallyまたはtry / finallyソートのfinallyブロックは、無条件に実行されるのと同じ目的を果たします。使用法はあなたに処分するための自動電話を購入します。

David Haydenの記事をお勧めします。C#コードレビュー - C#ステートメントの使用 - 試してみる/最後に - IDisposable - Dispose() - SqlConnection - SqlCommand

usingステートメントに関するMSDNの記事

Try / Catch / MSDNに関するMSDNの記事


4

usingtry / catchとはまったく異なります。 Ausingブロックは、IDisposableつまり、処分されるDispose()と呼ばれています。試してみて、最後に例外を処理してください。 Ausingブロックは次のようになります。

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

これとaの違いusingこれは変数のスコープです。usingそれはブロックの中に作成されます。

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


3

usingステートメントは、IDisposableが使用後に破棄されることを保証します。

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

だから彼らは本当に交換可能ではありません。


2

それは "try"についてではなく、try /についてです最後にそして/または/キャッチ。そしてそれらは全く異なる目的を持っています。

usingは、少し短くてわかりやすい表記です。try{}finally{ Dispose() }そしてそれ故に好まれる。


1

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


0

try-blocksは、予期しない事態(データベースの失敗、接続の失敗など)を含む可能性のあるコードブロックを対象としており、それ以外の目的では使用しないでください。例外をキャッチする準備ができていることは非常にリソースを浪費することであり、try-catch-blocksの使用を制限できるのであれば、より良い方法です。そうは言っても、それらは防御的なプログラミングのための非常に強力なツールであり、例外ログからあなたの問題に関する多くの情報と統計を集めることができるのでパフォーマンスの損失は確かにそれだけの価値があります。

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


  • usingブロックの説明がまったく不正確な場合は-1。 - Joe

リンクされた質問


関連する質問

最近の質問