検索この項目では、プログラミング言語について説明しています。音名のC♯については「嬰ハ」をご覧ください。本来の表記は「C#」です。この記事に付けられた題名は、技術的な制限により、記事名の制約から不正確なものとなっています。■テンプレートC#(シーシャープ)とは、マイクロソフトが開発したマルチパラダイムプログラミング言語。き型、関数型、ジェネリック、オブジェクト指向の要素を持つ。(JIS)[3]によって採択された。PascalやDelphiを開発したアンダース・ヘルスバーグを筆頭に多数のDelphi開発陣が参加している。C#は共通言語基盤(共通言語ランタイムなど)が解釈する共通中間言語にコンパイルされて実行される。Builderの独自拡張構文に極めて近い内容となっている。プロパティやデリゲートなどDelphiの構文そのまま、もしくは名称変更しただけの機能となっているものが多い。Frameworkによるものである)。WebサービスやASP.NETの記述にも使用される。他の.NET系の言語でも記述可能だが、生産性・機能においてC#が最も優れるとされる。C#がC#に対応している。(C++/CLI)など)と相互に連携することができる。他言語で記述されたクラスを継承することも、またその逆も可能である。言語仕様[編集]さまざまな意味において、基盤であるCLIの機能をもっとも反映している言語であるといえる。C#にある組み込み型のほとんどは、CLIフレームワークに実装されている値型と対応している。C#の言語仕様はコンパイラのコード生成については何も言及していない。特定のフォーマットのコードを生成しなければならないとかいうことは述べられていない。そのため、理論的にはC++やFORTRANのように環境依存のマシン語を生成することも可能である。現在存在するすべてのC#コンパイラはCLIをターゲットにしている。CやC++からの改良点[編集]C#では、CやC++と比較してさまざまな制限や改良が加えられている。グローバル変数やグローバルメソッドは存在しない。すべてのメソッドとメンバはクラスの一部として宣言されなければならない。外のブロックで宣言した変数名を、内のブロックで再宣言してはいけない。これはC++ではしばしば混乱や曖昧のもととされているが、C#では禁止されている。Cのprintf()関数のように関数をグローバルで公開するのではなく、すべての関数はクラス内で宣言されなければならない。ほとんどの場合クラスは名前の衝突を避けるために名前空間に所属する。名前空間は階層構造をもつ。名前空間は他の名前空間の中に宣言することができる。原始型を含めたすべての型は、objectクラスの派生クラスである。objectクラスのもつすべてのプロパティやメソッドを継承する。すべての型はToString()メソッドをもつ。C#にはブール型boolが存在する。whileやifのように条件をとるステートメントには、bool型の式を与えなければならない。CやC++にもブール型が存在するが、これは整数型と相互に変換可能で、while文やif文に与える式として整数やポインタも許容していた。C#ではミスを防止するために、このブール型と整数が可換であるという仕様を禁止している。ポインタをサポートする。ポインタはunsafeスコープ内のみで使用することができ、適切な権限をもつプログラムのみがunsafeとマークされたコードを実行することができる。オブジェクトへのアクセスの大部分は管理された安全な参照によってなされ、大部分の算術演算はオーバフローのチェックがなされる。unsafeポインタは値型や文字列を指すことができる。セーフコードでは、必ずしもそうする必要はないものの、IntPtr型を通してポインタをやりとりすることができる。マネージドなメモリを明示的に解放する方法は存在せず、参照されなくなったメモリはガベージコレクタによって自動的に解放される。ガベージコレクタは、メモリの解放忘れによって起こるメモリリークを解消する。C#は、データベース接続のようなアンマネージドなリソースに対しても明示的に制御する方法を提供している。これはIDisposableインタフェースとusingステートメントによってなされる。クラスは複数のインタフェースを実装することができるが、多重継承はサポートされない。C#はC++に比べて型安全である。既定の暗黙変換は、整数の範囲を広げる変換や、派生クラスから基底クラスへの変換といった、安全な変換のみに限定される。これは、コンパイル時、JITコンパイル時、そして一部の動的なケースでは実行時に強制される。ブール型と整数型、列挙型と整数型、の間は暗黙変換はできない。暗黙変換をユーザ定義する際は、明示的にそのように指定しなければならない。これはC++のコンストラクタとは違った仕様である。列挙型のメンバは、列挙型の名前空間の中におかれる。列挙型の定数名を取得することができる。列挙型の定数名から動的に定数値を得ることができる。プロパティと呼ばれるアクセサは、C++におけるメンバフィールドのような構文でオブジェクトにアクセスすることができる。C++では、publicとしてメンバを宣言することでメンバを読むことも変更することもできるようになるが、C#ではプロパティによってメンバアクセスやデータの正当性チェックを制御することができる。switch文で、基本型のみならず、定数文字列によって分岐することができる。以下のようにクラスや構造体の宣言にpartial修飾子をつけることで、その宣言を分割することができる。}これによって、巨大なクラスを分割したり、自動生成されたコードを分離したりすることができる。修飾子はすべての宣言につける必要がある。ジェネリクス[編集]ジェネリクスが導入された。クラス、構造体、インタフェース、デリゲート、メソッドに対して適用することができる。.NETのGenericsはC++のテンプレート、あるいはJavaにおけるそれとも異なるもので、コンパイルによってではなく実行時にランタイムによって特殊化される。これによって異なる言語間の運用を可能にし、リフレクションによって型パラメタに関する情報を取得することができる。where節によって型パラメタに制約を与えることができる。C++のように型パラメタとして式を指定することはできない。ジェネリックメソッドの呼び出し時に引数によって型パラメタが推論できる場合、型パラメタの指定は省略できる。静的クラス[編集]静的クラスが導入された。static属性をクラスの宣言につけることで、クラスはインスタンス化できなくなり、静的なメンバしか持つことができなくなる。yieldキーワード[編集]yieldキーワードによるコルーチンを使うことで、イテレータを楽に実装できるようになった。匿名デリゲート[編集]クロージャの機能を提供する匿名デリゲートが導入された。setアクセサのどちらかにアクセス修飾子を指定することでアクセス制御が別個にできるようになった。次の例では、getアクセサはpublic、setアクセサはprivateである。}}Null許容型とnull結合演算子[編集]nullを保持できる値型、Nullableが導入された。//jはnullとなる。nullとの演算の結果はnullになる。int?はNullable<int>の糖衣構文である。(??)が導入された。これは、nullでない最初の値を返す。返すこの演算子は主にNullable型を非Nullable型に代入するときに使われる。キーワードが導入され、型推論を利用したローカル変数の宣言ができるようになった。(曖昧である)拡張メソッド[編集]拡張メソッドが導入された。既存のクラスを継承して新たなクラスを定義することなく新たなインスタンスメソッドを追加定義することができる。修飾子をつけた、拡張メソッドを追加する対象の型の引数を最初に持つメソッドを定義することによって、通常の静的メソッドとしての呼び出しの他に指定した型のインスタンスメソッドとしての呼び出しを行うことができるメソッドを作ることができる。返す)また、列挙型やインターフェースなど本来メソッドの実装を持ち得ない型に、見かけ上インスタンスメソッドを追加することも可能である。Way.Right部分メソッド[編集]部分メソッドが導入された。修飾子をつけることでメソッドの宣言と定義を分離させることができる。定義されていない部分メソッドは何も行わず、何らエラーを発生させることもない。ラムダ式[編集]匿名メソッドをより簡略化した記法として、ラムダ式が導入された。この名前はラムダ計算に由来する。*/ラムダ式は匿名メソッドと同様に扱えるが、式形式のラムダがExpression<TDelegate>型として扱われた場合のみ匿名メソッドとして扱われず、コンパイラによって式木を構築するコードに変換される。匿名デリゲートが実行前にコンパイルされたCILを保持するのに対し、式木はCILに実行時コンパイル可能であるDOMのような式の木構造そのものを保持する。これはLINQクエリをSQLクエリなどに変換する際に役立つ。返すオブジェクト初期化の簡略化[編集]オブジェクトの初期化が式として簡潔に記述できるようになった。__p;また、コレクションの初期化も同様に簡潔に記述できるようになった。実際はプログラマはこの変数にアクセスすることはできない。自動実装プロパティ[編集]プロパティをより簡潔に記述するための自動実装プロパティが導入された。記述することで、プロパティの値を保持するための匿名のフィールド(プログラマは直接参照することはできない)と、そのフィールドにアクセスするためのアクセサが暗黙に定義される。