16

オブジェクトがusingステートメントとうまく合うようなチートシートがあるのではないかと思っていました... SQLConnectionMemoryStreamなど。

connection.Close()さらに一歩進んで、ステートメントブラケットを使用して、閉じる前に実際にどのように呼び出す必要があるかなど、他の「パズルのピース」を表示することもできます。

そのようなものは存在しますか?そうでなければ、多分私達はそれを作るべきです。

4

9 に答える 9

15

おそらく、これに関する私の投稿http://www.lancemay.com/2010/01/idisposable-cheat-sheet/を見てください。それがあなたが探しているものかどうかはわかりませんが、元の質問に基づいて、そうかもしれません.

于 2010-04-29T12:54:16.173 に答える
10

Microsoft FxCop には、using ブロックで IDisposbale を使用することをチェックするルールがあります。

于 2009-06-23T15:54:24.733 に答える
7

次の C# メソッドは、特定のアセンブリで見つかったすべての IDisposable 型を一覧表示します。(使用される名前空間: System、System.Collections.Generic、System.IO、System.Reflection)

  static void PrintDisposableTypesFromFile(String path)
  {
     Assembly assembly = Assembly.LoadFrom(path);
     foreach (Type type in assembly.GetTypes())
        if (type.GetInterface("IDisposable") != null)
           Console.WriteLine(type.FullName);
  }

次の C# メソッドは、前のメソッドを利用して、ディレクトリとそのサブディレクトリ内のすべてのアセンブリに対して同じことを行います (例: "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727")。

  static void PrintDisposableTypesFromDirectory(DirectoryInfo dir, bool warn)
  {
     foreach (FileInfo file in dir.GetFiles("*.dll"))
     {
        try
        {
           PrintDisposableTypesFromFile(file.FullName);
        }
        catch (Exception ex)
        {
           if (warn)
           {
              Console.Error.WriteLine(
                 String.Format(
                    "WARNING: Skipped {0}: {1}",
                    new object[] { file.FullName, ex.Message }));
           }
        }
     }
     // recurse
     foreach (DirectoryInfo subdir in dir.GetDirectories())
        PrintDisposableTypesFromDirectory(subdir, warn);

  }

すべての使い捨てのリストが非常に役立つかどうかはわかりませんが、同様のコードを使用して、.NET フレームワークでサポートされているテキスト エンコーディングの完全なリストなど、他の興味深いものを見つけました。

于 2009-06-24T10:56:30.273 に答える
4

クラスが実装されているかどうか不明な場合は、ブロックIDisposableで囲みます。usingコンパイルエラーが発生した場合は、それを削除してください。入力時間は数秒しか失われません。

于 2009-06-23T15:44:07.407 に答える
3

Visual Studio を使用している場合は、型宣言で F12 キーを押すと、メタデータ画面またはクラス定義 (ソース コードがある場合) に移動します。キーバインドが異なる場合は、右クリックして「定義に移動」してください。そこから、クラスが実装するものを見ることができます。すべてのクラスについて、最初に遭遇したときにこれを実行して、そのクラスで何ができるかを「感じる」ことをお勧めします。

于 2009-07-09T22:50:41.500 に答える
3

他の回答に加えて、クラスは IDisposable を実装している可能性がありますが、Intellisense リストに Dispose が表示されないことに注意してください。

class MyClass :IDisposable
{
    void IDisposable.Dispose()
    {
        /* Stuff */
    }
}
于 2009-07-09T22:32:53.783 に答える
2

IDisposable を実装する型のリストを取得する簡単な方法は、Reflector をクラックして開き、 に移動しSystem.IDisposableてノードを展開し、[派生型] ノードを展開することです。

リストが完全であることを確認するには、使用しているすべてのアセンブリが Reflector で「開かれている」ことを確認してください。

于 2009-06-23T16:05:39.120 に答える
1

ReSharperを使用すると、すべての派生型を表示できます。たぶん、ReSharperなしでオブジェクトブラウザを使ってそれを行うこともできます。インターフェイス定義に移動し、「showinheritors」を探します。

于 2009-06-23T15:38:09.557 に答える
0

型が IDisposable を実装しているかどうかを確認する手っ取り早い方法は、そのインスタンスを作成し、そのインスタンスに Dispose() メンバー関数があるかどうかを確認することです。そうであれば、IDisposable が実装されていることを 99% 確信できます。

于 2009-06-24T11:12:33.407 に答える