C#でプログラムを始めてみる連載の15回目です。前回の記事はコチラです。
System.IOとは?
さて、かなり完成に近づいてきました。今回は、前回の最後で出てきたSystem.IOについて説明していきたいと思います。
まず最初にSystemについて説明します。オブジェクト指向プログラミング言語であるC#は、あらかじめめたくさんのクラスが用意されています。それらのクラスをまとめている大元がSystemです。この様にクラスを管理する為の仕組みを名前空間と呼びます。名前空間はドットで繋げて細分化かることで、クラスをグループ分けできます。
System.IOは、Systemの名前空間のさらに下の名前空間IOを指します。ここには、ファイルやデータのやり取りをサポートするクラスがまとめられています。クラスを使用する際にもドットで繋げてクラス名を指定します。前回は以下で、フルパスのファイル名からパスのないファイル名だけをとり出しました。
System.IO.Path.GetFileName(フルパスのファイル名);
これは、System.IO名前空間の下にあるPathクラスのGetFileNameメソッドを使用しています。この様に名前空間を使ってクラスを管理することで、たくさんあるクラスの中で同じ名前のものがあっても問題なく使うことができます。ファイルアクセスの時に使用したStreamReaderクラスとStreamWriterクラスも、同じSystem.IO名前空間の下にあります。
名前空間の省略
ところで、以前にもクラスを使用してきましたが名前空間を使用した記述にはなっていません。たとえばメッセージボックスを使うにはMessageBoxクラスを使用して以下の様に書きました。
MessageBox.Show(メッセージ,タイトル,ボタン表示の指定);
ここには名前空間の記述がありません。実は、名前空間の記述を省略する方法があるのです。今までコードを書いてきたForm1.csのコード編集画面に移って一番上にスクロールしてみましょう。以下の記述があると思います。
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 名前空間;
これをusingディレクティブと呼びます。
『クラスの中で同じ名前のものがある場合』と前述しましたが、実際の所そのようなケースはまれです。すべてのクラスを名前空間から記述していては、表記が長くなって読みにくいコードになってしまいます。実際にはMessageBoxクラスはSystem.Windows.Forms名前空間の下で管理されています。一番最後に記述してありますね。OpenFileDialog(SaveFileDialog)クラスも同じ名前空間の下で管理されています。
この部分の一番下に以下の様にSystem.IO名前空間も追加して、コードをシンプルにしてみましょう。
using System.IO;
OpenFileとSaveFileのコードは、それぞれ以下の様になりました。ちょっとだけシンプルになりました。
private void OpenFile(String openName = "") { if (openName == "") { OpenFileDialog ofd = new OpenFileDialog();//System.IOを省略 ofd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; if (ofd.ShowDialog() != DialogResult.OK) { return; } openName = ofd.FileName; } StreamReader sr = new StreamReader(openName); this.txtMain.Text = sr.ReadToEnd(); sr.Close(); fileName = openName; this.Text = "TextEditor " + Path.GetFileName(fileName);//System.IOを省略 fileChange = false; } private void SaveFile(String saveName = "") { if (saveName == "") { SaveFileDialog sfd = new SaveFileDialog();//System.IOを省略 sfd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; if (sfd.ShowDialog() != DialogResult.OK) { return; } saveName = sfd.FileName; } StreamWriter wr = new StreamWriter(saveName); wr.Write(this.txtMain.Text); wr.Close(); fileName = saveName; this.Text = "TextEditor " + Path.GetFileName(fileName);//System.IOを省略 fileChange = false; }