PowerShell から .NET クラスを呼び出して操作するときの最大の苦行。それが、クラスの名前空間を毎回毎回書かないといけないことです。
たとえば、List(T) を扱うとこうなります。無駄に使ってみましょう。
ジェネリクスの扱いつらぽよ。
Item : 0 Item : 1 Item : 2 Item : 3 Item : 4 Item : 5 Item : 6 Item : 7 Item : 8 Item : 9
C# なら using <NameSpace>
が用意されているのでいいのですが、PowerShell では名前空間を省略する方法がなくつらかったわけです。
これが PowerShell 5.0 で変わります。
目次
言語仕様上の using シンタックス
実は言語仕様上の予約語には using がずっとあったのです。
言語仕様でも
予約語ヘルプにもあります。
将来のためってことで。
The keywords class, define, from, using, and var are reserved for future use.
そもそも言語仕様が 3.0 までしか公開されてないのがもにょん
蛇足
ちなみに、過去にはPoweShell Team ブログでこんな感じで IDisposable 用の using による try{}finally{}
が紹介されたことも
https://blogs.msdn.com/b/powershell/archive/2009/03/12/reserving-keywords.aspx
まぁこれ、v2はともかく v5.0 では使えないんですけどね!
PoweShell 5.0 で搭載される using シンタックス
using ときくと、C# では 名前空間の宣言やリソース破棄がパッと思い浮かびます。PowerShell でも何の機能を持たせるかいくつか議論があったのですが、搭載されたのは名前空間の宣言です。
とはいえ、about_Language_Keywords
にはないずさんさです。
さらに、WMF 5.0 のリリースノートにもないというアンドキュメント感たっぷり。
https://www.microsoft.com/en-us/download/details.aspx?id=46889
どんな感じで使うのか
スクリプトの上部で以下を宣言してあげれば、以降は宣言されたクラスの名前空間が省略可能になります。
using namespace <名前空間>;
例えば List
New-Object "System.Collections.Generic.List[int]"; New-Object "System.Collections.Generic.Dictionary[[string], [string]]";
一度名前空間を宣言しておけば、List[int]
で済むのは幸せでしょう。
using namespace System.Collections.Generic; New-Object List[int]; New-Object Dictionary[[string], [string]];
あ、PowerShell 4.0 まではこういう紹介ありますけど、私はあまり好きじゃないです。どうしても必要と感じた時以外は使いません。
using namespace のサンプル
クラス構文とファンクション構文それぞれで利用できますが、クラス構文の返戻値の型宣言には使えないので気を付けてください。
それぞれこんな感じで帰ってきます。
クラス構文
Adding list 0. Elapsed time 7.3973ms Adding list 1. Elapsed time 14.068ms Adding list 2. Elapsed time 14.5463ms Adding list 3. Elapsed time 14.9423ms Adding list 4. Elapsed time 15.5296ms Adding list 5. Elapsed time 15.8406ms Adding list 6. Elapsed time 16.1545ms Adding list 7. Elapsed time 16.4804ms Adding list 8. Elapsed time 16.8308ms Adding list 9. Elapsed time 17.1498ms Final elapsed time 19.3839ms 0 1 2 3 4 5 6 7 8 9
ファンクション構文
Adding list 0. Elapsed time 10.4587ms Adding list 1. Elapsed time 37.9896ms Adding list 2. Elapsed time 79.5513ms Adding list 3. Elapsed time 94.0689ms Adding list 4. Elapsed time 96.9513ms Adding list 5. Elapsed time 97.2735ms Adding list 6. Elapsed time 97.6232ms Adding list 7. Elapsed time 97.9385ms Adding list 8. Elapsed time 98.3093ms Adding list 9. Elapsed time 98.6885ms Final elapsed time 99.0148ms 0 1 2 3 4 5 6 7 8 9
クラス構文早い (そこ
まとめ
アンドキュメントとはいえ、Windows 10 で搭載された以上は消えることはないでしょうから使っちゃいましょうかね。
PowerShell 5.0 からはジェネリクスの宣言はつらくなくなりそうでよかったです。