ホームに戻る
出典 :
関連 :
目次 :
C#における using の類型
using ディレクティブ
異なる名前空間に定義されているクラスを使用する際、ファイルの冒頭に using ディレクティブを記述することで、
ファイル中で当該名前空間の記述を省略できる。C++と同様。
// using ディレクティブ
using System.Collections.Generic;
namespace Test
{
class TestProgram
{
static void Main(string[] args)
{
// using ディレクティブにより記述を省略できる
// System.Collections.Generic.List ⇒ List
List<int> index;
:
}
}
}
上記のコードにおいて、List<T> は System.Collections.Generic 名前空間に定義されている。
このため、正確には System.Collections.Generic.List だが、using ディレクティブを用いているため単に List と記述できる。
using エイリアスディレクティブ
型に別名を付与することができる。C++と同様。
// using エイリアスディレクティブ
using Ints = System.Collections.Generic.List<int>;
namespace Test
{
class TestProgram
{
static void Main(string[] args)
{
// 付与した別名で変数を宣言
// ⇒ System.Collections.Generic.List<int> index と等価
Ints index;
}
}
}
上記のコードでは System.Collections.Generic.List<T> に Ints という別名を付与している。
using 静的ディレクティブ
C#6.0以降で使用可能。
通常の using ディレクティブでは省略できない静的メソッドや列挙型の列挙値は、
using static ディレクティブを用いることで省略可能となる。
using System;
// 以下、using 静的ディレクティブ
using static System.Enum;
using static Colors;
enum Colors
{
Red,
Yellow,
Blue,
White,
Black,
}
namespace Test
{
class TestProgram
{
static void Main(string[] args)
{
// using 静的ディレクティブにより、Enum を省略できる
foreach (int color in GetValues(typeof(Colors)))
{
Console.WriteLine(color);
}
// using 静的ディレクティブにより、Colors を省略できる
var myFavoriteColor = Blue;
}
}
}
using ステートメント
ファイルストリームなどのアンマネージドリソースを用いる場合、以下の手順が必要となる。
- リソースの使用権を獲得 (例 : ファイルを開く)
- リソースを操作
- リソースの使用権を破棄 (例 : ファイルを閉じる)
明示的に使用権の破棄を行わないと使用権を握ったままとなり、他からのアクセスができないなどの不都合が生じる。
しかし、using ステートメントを用いると、using 節を抜ける際に自動的にリソースの破棄( Dispose() )が行われる。
使用できるのは IDisposable インタフェースを実装するクラスに限定される。
(そうでないクラスはそもそも Dispose() が不要で、実装されていない。)
C++等におけるRAIIと同様、例外安全なコードとなる。
(例外発生時にも確実にリソースを解放できる。)
namespace Test
{
class TestProgram
{
static void Main(string[] args)
{
// using ステートメントにより、ストリームの寿命を設定
// ⇒ スコープを抜ける際にストリームが破棄される
using (FileStream fs = new FileStream("hoge.txt", FileMode.Open, FileAccess.Read, FileShare.None))
{ //< fs の寿命ここから
Console.WriteLine(fs.Length);
} //< fs の寿命ここまで
}
}
}
C#8.0からは変数宣言時に using をつけることでさらに簡略化できる。
(マネージドリソースと同様に扱うことができる。)
namespace Test
{
class TestProgram
{
static void Main(string[] args)
{
// using が付与されているため、スコープを抜ける際にストリームが破棄される
using FileStream fs = new FileStream("hoge.txt", FileMode.Open, FileAccess.Read, FileShare.None);
Console.WriteLine(fs.Length);
} //< fs の寿命ここまで
}
}