C#に関する世界観です。.NETも参照のこと。
C#とは、Microsoftが開発したプログラミング言語です。
Microsoftは、以前からJava仮想マシンの独自の実装を開発するなど、Javaに対する対抗意識を燃やしていました。
Microsoftは、BorlandのDelphiの開発メンバーから、主要開発者のひとり、アンダース・ヘルスバーグを引き抜いて、新しいプログラミング言語、C#を開発します。
同時に、Java VMと同じ仮想マシンで動くプラットフォームとして、.NET Frameworkを開発し、Windowsネイティブの俊敏かつ調和されたGUI環境であるWindows.Formsを搭載しながら、Javaのクラスライブラリと同様の優れたクラスライブラリを開発し、この.NETの機能とクラスライブラリのAPIに、複数の言語(C#, Visual Basic.NET, C++/CLI, F#など)からアクセスできるようにしました。この仕組みは、単一言語であるJavaを使用するJREの仕組みよりも優れており、COMやActiveXのような従来のWindowsのコア機能の、VMを使用したさらに進歩した形態として、Windowsだけではなく、UNIX界隈などでも新規性を見出され、GNOME開発者のミゲル・デ・イカザなどは、UNIX環境で動くオープンソースの.NET FrameworkやC#/VB.NETコンパイラのMonoを開発し、.NETでX11のGTKツールキットを用いてGTKネイティブなGUIアプリケーションを開発できるGtk#などを開発しました。
C#言語の特徴は、まず、「Javaによく似ている」ということ。
C#のソースコードを見ると、一見、Javaとキーワードだけが変わった、Microsoft版のJavaに見えます。もし、Javaだけを知っていてC#を知らないプログラマがC#のソースコードを見たら、Javaのコードのキーワードだけを置き換えたように見えるでしょう。
オブジェクト指向をサポートすることや、クラスライブラリとしてまとまったAPIを持つこと、またVMの上で動くことなども、Javaと同様です。
ですが、大きく異なる点があります。それは、Windowsネイティブに対応しているということです。
開発者から見ると、C#のプログラムはJavaによく似ています。ですが、GUIで実行する際、アプリケーションの見た目、すなわちルック・フィールが異なります。JavaのSwingアプリケーションは、Windowsネイティブアプリケーションとは異なる、独自のメタリックなルック・フィールをしています。それに比べて、C#/VB.NETのWindows.Formsで作られたアプリケーションは、従来のWindows APIやVisual Basicアプリケーションが持っていたような、Windowsネイティブの見た目をしており、ほかのWindowsアプリケーションと比べて違いがありません。もし、ソースコードが公開されていなければ、ユーザーは気付くことがないでしょう。
しかしながら、C#はJavaをコピーして奪っただけの言語ではありません。それは、たくさんの賢い機能が加えられているからです。
Javaと比べた改良点は、たくさんありますが、たとえばunsafeコードを実行できることです。Javaにはポインタがありませんが、C#にはポインタがあります。unsafeコードの中でだけ、ポインタを使うことができます。
ほかの改良点として有名なのは、プロパティとLINQです。プロパティは、アクセサをgetとsetブロックを用いて変数名と代入演算子だけでアクセスできる機能です。Javaでは、getなんちゃらとかsetなんちゃらという、アクセサと呼ばれるメソッドをひとつひとつ丁寧に(言い方を変えれば面倒くさい)作らなければなりませんが、C#ではこれをsetとgetと呼ばれるブロックの中に記述し、通常のメンバ変数と同じように代入することができます。
また、LINQはデータベースのクエリとして使うことのできる専用の記法です。PHPなどでは、全体のプログラムがPHPで記述されていても、データベースに対するクエリの部分は、SELECT文などのSQLで書かなければいけません。C#は、早くからこのようなSQL文をLINQと呼ばれる独自の記法で、C#プログラムと同様に記述することができます。
これ以外にも、C#にはさまざまな便利な機能があります。このような機能はJavaに対する改善であるだけではありません。ヘルスバーグは、Delphi開発者であることで知られていますが、多くの機能や設計のアーキテクチャが、Delphiを参考にしています。よって、言語的な部分はJavaを参考にしながら、アーキテクチャ的な部分はDelphiを参考にしていると言われます。そもそもJavaをそんなに模倣したいわけでもなく、JavaがC++に対するSunによる別の回答だったのだと同じように、C#もC++に対するMicrosoftによる別の回答であることを目指しています。そのことが、言語の名称であるC#(C++++とも読むことができる)に表れています。
Javaも参照のこと。
C#についてもうひとつ、メリットとして言えるのは、標準化されているということです。
Microsoftは、以前のJavaとMicrosoft独自のJVMのような、高圧的な方法でJava市場を獲得するのではなく、言語の仕様を公開し、標準化することで、新しいC#という言語を作り出しました。
標準化されているため、同じ仕様を持った別の実装を開発することができます。これが、LinuxやUNIXにおいて、CLIコードを実行できるMonoに繋がります。
以前は、そのように、Microsoft独自の実装である.NET Frameworkに対する、UNIXのオープンソースなMonoという位置づけでしたが、最近の大きな動きとして、Microsoftは.NETをオープンソース化することにし、ライブラリやVM、コンパイラなどを含めて、オープンソースかつ、LinuxやUNIXでも動くようなクロスプラットフォームなもの(以前は.NET Coreと呼ばれていた)にすることにしました。
結果、今の.NETはオープンソースでありながらクロスプラットフォームです。Windowsでも、Linuxでも、クライアントでもサーバーでも、同じMicrosoftのオープンソースな.NETが動きます。
また、Monoプロジェクトを開発していたXimian社がNovellに買収され、その後にまた買収されるなどして、新しい会社において存在意義を疑問視され、ミゲル・デ・イカザなどのMonoチームはレイオフされることになり、ミゲルはXamarinという新しい会社を立ち上げて、UNIXやLinuxだけではなくモバイル向けに.NETを提供し、AndroidでもiOSでも同じコードベースでモバイルアプリを開発することのできるXamarinというプラットフォームを開発しますが、これがMicrosoftによって買収されます。
よって、今の.NETは、オープンソースでありながら、WindowsネイティブのGUIを備え、同時にAndorid/iOSのモバイル端末やLinuxのサーバーでも動き、Javaと同様の親しみやすい記法でクラスライブラリを使用することができる、いわば「完璧なプラットフォーム」となりつつあります。
最近は、JavaにはKotlinという新しいAltJava(Java代替言語)が生まれており、モバイルで多く使われています。巨大化し、かつてのシンプルで使いやすかったJavaが、たくさんの機能を追加しすぎたために、もともとあった良さを失ってきています。KotlinはそれをJava代替言語で再構築する試みであると言えるかもしれません。また、長年オープンソースでなかった(オープンソースにすると約束はされていた)Javaも、OpenJDKの登場によって、オープンソース化されました。Javaは最初あったようなブラウザのアプレットではなく、クライアント側ではなくサーバー側で使われる言語となって生き延びています。また、モバイル向けにはAndroidという強力なJavaの援軍が居ます。今後、Javaと.NETがどのようになっていくのか、Log4jの脆弱性問題(Log4Shell)などで騒がれているJava界隈と.NET界隈がどうなるのか、大いに見物です。
実際のところ、僕はC#が大好きである。
そもそも、僕はDelphiが好きだった。昔、Delphi 6のフリー版を使ってOpenJaneなどをコンパイルし、その後にDelphi 7の有料版を買った。
C#は、Microsoftが.NET Frameworkを開発した時に作った言語で、Delphiの主要な開発者を引き抜いて設計した。
そのこともあってか、C#や.NET FrameworkにはDelphiの影響が随所にみられる。特にフォームデザイナーの仕様などはそれそのものである。
C#はJavaを参考にした.NETの言語である。
Javaとの違いは、プロパティの実現やデリゲート・無名関数、LINQ、yield returnなどもあるが、大きく違うのは、「WindowsのネイティブGUIに対応」したことと、「.NET Framerowkの上で動くVBやF#などの多様な言語を使える」ということである。
C#のWindows.Formsは、とても美しく、数学的である。JavaではSwingというPure JavaのGUIを使うが、ルック&フィールがとても独自で個性的、悪く言えば醜い。C#やVB.NETを使えば、Windowsのネイティブなアプリケーションを開発できる。
Windows.Formsは大人気で、「Windows APIやMFCに比べて分かりやすく、可読性も高く美しい」と評判である。Windows APIのメッセージループのコードなどがとにかく醜かったWindowsだが、C#によって一転とても美しいAPIに変わった。
また、.NETではVBやF#、Managed C++を使うこともできる。これらは同じ.NET Frameworkのライブラリを使っていて、一度覚えれば他の言語でも同じように使える。
Windows以外のプラットフォームとしてはmonoがある。monoでGTK#を使うことで、GTKでもC#でプログラミングを行うことができる。
ゲームエンジンのUnityでも、monoを主要プラットフォームとしているためC#を用いてゲームプログラミングを行う。
Unityも参照のこと。
実際のところ、C#とVisual Studioと.NETを使うことで、とても洗練されたGUIアプリケーション開発ができます。
Microsoftは賢いです。特に、Visual StudioのフォームデザイナーとC#によるイベントドリブンを体験すると、感動します。本当に「最高のプログラミング環境」になります。
僕が思うに、Delphiの開発メンバーを引き抜いたことが大きく貢献していると思います。C#は最高です。
VB(フォームデザイナー)も参照のこと。
Visual StudioでのC#の開発のコツは、Tabキーを2回押すこと。Tabキーを2回押すことで、自動補完され、効率的に開発できる。
以下の参考リンクに、簡単な(おそらく最速の)C#の開発方法が載っているので参考になる。
また、C#によるWindows.Formsは、言ってしまえば「天才的に使いやすい」です。
C#とTypeScriptには、旧ボーランドでTurbo PascalやDelphiを開発していて、マイクロソフトへと引き抜かれたアンダース・ヘルスバーグが開発に携わっているとされていますが、彼は本当に天才だと思います。
C#によるWindows.Formsは、C/C++などの開発と比べて、簡単かつ平易で、本質が分かりやすいです。本質的にどのようにGUIアプリケーションを開発すれば良いのか、直観的に分かった上で、コードをすらすらと書くことができます。
僕はC#の開発の経験は少ないですが、Delphiで2ちゃんねる専用ブラウザOpenJaneの派生版を開発していたことがあります。そのごろから、Delphiの設計は素晴らしいと思っていましたが、C#などの言語の概要を知ってさらに素晴らしいと思いました。ヘルスバーグは本当に最高の天才だと思います。
DelphiやTypeScriptや2ch専用ブラウザも参照のこと。
.NETにC#関係の内容があるので参照してください。
イベントハンドラはデリゲートの1つで、C#におけるイベント駆動で、コールバック関数をイベントに追加するのに使う。
デリゲートとは、関数を格納できる変数のこと。
まず、以下のようなコードがあったとする。
class HogeForm : Form { Button hoge_button; ... }
ここで、以下のようなコールバック関数がある。
private void hoge_button_Click(object sender, EventArgs e) { // クリックされた時の処理 }
この時、以下のようにEventHandlerを用いてイベントを登録できる。
public HogeForm() { hoge_button = new Button(); hoge_button.Text = "Hoge"; ... hoge_button.Click += new EventHandler(hoge_button_Click); this.Controls.Add(hoge_button); }
オブジェクトの初期化(hoge_buttonのプロパティへの代入)は、=を使ってひとつひとつ代入する以外に、{}を用いたより簡潔な構文が用意されており、それを使うこともできる。
(Windows Forms入門 - Hatada's Home Pageと[C#]イベントハンドラとはなんぞや – gomokulogを参考に執筆・編集して引用しました。)
C# 3.0ではラムダ式が導入された。たとえば以下のように使用する。
(x, y) => (x + y) / 2; (double x, double y) => { return (x + y) / 2; };
従来のC#でも、delegateを用いることで匿名メソッドを記述することはできる。
delegate (double x, double y) { return (x + y) / 2; }
またデリゲートは関数を格納できる変数のことで、ラムダ式とともに使用する。
以下にサンプルコードがあります。
C#では、setとgetを使うことで、プロパティをエレガントな記述にできます。基本的に、取得する時はgetで、代入する時はset。過去にはC#がJavaのパクリと言われましたが、Javaにはない機能です。
オブジェクト指向も参照のこと。
C#にはグローバル変数やグローバルメソッドはありません。グローバルスコープに変数や関数を定義することはできません。
C#にはポインタがあります。unsafeコードの中でのみ、ポインタを使うことができます。ただし推奨されているわけではなく、できるだけ使うべきではありません。
2023.10.11
.NETの具体的なGUIコンポーネントについては、.NETやVisual Basic(3.フォームデザイナー)を参照のこと。
C#サンプルコードも参照のこと。
C#では、インターフェースであるIEnumerable/IEnumeratorを用いることで、コレクションとイテレータをとても美しく使うことができます。
C#ではforeach文とイテレータとコレクションは、IEnumerable/IEnumeratorインターフェースを中心とした「とても密接で美しい関係」にあります。foreach文はイテレータを用いた糖衣構文にすぎません。イテレータがあって、はじめてC#のforeach文とコレクションあるいはそれ以外の反復可能なインターフェースがあるのです。
本当に、こんなによく考えられた、美しい言語はないと思います。C#は最高です。
2024.06.18
C#では非同期処理としてasync/awaitがサポートされています。このためにジェネリックなTask型を使用します。
並列処理も参照のこと。
2024.06.18
以下のリンクが参考になります。
WebKit埋め込みも参照のこと。
大まかに言って、C#とJavaはほとんど同じです。
文法的に言って、C#とJavaは非常に似通っています。「Javaのキーワードを変えただけ」であると言えるかもしれません。なので、Javaの経験があればC#はすぐにマスター出来ます。
C#とJavaのどこに違いがあるかと言えば、それはクラスライブラリやWindows.Formsです。
クラスライブラリは、Javaと.NETは、よく似ていますが違いがあります。C#とVB.NETは同等のクラスライブラリを使用しているため、どちらかというとVB.NETの経験があればC#はマスターしやすいでしょう。
問題は、Windows.Formsです。はっきり言って、JavaとC#のもっとも大きな違いは、「GUIフォームの実現方法」にあります。
Javaは、主なGUIウィジェットツールキットとしてSwingを採用していますが、SwingはどんなプラットフォームでもPure Javaで動くという優位性はありますが、Windowsで使おうとすると、Windowsのネイティブアプリケーションと異なるルック・フィール(見た目や操作感)になります。
これに対して、Windows.Formsは、Windows APIのラッパーであり、Windowsのネイティブアプリケーションのルック・フィールとなるため、Windowsとの調和性が高いです。
ほかにも、JavaとC#は、最初にC#が登場した時点では「まるでJavaのパクリ」と言えるものでしたが、その後にさまざまな機能が追加され、C#とJavaの差別化や独自性が少しずつ生まれていきました。
また、Windows.Formsよりも進歩した方法として、XMLでGUIのデザインを行うXAMLを用いたWPFという新しいGUIフォームの開発手法も生まれています。
このような結果、確かにC#とJavaは(今でも)よく似ていますが、実際には異なる点が多くある(新しく生まれている)と考えるべきでしょう。
このようなC#ですが、決してJavaのパクリ言語で終わることなく、C#の主戦場となる「C#を主に使う分野」が二つ存在します。それはWindows開発とゲームです。
まず、Windows開発では、C/C++、C#、VB.NETのどれかを使うことがほとんどです。特に先進的な機能を多く有するC#は、これらの言語の中でもっとも生産性が高いと言えます。
C/C++とC#の違いは、「仮想マシンを必要とするかどうか」です。
C/C++は、仮想マシンである.NET Frameworkを必要とせず、ネイティブで動作します。なので、本当にパフォーマンスや処理速度が重要なGUIアプリケーションは、Windows APIを用いてC/C++で開発します。
ですが、パフォーマンスや処理速度が重要でないのであれば、C#/VB.NETを使用するべきです。なぜなら、C#/VB.NETは、C/C++を使った開発に比べて、はるかに生産性が高いからです。
確かに、DelphiなどのMicrosoftとは別の会社が開発した言語を用いることもできますが、場面としてはほとんどありません。Microsoftの開発する言語を用いることのほうが多いです。
また、ゲーム開発でもC#が大きく使われます。これはUnityなどのゲームエンジンが、プログラミング言語としてMono/C#を採用したことが大きいです。このため、ゲームでは、ゲームエンジンを使うのであればC#を使います。
ゲームエンジンを使わず、ネイティブなC/C++を、3DCGなどのグラフィックAPIであるOpenGLやDirectXを直接触って使うこともありますが、最近はゲームを簡単かつ手軽に作れるゲームエンジンというのが流行しています。Unityの場合、個人や小規模な会社であれば無料でダウンロードして使用できることも大きいです。
ゲームエンジンはさまざまなプラットフォームに対応しているため、Windows上のPCゲームだけではなく、スマホやさまざまなゲームハードにも対応できます。エンジンには多くの機能があり、エンジンを使わずにゲームを作るよりも生産性も高いです。
なので、Windowsアプリケーションを作りたい場合や、ゲームを開発したい場合には、C#はとても重要なプログラミング言語となります。
GUIの開発全般についてはGUI開発を参照のこと。
オブジェクト指向も参照のこと。
イベント駆動を参照のこと。