概要
また雑食読書のスタートだ。今回は Python ではなくて、 C# のオライリー本。昔から読んでいるブログの人が C# の話をよくしていて、フーンっていう程度には興味があるんだ。親愛なるみろりHP古参のみんなは知っているだろうけれど、 C# は以前手遊びに書いたことがあるんだ。
だからゼンゼン未知の言語ってわけじゃないよ。でも Python と比べると大して素敵な言語だとも思わないから、ササッと流し読みする。
流し読みノート
基本構造 - メインプログラムとテスト
- メインプログラム: たとえば
Hello, Midori!
って出力するプログラム。 - テストコード: たとえば
Hello, Midori!
って出力されているか? と確認するプログラム。
C# はグローバルメソッドをサポートしていないので、 Hello
するためだけにこんなに↓書かないとだめ。
// メインプログラム
namespace HelloMidori
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello, Midori!");
}
}
}
- テストは Solution Explorer > Solution 名を右クリック > Add > New Project > Unit Test Project(.NET Framework) みたいにして作る。
- テストは「
HelloMidori.Program.Main
を実行」->「実行結果を検証」という手順で行う。 HelloMidori.Program.Main
をテスト側から呼び出さなきゃいけないから、次の手順を踏まないとだめ。- HelloMidori.Tests から HelloMidori が見えるように、「参照を追加」する。 Solution Explorer > HelloMidori.Tests の下の Reference 右クリックから。
- メインプログラムには
public
をつける。
// テストコード
namespace HelloMidori.Tests
{
[TestClass]
public class UnitTest1
{
private string _consoleOutput;
[TestInitialize]
public void Initialize()
{
// 返り値ではなくコンソールに出た「Hello, Midori!」をつかまえるための処置。
var w = new System.IO.StringWriter();
Console.SetOut(w);
// テスト対象、実行。
HelloMidori.Program.Main(new string[0]);
// 前後の改行とか半角スペースを除く処置。
_consoleOutput = w.GetStringBuilder().ToString().Trim();
}
[TestMethod]
public void TestMethod1()
{
// 出ているか? という確認。
Assert.AreEqual("Hello, Midori!", _consoleOutput);
}
}
}
どんなプログラムを書くにも、メインプログラムとテストのセットを作っていけば、発生するバグを大幅に減らせそうだね。テストは以下手順で実行。
- 上メニューの Test > Run All Tests
.NET Framework って何だ
- Framework って名前だけど Django とかとは違うみたい。 Python でいうところの python.exe にあたるものだと思う。
- いっぽう、 Django とかにあたるのは ASP.NET MVC とか。ややこしいわ。
- .NET Framework は、 C# だけでなく全 .NET 言語のためのランタイムを含んでいる。 VB とか F# も実行できるってことね。
- そんなランタイムのことを CLR(Common Language Runtime) という。
- CLR は CTS(Common Type System)をもっていて、そのおかげで C# からも VB からも使えるようになっている。
C# のいいところ
- .NET Framework のおかげで C# のライブラリだけでなく VB のライブラリも F# のライブラリも使える。
- でもそのせいでライブラリが乱立してイミフになってね?
- C++ のほうが性能はいいんだけど、何をするにも作業量が多くなってしまう。
- 作業量を減らしたいなら Python を使おうや。
- 特定の OS に依存しない。 C# 実装にかんする仕様は次のふたつで構成されている。
- C# 言語仕様 ECMA-334
- CLI(Common Language Infrastructure) ECMA-335
- Python も依存してなくね?
- Microsoft によって、言語とランタイムだけでなく IDE も提供されている。 Visual Studio のことね。
- マネージコードを採用している。
マネージコードって何だ
ふつう、コンパイラはソースコードを機械語に変換する。けど C# コンパイラは中間語 IL(Intermidiate Language)を生成する。そしてランタイム(CLR のことだね)が機械語に変換する。こういうのをマネージコードモデルという。何がいいのかっていうと、ソースコードがコンパイルされていなかったプラットフォームでも、将来的にランタイムが利用できるようになれば動くところ。
これって Python も同じだよな? Python も pyc っていう中間ファイルを生成してた気がする。
コードの上の方にある namespace HelloMidori のこと
これは名前空間という。 namespace
でクラス名を修飾して using
でその名前空間を使えるようにする。なんかごちゃごちゃ言ってるけれどあらゆる面で Python の import ほうが優れていると思う。
// C# の場合
// こうやって宣言して、
namespace System
{
public static class Console {}
}
// こうやって使う
using System;
Console.WriteLine("Hello, Midori!");
# Python の場合
# foo.py
def bar(): pass
# こうやって使う
import foo
foo.bar()
- C# はディレクトリ構造が
HelloMidori/Program.cs
だったらnamespace HelloMidori { class Program ...
と書くが、 Python は書く必要がない。単純にひと手間少なくて済む。ディレクトリ構造がHelloMidori/Program.py
だったらどうあがいてもfrom HelloMidori import Program
だ。 - C# は
using
しなくても完全修飾名でクラスとかメソッドを呼び出せるが、 Python はimport
をしなくては呼び出せない。これは呼び出せるほうが悪手だ。 - C# の
using
は名前空間を省略するために使われるが、それはあらゆる Python 本が「import *
はヤメろ」と言っているように悪手だ。これのせいでネットのコードサンプルがとても見にくい。 - 省略がしたいなら Python の
import as
を真似すればいい。というかそれはエイリアスという機能で真似されていた。
// デフォルトはこう
using System.IO;
// エイリアス
using IoPath = System.IO.Path;
このさいもっと Python で殴っておく
- Python と比べて
Hello
するためだけに書くコードが多すぎ。 - Visual Studio が使いにくすぎ。 Visual Studio Code を見習おう。
- 書くのに Visual Studio が必要ってだけで魅力がない。
- 外部ライブラリを入れるのにも Visual Studio が必要だなんて。 Python なら
pip install
で片付くことだ。
読んでいるうちに「Python のほうが全然ええやん」としか思えなくなってきて、第一回はこんな感想文になってしまった。けれど、文句を言いまくっていることについては別に構わないとおもう。この本は何を隠そう700ページ級だ。この読書の旅のうちにきっと C# のいいところも見えてくる。読了するとき印象が変わっていたら、それってとてもドラマだ。