概要

また雑食読書のスタートだ。今回は 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# のいいところも見えてくる。読了するとき印象が変わっていたら、それってとてもドラマだ。

 
       
      