++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

extern alias

leave a comment »

最近暇を見ては、++C++; の各所に、C# 6.0 の話を追記して回っているわけですが。今日は using static のあたりの話を。

そのついでというか、名前空間のページを見返していて、ふと、外部エイリアスのあたりにも追記。

「こんな機能もあったなぁ」というか、「ないと確かに困ることが原理的にはあり得る」的な、普段あんまり日の目を見ない機能です。

が、最近仕事で使った。追記した例にあるような、バックポート品と正規品の混在のせいなんですけども。

というのも、以下のようなライブラリを作っていまして。

  • IteratorTasks: イテレーター(yield return)ベースで、.NET 4 以降の Task クラス(System.Threading.Tasks 名前空間)もどきの機能を提供するライブラリ

要は Unity 用。Unity は非同期処理をイテレーターベースでやるわけですが、非同期処理の戻り値とりたいとか、ContinueWith とか WhenAll, WhenAny したいとか、結局、Task が持っている機能はほぼほしくなるので、じゃあ、標準の Task とシグネチャ(クラス名、メソッド名、引数)合わせようと。あと、非同期処理のためだけに MonoBehaviour に依存するとかちょっと。Unity のクラス設計まずすぎて。

こういう、「最新環境が使えないからしょうがなく、最新の機能の劣化コピーをバックポート」みたいなものは早く滅びたいんですけどもね。最新環境が使えるようになることで、「役割は終えた」とか言って引退したい… というような恨み節を、すでにかれこれ3年くらいは言い続け、その間結構アップデートも掛けてしまっているわけです。ほんと、無駄な作業だ…

で、Taskクラス自体は、awaitではなくてyield returnを使っている時点で完全互換とは行かないので、名前空間を変えています(System.Threading.Tasks じゃなくて IteratorTasks)。が、いくつか、互換性がある(DLL 参照を切り替えるだけで本家とIteratorTasks版を切り替えれる)ものについては、名前空間まで一緒だったり。

そして、テスト コードの類では、普通に .NET 4.5 環境から、その IteratorTasks 依存なコードを呼び出しています。結果、いくつかのクラスで、別クラスなのに名前空間もクラス名もメソッド名も引数も完全に一致した状態。そして、その呼び分けのために使ったのが、外部エイリアス(extern alias)機能。「ああ、extern aliasってこう使うものなんだ」とか思ったので、ついでだから足してみました。

Written by ufcpp

2015年1月18日 @ 20:45

カテゴリー: 未分類

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。