お気楽C#プログラミング超入門のフォントを Web フォント (Noto Sans JP, Noto Sans Mono) に変更し、印刷用の CSS を追加しました。Web ブラウザの印刷機能を使って PDF に変換することもできます。表示が崩れるときはフォント Noto Sans Mono CJK JP をインストールしてください。
C# は Microsoft が開発したマルチパラダイムなプログラミング言語です。共通言語ランタイム (CLR) が解釈する共通中間言語 (CLI) にコンパイルされて実行されます。プログラムを実行するためには CLR が必要になるので、Windows 以外の環境では動作しないと思われる方がいるかもしれませんが、実はそうではありません。C# や CLI は Ecma や ISO によって標準化されており、JIS 規格にも採用されています。
C# の開発・実行環境には Microsoft が開発したオリジナルの .NET Framework と、オープンソースプロジェクトの .NET Core や Xamarin / Mono がありますが、それらは .NET に統合されることになりました。.NET はオープンソースで、Windows, Mac OS, Linux などマルチプラットフォームで動作します。最新版 (2024 年 12 月 時点) は 2024 年 12 月にリリースされた .NET 9.0 ですが、LTS (long-term support) ではありません。本ページでは 2024 年 11 月にリリースされた .NET 8.0 (LTS) を使うことにします。
C# でプログラムを作る場合、.NET SDK をインストールすれば最低限の開発環境が整います。統合開発環境 (Visual Studio など) もありますが、本ページではそれを使わずに、エディタで簡単なプログラムを作りながら、C# の基本を勉強していくことにします。なにぶんにも初心者が作るページなので、勘違いや間違いがあると思います。何かお気づきの点がありましたら、メールでご指摘いただけると助かります。本ページは C# に関する M.Hiroi の「覚え書」にすぎませんが、よろしければお付き合いくださいませ。
.NET SDK は .NET (本家) の Download .NET からダウンロードすることができます。インストールの方法は以下のページに詳しく書かれています。
M.Hiroi は 2. に書かれているパッケージマネージャを使って .NET 8.0 を Ubuntu 22.04 (WSL2) にインストールしました。
$ sudo apt install dotnet-sdk-8.0
$ dotnet --version 8.0.110
.NET SDK でプログラムを作る場合、dotnet というコマンドラインツール (CLI) を使います。たとえば、コンソールアプリケーションを作成する場合、プログラムを作成するディレクトリ (プロジェクト) で次のコマンドを実行します。
dotnet new console [-o name]
dotnet new はプロジェクトを初期化するコマンドです。作成するプログラムの種類 (C# / F# / VB) はオプション -lang で指定することができます。省略した場合は C# になります。これでカレントディレクトリにプログラム (Program.cs) と、プロジェクトに必要なデータが生成されます。ソースファイルの拡張子には cs が使用されます。
また、オプション -o (--output) で作成するプロジェクトを指定することもできます。たとえば、-o hello とするとカレントディレクトリにサブディレクトリ hello が作られて、そこにプロジェクトが生成されます。
プログラムは次のコマンドで実行することができます。
dotnet run [--project name]
オプション --project で実行するプロジェクトを指定します。省略した場合、カレントディレクトリのプロジェクトが実行されます。
簡単な実行例を示しましょう。
$ dotnet new console -o hello テンプレート "コンソール アプリ" が正常に作成されました。 作成後の操作を処理しています... /home/mhiroi/csharp/hello/hello.csproj を復元しています: Determining projects to restore... Restored /home/mhiroi/csharp/hello/hello.csproj (in 2.44 sec). 正常に復元されました。 $ ls hello Program.cs hello.csproj obj $ cat hello/Program.cs // See https://aka.ms/new-console-template for more information Console.WriteLine("Hello, World!"); $ dotnet run --project hello Hello, World!
実行形式ファイルは次のコマンドで生成します。
dotnet publish [-c conf] [project]
project を省略するとカレントディレクトリのプロジェクトが対象となります。オプション -c (--configuration) を省略した場合、.NET 8.0 以降では規定値の Release が使用され、リリース用の実行形式ファイルが生成されます。
オプション -c は dotnet run でも使用することができます。この場合、ほとんどのプロジェクトでは、-c の既定値は Debug になります。なお、実行形式ファイルを出力するディレクトリはオプション -o (--output) で指定することができます。
簡単な実行例を示しましょう。
$ dotnet publish hello MSBuild のバージョン 17.8.5+b5265ef37 (.NET) Determining projects to restore... All projects are up-to-date for restore. hello -> /home/mhiroi/csharp/hello/bin/Release/net8.0/hello.dll hello -> /home/mhiroi/csharp/hello/bin/Release/net8.0/publish/ $ dotnet /home/mhiroi/csharp/hello/bin/Release/net8.0/hello.dll Hello, World! $ /home/mhiroi/csharp/hello/bin/Release/net8.0/publish/hello Hello, World!
実行形式ファイルの名前は、デフォルトでプロジェクト名と同じになります。プログラムの実行は実行形式ファイルを直接実行するだけではなく、dotnet に dll ファイルを渡すことでもできます。
C# を学習する場合、Lisp / Scheme, Python, F# などのような対話モード (REPL) があると便利です。実は C# にも対話モードを実現するためのツール dotnet-script があります。
dotnet-script は次のコマンドでインストールすることができます。
dotnet tool install -g dotnet-script
dotnet-script は ~/.dotnet/tools/ にインストールされるので、そこにパスを通しておいてください。次のコマンドを .bashrc などに記述しておくといいでしょう。
export PATH=$HOME/.dotnet/tools:$PATH
dotnet-script はスクリプト言語のようにプログラム (ソースファイル) を実行します。ソースファイルの拡張子には csx が使われます。引数なしで実行すると対話モードになります。
$ cat hello.csx Console.WriteLine("Hello world!") $ dotnet script hello.csx Hello world! $ dotnet script > 1 + 2 3 > #exit
dotnet script と dotnet-script のどちらでも実行することができます。終了するときは #exit と入力してください。詳しい説明は dotnet-script の README をお読みくださいませ。
さて、肝心な C# の実行速度ですが、いつものように「たらいまわし関数」を使って調べてみました。
リスト : たらいまわし関数 (tak/Program.cs) using System; class Tak { static int tak(int x, int y, int z) { if (x <= y) return z; return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y)); } static void Main() { DateTime s = DateTime.Now; Console.WriteLine("{0}", tak(22, 11, 0)); DateTime e = DateTime.Now; Console.WriteLine("{0}", e - s); } }
それでは実行結果を示します。tak(22, 11, 0) を計算しました。他のプログラミング言語との比較を下表に示します。
$ dotnet new console -o tak テンプレート "コンソール アプリ" が正常に作成されました。 作成後の操作を処理しています... /home/mhiroi/csharp/tak/tak.csproj を復元しています: Determining projects to restore... Restored /home/mhiroi/csharp/tak/tak.csproj (in 2.12 sec). 正常に復元されました。
$ dotnet publish tak -o exec MSBuild のバージョン 17.8.5+b5265ef37 (.NET) Determining projects to restore... All projects are up-to-date for restore. tak -> /home/mhiroi/csharp/tak/bin/Release/net8.0/tak.dll tak -> /home/mhiroi/csharp/exec/ $ cd exec $ ls tak tak.deps.json tak.dll tak.pdb tak.runtimeconfig.json $ ./tak 11 00:00:01.3187941
処理系 | 秒 |
---|---|
Python (ver 3.10.12) | 62.23 |
Ruby (ver 3.0.2p107) | 25.59 |
Lua (ver 5.4.4) | 22.41 |
Gauche (ver 0.9.15) | 21.29 |
ocamlc (ver 4.13.1) | 9.46 |
SBCL (ver 2.1.11) | 4.90 |
Julia (ver 1.10.5) | 1.84 |
SBCL (最適化) | 1.50 |
C# (.NET 8.0) | 1.32 |
GCC -O2 (ver 11.4.0) | 1.19 |
ocamlopt (ver 4.13.1) | 1.05 |
C# はネイティブコードにコンパイルするプログラミング言語に匹敵する結果になりました。この結果には M.Hiroi も大変驚きました。C# (.NET) の JIT コンパイラはとても優秀なようです。興味のある方はいろいろ試してみてください。
『お気楽C#プログラミング超入門』の著作権は筆者「広井誠 (Makoto Hiroi)」が保持します。無断使用や無断転載は禁止いたします。『お気楽C#プログラミング超入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は出典を明記してくださるようお願いいたします。
ただし、ドキュメントの内容とプログラムは無保証であり、利用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi)」 は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。