0Pricing
C# Academy · レッスン

IDisposableとusingステートメント

IDisposableを実装し、確実なクリーンアップにusingステートメントを使い、手動のtry/finallyとの違いを確認します。C# 6のみを対象とします。

「IDisposableとusingステートメント」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。

IDisposable と using の目的

目標: リソースを確実に解放します。

  • IDisposableを実装します
  • using ステートメント(C# 6)を使用します
  • try/finallyと比較します
  • クリーンアップを小さく安全に保ちます

IDisposable の実装

リソース(ファイル、ソケット、ハンドル)を解放するために IDisposable.Dispose を実装します。何度呼び出しても安全なようにします。

using System;

// Simple disposable that tracks whether it was cleaned up
public sealed class FakeConnection : IDisposable
{
  public bool IsOpen { get; private set; }

  public FakeConnection()
  {
    IsOpen = true;
    Console.WriteLine("Open");
  }

  public void Dispose()
  {
    if (IsOpen)
    {
      IsOpen = false;
      Console.WriteLine("Close");
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    FakeConnection c = new FakeConnection();
    c.Dispose(); // manual cleanup
  }
}

try/finally パターン

try/finallyはクリーンアップを保証しますが、冗長で、記述を忘れやすいという欠点があります。using ステートメントはその短縮形です。

using System;

public sealed class FakeConnection : IDisposable
{
  public void Dispose() { Console.WriteLine("Dispose called"); }
  public void Send(string msg) { Console.WriteLine("Send: " + msg); }
}

public class Program
{
  public static void Main(string[] args)
  {
    // Manual try/finally
    FakeConnection a = null;
    try
    {
      a = new FakeConnection();
      a.Send("A");
      throw new Exception("boom");
    }
    finally
    {
      if (a != null) a.Dispose(); // runs even on exception
    }

    // unreachable due to thrown exception in this demo
  }
}

using ステートメントの例

using ステートメントは内部的な try/finally でラップし、ブロックの終了時に Dispose を呼び出します。

using System;

public sealed class FakeConnection : IDisposable
{
  public void Dispose() { Console.WriteLine("Dispose called"); }
  public void Work() { Console.WriteLine("Working"); }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      using (FakeConnection c = new FakeConnection())
      {
        c.Work();
        throw new InvalidOperationException("oops");
      } // Dispose runs here automatically
    }
    catch (Exception)
    {
      Console.WriteLine("Handled");
    }
  }
}

using を使った I/O

ほとんどの I/O 型は IDisposable を実装しています。ハンドルをすぐに閉じるため、using を使用します。

using System;
using System.IO;

public class Program
{
  public static void Main(string[] args)
  {
    // Create a small temp file then read it
    string path = "demo.txt";
    File.WriteAllText(path, "hello");

    using (StreamReader r = new StreamReader(path))
    {
      string text = r.ReadToEnd();
      Console.WriteLine(text);
    } // r.Dispose() closes the file handle
  }
}

using のヒントと注意点

ヒント:

  • 手動で Dispose を呼び出すよりもusingを優先します。
  • Disposeは小さく安全に保ちます(可能であれば例外をスローしません)。
  • 破棄されたオブジェクトを使用しないでください。
  • 複数のリソースを扱う場合は、解放順序を制御するために using ブロックを入れ子にします。

using ステートメントの保証

簡単な確認です。using ステートメントは IDisposable オブジェクトに対して何を保証するでしょうか?

まとめ

まとめ: リソースを扱う型にはIDisposableを実装し、使用箇所をusingブロックで囲むことで、C# 6 では内部的な try/finally によるクリーンアップを保証します。

よくある質問

「IDisposableとusingステートメント」レッスンは無料ですか?

はい。「IDisposableとusingステートメント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。

「IDisposableとusingステートメント」で何を学びますか?

IDisposableを実装し、確実なクリーンアップにusingステートメントを使い、手動のtry/finallyとの違いを確認します。C# 6のみを対象とします。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「IDisposableとusingステートメント」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. try/catch/finally、throw newと再スロー
  2. カスタム例外とエラー設計
  3. IDisposableとusingステートメント
← C# Academyに戻る