C Sharp
出典: フリー百科事典『ウィキペディア(Wikipedia)』
パラダイム: | オブジェクト指向プログラミング |
---|---|
登場時期: | 2001年 |
開発者: | マイクロソフト |
最新リリース: | C# 2.0 |
型付け: | 強い静的型付け |
主な処理系: | Visual C#、Mono他 |
方言: | 1.0, 1.5, 2.0 (ECMA) |
影響を受けた言語: | Delphi、C++、Java、Eiffel |
影響を与えた言語: | Nemerle、D言語、Java |
プラットフォーム: | Microsoft Windows他 |
C#(シーシャープ)はマイクロソフト社によって同社の.NET戦略の一環として開発されたオブジェクト指向プログラミング言語である。C#の開発にはボーランド社のDelphiを開発したアンダース・ヘルスバーグが参加している。
C#は共通言語基盤(共通言語ランタイムなど)が解釈する共通中間言語にコンパイルされて実行される。言語仕様はJITコンパイルを前提として設計されている。C#の構文はC++とも似ているが、それ以上にサン・マイクロシステムズ社によるJavaと良く似た構文や実行機構を持っている。またプロパティやデリゲートなどのObject Pascal由来とおぼしき言語機能も備えている。
C#は、boxing/unboxing、デリゲート、プロパティ、インデクサ、コメントでの属性情報付加、unsafe宣言した箇所でのポインタ演算操作、構造体(値型オブジェクト、struct)、多次元配列、可変長引数、などの機能を持つ。また、Javaと同様に大規模ライブラリ、プロセッサ・アーキテクチャに依存しない実行形態、ガベージコレクション、JITコンパイルによる実行の高速化、などが実現されている。
C#は.NET構想における中心的な開発言語であり、XML WebサービスやASP.NETの記述に使用される(他の.NET系の言語でも記述可能であるが、おそらく生産性・機能においてC#がもっとも優れている)。C#は統合開発環境であるMicrosoft Visual C#によってサポートされている。
C#では、共通言語ランタイム(CLR)を通じて、他のCLR上の言語Visual Basic .NETやVisual C++ (C++/CLI)などを相互に連携することができる。また、他言語で記述されたクラスを継承することも、またその逆も可能である。
2005年3月22日には、日本工業規格 JIS X 3015 プログラミング言語C# として、標準化された。
目次 |
[編集] 言語仕様
C#は、さまざまな意味において、基盤であるCLIの機能をもっとも反映している言語であるといえる。C#にある組み込み型のほとんどは、CLIフレームワークに実装されている値型と対応している。しかし、C#の言語仕様はコンパイラのコード生成については何も言及していない。つまり、CLRに対応しなければならないとか、共通中間言語(CIL)などの特定のフォーマットのコードを生成しなければならないとかいうことは述べられていない。そのため、理論的にはC++やFORTRANのように環境依存のマシン語を生成することも可能である。しかし、現在存在するすべてのC#コンパイラはCLIをターゲットにしている。
C#は、CやC++と比較してさまざまな制限や改良が加えられている。すべてではないがその例を次に挙げる。
- グローバル変数やグローバルメソッドは存在しない。すべてのメソッドとメンバはクラスの一部として宣言されなければならない。
- 外のブロックで宣言した変数名を、内のブロックで再宣言してはいけない。これはC++ではしばしば混乱や曖昧のもととされているが、C#では禁止されている。
- (Cの
printf()
関数のように)関数をグローバルで公開する代わりに、すべての関数はクラス内で宣言されなければならない。ほとんどの場合、クラスは名前の衝突を避けるために名前空間に所属する。 - 名前空間は階層構造をもつ。つまり、名前空間は他の名前空間の中に宣言することができる。
- 原始型を含めたすべての型は、
object
クラスの派生クラスである。つまりobject
クラスのもつすべてのプロパティやメソッドを継承する。例えば、すべての型はToString()
メソッドをもつ。 - C#にはブール型
bool
が存在する。while
やif
のように条件をとるステートメントには、bool
型の式を与えなければならない。CやC++にもブール型が存在するが、これは整数型と相互に変換可能であった。つまり、CやC++ではwhile
文やif
文に与える式が整数やポインタであってもよかった。C#ではミスを防止するために、このブール型と整数が可換であるという仕様を禁止している。 - ポインタをサポートする。ポインタは
unsafe
スコープ内のみで使用することができ、適切な権限をもつプログラムのみがunsafe
とマークされたコードを実行することができる。オブジェクトへのアクセスの大部分は管理された安全な参照によってなされ、大部分の算術演算はオーバフローのチェックがなされる。unsafe
ポインタは値型や文字列を指すことができる。セーフコードでは、(必ずしもそうする必要はないものの)System.IntPtr
型を通してポインタをやりとりすることができる。 - マネージドなメモリは明示的に解放することはできないが、参照されなくなったメモリはガベージコレクタによって自動的に解放される。ガベージコレクタは、メモリの解放忘れによって起こるメモリリークを解消する。C#は、データベース接続のようなアンマネージドなリソースに対しても明示的に制御する方法を提供している。これは
IDisposable
インタフェースとusing
ステートメントによってなされる。 - クラスは複数のインタフェースを実装することができるが、多重継承はサポートされない。
- C#はC++に比べてタイプセーフである。既定の暗黙変換は、整数の範囲を広げる変換であったり、派生クラスから基底クラスへの変換であったりといった、安全な変換のみに限定される。これは、コンパイル時、JITコンパイル時、そして一部の動的なケースでは実行時に強制される。ブール型と整数型、列挙型と整数型、の間は暗黙変換はできない。暗黙変換をユーザ定義する際は、明示的にそのように指定しなければならない。これはC++のコピーコンストラクタとは違った仕様である。
- 列挙型のメンバは、列挙型の名前空間の中におかれる。
- プロパティと呼ばれるアクセサは、C++におけるメンバフィールドのような構文でオブジェクトにアクセスすることができる。C++では、
public
としてメンバを宣言することでメンバを読むことも変更することもできるようになるが、C#ではプロパティによってメンバアクセスやデータの正当性チェックを制御することができる。 - リフレクションが完全サポートされる。
[編集] C# 2.0からの仕様
- クラスの宣言に
partial
属性をつけることで、一つのクラスを複数のファイルにまたがって書くことができる。これによって、巨大なクラスを分割したり、自動生成されたコードを分離したりすることができる。partial
属性はすべてのファイルのクラス宣言につける必要がある。
- ジェネリック型(パラメタ付型)が導入された。これは.NET 2.0の機能である。.NETのジェネリック型はC++のテンプレートとは異なり、コンパイルによってではなく実行時に特殊化される。これによって異なる言語間の運用を可能にしている。また、インタフェースによって型パラメタに制約を与えることができる。一方、C++のように型パラメタとして式を指定することはできない。
- 静的クラスが導入された。
static
属性をクラスの宣言につけることで、クラスはインスタンス化できなくなり、静的なメンバしか持つことができなくなる。
- プロパティの
get
/set
アクセサのアクセス制御が別個にできるようになった。次の例では、get
アクセサをpublic
と宣言することによって外部から利用可能にしている一方で、set
アクセサをinternal
と宣言することで、同一アセンブリ内からのみ値の設定ができるようにしている。
string status = string.Empty; public string Status { get { return status; } internal set { status = value; } }
Nullable
型を使用することで、値型にnull
を代入できるようになった(例:int? i = null;
なお、int?
はNullable<int>
の糖衣構文である)。null
が代入されたNullable
型は実際にはnull
参照ではなく、値型である。従って、これをボックス化するとnull
ではない参照が得られる。
- null結合演算子 (
??
) が導入された。null
でない最初の値を返す。
object obj1 = null; object obj2 = new object(); object obj3 = new object(); return obj1 ?? obj2 ?? obj3; // returns obj2
この演算子は主にNullable
型を非Nullable
型に代入する時に使われる。
int? i = null; int j = i ?? -1; // nullをint型に代入することはできない
[編集] 実装
C#の言語仕様は標準化団体Ecma Internationalを通じて公開・標準化されており、第三者がマイクロソフトとは無関係に実装することができる。 現段階で、C#の実装は次の4つが知られている。
- デファクトスタンダードである、マイクロソフトによるVisual C# コンパイラ。
- マイクロソフトによるShared Source Common Language Infrastructure。共通言語基盤(CLI)とC#コンパイラがソースコードで公開されている。
- Mono ProjectによるMono内の Mono Compiler Suite (mcs)。
- DotGNU ProjectによるPortable.NET内の the C-Sharp code compiler (cscc)。
[編集] 名称
- 規格によると、C#は「C Sharp」と発音し、「C#」(LATIN CAPITAL LETTER C (U+0043) の後に NUMBER SIGN # (U+0023))と書く。音楽のシャープ(♯,MUSIC SHARP SIGN (U+266F))ではなくナンバーサイン(#)を採用したのは、フォントやブラウザなどの技術的な制約に加え、標準的キーボードには前者の記号が存在しないためである。
- "#"接尾辞は、既存言語から派生した多くの.NET言語にも使用されている。これには、J#(Javaのマイクロソフトによる実装)、A#(Adaから)、F#(おそらくMLファミリに使われた型システムのSystem Fから)が含まれる。この接尾辞はGtk#(GTK+などのGNOMEライブラリの.NETラッパ)、Cocoa#(Cocoaのラッパ)などのライブラリにも使用されている。
- C#という名称の解釈として、「(A~Gで表された)直前の音を半音上げる」という音楽記号の役割に着目し、「C言語を改良したもの」を意味したのではないか、というものがある。これは、C++の名称が「C言語を1つ進めたもの」という意味でつけられたことにも似ている。
- アンダース・ヘルスバーグは、「C#」が「C++++」(すなわち「C++をさらに進めたもの」)にみえるのが由来である、と語っている。
[編集] 関連項目
[編集] 外部リンク
- C# 言語仕様 (MSDN)
- C# 3.0 言語仕様(Microsoft Word形式)
- ECMA-334 C# Language Specification(pdf)
- JISC(規格番号X3015でプログラム言語C#の規格を閲覧できる)
- Microsoft Visual C#
- MCS: The Ximian C# compiler
- Portable.NET
- Microsoft Shared Source Common Language Infrastructure 2.0 Release
カテゴリ: プログラミング言語 | オブジェクト指向言語 | .NET Framework | 並行計算