usingステートメント (using ブロック)の利用 - C#

C#のusing ステートメントの利用について紹介します。

概要

usingステートメントを利用すると、usingステートメントのブロックを抜けるとDisposeメソッドが自動的に実行される動作となります。Disposeメソッドの実装には、IDisposable インターフェイスが実装されている必要があります。

書式

using([オブジェクトの宣言、オブジェクトのインスタンス化のコード])
{
...(処理)
}

プログラム例:ファイルI/O の例

UI

下図のフォームを準備します。Buttonコントロールと複数行のTextBoxを配置します。

コード

下記のコードを記述します。[button1]のClickイベントを実装します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace SimpleUsingBlock
{
  public partial class FormFileStream : Form
  {
    public FormFileStream()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      using (StreamWriter sw = new StreamWriter("test.txt", false, Encoding.GetEncoding("Shift-JIS"))) {
        sw.Write("テストの書き込み");
        textBox1.Text += "ファイルに書き込みました。\r\n";
      }
    }
  }
}

解説

StreamWiterを利用してファイルへの書き込みをするコードです。通常の処理では、StreamWiterの利用が終わるとClose()メソッドを呼び出しStreamWiter を閉じます。
今回のコードはStreamWiterのインスタンス化のコードをusing直後の()内に記述することで、その後の{ ... } ブロックから抜けた際に、StreamWriterのDispose()メソッドが自動的に呼ばれる動作となります。そのため、Close() メソッドを呼び出す記述が不要になります。
  private void button1_Click(object sender, EventArgs e)
  {
    using (StreamWriter sw = new StreamWriter("test.txt", false, Encoding.GetEncoding("Shift-JIS"))) {
      sw.Write("テストの書き込み");
      textBox1.Text += "ファイルに書き込みました。\r\n";
    }
  }
上記のusing 部分のコードは下記のコードと同様の動作に置き換えられます。
private void button1_Click(object sender, EventArgs e)
{
  {
    StreamWriter sw = new StreamWriter("test.txt", false, Encoding.GetEncoding("Shift-JIS"));
    try
    {
      sw.Write("テストの書き込み");
    }
    finally
    {
      if (sw != null) ((IDisposable)sw).Dispose();
    }
  }
}

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。テキストボックスに「ファイルに書き込みました。」のメッセージが表示されます。


実行ファイルのディレクトリを確認します。"test.txt"ファイルが作成されていることが確認できます。


"test.txt"ファイルを開きます。ファイルに文字列が書き込まれていることも確認できます。


ファイルにテキストを追記して[上書き保存]します。プログラム側でファイルハンドルが解放されているため、ファイルが使用中の状態にはなっておらず上書き保存もできることが確認できます。usingブロックを抜けたタイミングでStreamWriterが閉じられていることがわかります。



著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2018-05-12
作成日: 2018-04-27
iPentec all rights reserverd.