Insider's Eye

C#への期待。アンダースからの返答

デジタルアドバンテージ 一色 政彦
2006/02/15

Page1 Page2 Page3

C#に対する開発者からの要望

■C#でWin32ネイティブ・アプリケーションも作成できるようにしてほしい。

 もちろんC#のコードからWin32ネイティブのコードを生成することは実現可能である。しかしそうはいっても乗り越えなければならない課題がいくつかある。

 例えば.NET Frameworkならガーベジ・コレクタによるメモリ管理がすべてのアプリケーション間で共有されるが、そういう共有がネイティブ・アプリケーションでは難しいことなどが挙げられる。ただそうはいっても、以前からある要望なので、これからも継続的に検討していきたいと考えている。

■C++から移行した多くの開発者が「typedef」(=型の別名を定義するキーワード)を欲しがっているが、C#では組み込まれないのか?

 この要望も以前からあったが、typedefキーワードの問題点としては、型の別名を自由に定義できてしまうので、プログラマーにとって混乱を引き起こしやすいことが挙げられる(型の名前を見ただけでは、本当の型の種類が何か分からない)。

 また.NET Frameworkでは、それぞれの型には1つの名前しか定義できない仕様になっている。従ってtypedefを効果的に使うには、.NET Frameworkレベルでの対応が必要になり、それが全言語へ反映されなければ意味がないだろう。しかしこの規模の対応を行うには、もう現時点では「ときすでに遅し」だ。ただ一応、今後も引き続き検討は続ける予定である。

■C++のfriend指定子に相当する機能を追加してほしい。

 実際のところ、.NET Framework 2.0では「フレンド・アセンブリ」(Friend Assembly)という新機能が搭載されていて、これによってC++のfriend指定子に似た機能を提供している(ただし、この機能を使うことで、確かにアセンブリ内部の型やメンバに、別のアセンブリからアクセスできるようにはなるのだが、private型やprivateメンバにはアクセスできないという問題がある)。

■Mix-in実装(以降、ミックスイン実装)を容易にしてほしい。

Code Complete 第2版 多重継承

 ミックスイン実装は、提供してほしい言語機能の1つとして度々取り上げられる。ミックスイン実装とは、多重継承を使わずに、既存クラスのメソッドなどの実装を、別のクラスに対して動的に追加する仕組みのことである。

 もし仮に、C#でこの機能を提供するとなると、恐らく「ジェネリック型システム」(Generic Type System)の拡張という形になるだろう。例えば、印刷可能にする機能(=Printable機能)を任意のクラスにミックスイン(=動的に追加)できるようにしたい場合には、次のようなコードが考えられる(なおこのコードは、現在のC#ではサポートされていないことに注意すること)。

class Printable<T> : T
{
  public virtual void Print() { ……中略…… }
}
アンダース氏が考えたミックスイン実装の例
これにより、Printable<T>クラスの印刷機能であるPrintメソッドを、ジェネリック型のTクラス(=つまり任意のクラス)に対してミックスイン(=動的に追加)できる。なおPrintable<T>クラスの基底クラスとして記されているジェネリック型の「T」は、当然ながら現在サポートされていない機能である。

 このようにジェネリック型のクラス(コード例では「T」)を基底クラスに指定できるようにすることで、ミックスイン実装が可能になる。この例において、印刷可能なフォーム・クラスを作成したいのであれば、「Printable<Form>」というミックスイン・クラスを宣言するか、あるいはこのミックスイン・クラスからの派生クラスとして「class MyForm : Printable<Form>」のようなクラスを宣言するだけで、通常のフォーム・クラスに対して印刷機能を追加できるわけである。

 だが、このミックスイン実装の言語設計・実装にかかるコストとそのほかの取り入れるべき機能をてんびんにかけると、最終的には「ミックスイン実装に対応しない」という結論になるだろう。

■COM(Component Object Model)のIDispatchインターフェイスに対する遅延バインディング(Late Binding)を提供してほしい。

 VB(Visual Basic)では遅延バインディングをサポートしているが、C#にもそれを搭載することが良いのか悪いのかという判断は難しいところだ。

 というのも、遅延バインディングは使い方をちゃんと理解して使っている分にはとても役に立つ機能なのだが、使い方を間違えるとパフォーマンスを低下させる原因になりかねないからである。例えばVBプログラマーが、遅延バインディングが有効になっていると知らずに、Object型を使って遅延バインディングを行ってしまい、予想外に処理に時間がかかってしまうようなケースはよくある。

 いまのところ、遅延バインディング機能を追加するような計画はない。だがIDispatchインターフェイスしか備えていないようなレガシー・コンポーネントの場合や、複数バージョンのMicrosoft Officeをオートメーションしようとする場合などでどうしても遅延バインディングが必要となるということは、確かに検討に値する課題だ。これについては、頭に置いて検討することをお約束する。


 INDEX
  Insider's Eye
  C#への期待。アンダースからの返答
    1. アンダース氏が明かすC#言語設計の秘話
  2. C#に対する開発者からの要望
    3. C#自体やその将来に対する疑問、他言語に対する意見
 
 Insider's Eye


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間