C# 6.0では「using static」で特定のクラスを指定することで、そのクラスの静的メソッドなどをクラス名を書かずにそのまま使用できるようになる。
対象:Visual Studio 2015(C# 6.0)以降
静的メソッド(static method)や列挙型(enum)の列挙値などを記述するとき、いちいち型名を書くのが面倒だと思ったことはないだろうか? C# 6.0からは、usingディレクティブを使って簡潔に書けるようになった。本稿ではその使い方を説明する。
コードの冒頭で、「using static」に続けて静的メンバー(静的メソッドや列挙値など)を持っているクラスや列挙型などを記述する。これで、コード本体では静的メンバーだけを記述すれば済むようになる(次のコード)。
using static System.Console; // クラス
// 以下の2つを使うには、Microsoft.VisualBasicへの参照がプロジェクトに必要
using static Microsoft.VisualBasic.Strings; // クラス
using static Microsoft.VisualBasic.VbStrConv; // 列挙型
class Program
{
static void Main(string[] args)
{
// System.Consoleの静的メソッドを使用
Write("Hello, ");
WriteLine("world!");
// ⇒ Hello, world!
// Visual Basicの関数も、まるでC#の機能のように使える
var s = StrConv("ゼンカク→ハンカク", Narrow);
WriteLine(s);
// ⇒ ゼンカク→ハンカク
#if DEBUG
ReadKey();
#endif
}
}
using staticを使った場合でも、IntelliSenseは(クラス名を書かなくても)候補を提示してくれる(次の画像)。
using staticは、型名が衝突するときの解決策としても使える。例えば、次の2つの名前空間の両方にAssertクラスがある*1。そしてどちらのクラスの静的メソッドも使いたいとしよう。
*1 この名前空間はユニバーサルWindowsプラットフォーム用のユニットテストフレームワークなのだが、MSDNにドキュメントがまだ掲載されていない。興味のある方は、筆者のブログ記事「MSTest‐Windows ストア アプリ開発の暗黒大陸」を参考にしてほしい。
従来は、次のコードのようにusingエイリアスディレクティブを使って、片方のクラス名に別名を付けて使っていた。
using System;
using System.Threading.Tasks;
// 前者の名前空間は普通にusing
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
// usingエイリアスディレクティブで、後者のAssertクラスには別名を定義
using AppContainerAssert =
Microsoft.VisualStudio.TestPlatform.UnitTestFramework.AppContainer.Assert;
……省略……
// 別名を付けていない方のAssertクラスの静的メソッドを使う
Assert.AreEqual<string>("5", ((int)5.6).ToString());
// 別名を付けた方のAssertクラスの静的メソッドを使う
await AppContainerAssert.ThrowsException<NotImplementedException>(
() => { throw new NotImplementedException(); }
);
using staticを使うと、コンパイラやIntelliSenseが静的メソッドの所属するクラスを適切に判断してくれる。クラス名が衝突していても、コード本体に長い名前空間やクラス名の別名を書かなくてよいのだ(次のコード)。
using System;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
// 同名のクラス(名前空間は異なる)を2つ、using staticする
using static Microsoft.VisualStudio.TestPlatform.UnitTestFramework.Assert;
using static
Microsoft.VisualStudio.TestPlatform.UnitTestFramework.AppContainer.Assert;
……省略……
// 前者のAssertクラスの静的メソッドを呼び出す
AreEqual<string>("5", ((int)5.6).ToString());
// 後者のAssertクラスの静的メソッドを呼び出す
await ThrowsException<NotImplementedException>(
() => { throw new NotImplementedException(); }
);
using staticを使うと、コード本体では静的メンバーを呼び出すときに型名を省略できる。また、この機能は型名の衝突回避にも応用できる(片方は静的メンバーだけを使う場合)。
利用可能バージョン:Visual Studio 2015(C# 6.0)以降
カテゴリ:C# 処理対象:言語構文
関連TIPS:構文:メソッドやプロパティをラムダ式で簡潔に実装するには?[C# 6.0]
関連TIPS:VB.NET固有の関数をC#で使用するには?
関連TIPS:文字列を全角/半角に変換するには?(VB.NET関数活用)
関連TIPS:文字列をひらがな/カタカナに変換するには?(VB.NET関数活用)
関連TIPS:Visual Studioでコンソール・アプリケーションのデバッグ実行時にコマンド・プロンプトを閉じないようにするには?
関連TIPS:長いジェネリック・クラスの名前を短く記述するには?[2.0のみ、C#、VB]
Copyright© Digital Advantage Corp. All Rights Reserved.