C# 【C Sharp】
概要
C#(C Sharp)とは、米マイクロソフト(Microsoft)社が開発したプログラミング言語の一つで、C言語/C++言語をもとに同社の.NET Framework向けのソフトウェア開発に適した仕様に調整・改良したもの。2002年に最初のバージョンが公開された。C/C++の構文や記法、ステートメントなどを踏襲しているが、オブジェクト指向を全面的に取り込み、メモリ管理に実行環境によるガーベジコレクションを用いるなど、同じC++から派生したJavaと共通する特徴を持ち、よく比較される。
数年の一度新しいバージョンが公開されており、ジェネリクス、クロージャ(匿名デリゲート)、ラムダ式、クエリ式(LINQ)、匿名型、オプション引数・名前付き引数、非同期処理(async/await構文)、新機能の取り込みに積極的である。
豊富な組み込みデータ型を持つ強い型付けを採用しており、変数の宣言時にデータ型を指定する静的型付けが原則だが、varキーワードによる型推論の利用や動的型付けも追加された。
とり得る値を並べた列挙型(enum)、Cの構造体に似た値型(struct)、値の組を定義するタプル(tuple)など豊富なデータ表現をサポートしている。C/C++で特徴的だった真偽値を整数値と対応付ける(0が偽、0以外が真)方式は廃止され、専用のブーリアン型(bool)を用いるようになった。
C/C++との主な違い
オブジェクトや配列などのメモリ管理は処理系が自動的に行うようになっているため、C/C++のようにメモリアドレスを変数値として扱うポインタの仕組みが必要になることはほとんどないが、ハードウェアに近い低レベルの制御が必要な場合や、外部のネイティブコードを呼び出す場合などに備え、ポインタの仕様自体は残されている。ポインタを使用するブロックはunsafeキーワードにより他と区別されるようになっている。
オブジェクトが一部の処理を別のオブジェクトに実行させるデリゲート(delegate)と呼ばれる機構を備えており、Cにおける関数ポインタのように間接的なメソッド呼び出しを行うことができる。
古い手続き型の仕様にオブジェクト指向を追加したC++とは異なり、言語仕様の根本にクラスベースのオブジェクト指向を採用しているため、クラス定義の外にグローバル変数などを定義することはできない。Javaと同じように、混乱の原因になりがちだった多重継承はサポートせず、複数の基底クラスを参照する場合にはインターフェース(interface)を用いる。
コンパイルの前にソースコードを改変するプリプロセッサの仕組みも排除されたが、一部のプリプロセッサ構文(#で始まる特殊な記法)はプリプロセッサディレクティブとして定義されており、コンパイラやコードエディタに指示を与えることができる。
開発・実行環境
標準の開発環境は同社が統合開発環境の「Visual Studio」の一部として「Visual C#」として提供しており、開発したプログラムは.NET環境に共通する中間言語CIL(Common Intermediate Language)によるバイナリコードに変換される。
このコードはコンピュータで直に起動可能ではなく、.NET Frameworkなどの実行環境に含まれる仮想マシンによって解釈・実行される。これにより、.NET共通の豊富なライブラリの使用や、ガーベジコレクション、JITコンパイラによる高速化などの恩恵を受けることができる。
C#自体の仕様は標準化団体のEcma Internationalに提出され規格化されており、同社と無関係に処理系を実装することもできる。オープンソースの.NET互換環境を開発するMonoプロジェクトによるC#コンパイラなどが存在する。仕様上は.NET環境向けではなくコンピュータが直に実行できるネイティブコードを生成することも可能だが、そのような用途で用いられることはほとんどない。
名称
C#と表記し “C Sharp” (シー・シャープ)と読むのが正式名称だが、表記の「#」はナンバーサイン(number sign)であり、音楽記号の「♯」ではない(傾いているのが縦棒か横棒かが異なる)。
C言語では整数値に1を加えるインクリメント演算子を「++」と表記するため、C++言語の名称は「Cを改善した」という一種の言葉遊びになっているが、C#初期の開発を主導したアンダース・ヘイルスバーグ(Anders Hejlsberg)氏によれば、「#」は「++」を縦に並べて+が井桁状になっているという含意があり、「C++を改善した」という意味が込められているという。