概要

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