C# 始めました

書いたことはありましたが、それもほとんど何となくサンプルうつすぐらいの程度。諸般の事情から特定用途向き C# を始めることになりました。


C#C++Java に比べてここがいい!

C++ より気が利いていて、Java より楽に書ける。特定用途に C++ を使い続けるのは、それが一番詳しいからなだけであって、効率が決していいとはいえないことを考えると C# が一番いい気がしました。

とりあえず準備。Meadow + Poderosa 環境。コンパイルMeadow 上でやります。

オリジナルの TZTTester は C++ 用テストコードを吐くので、C# コードを吐く Petr 版を使います。それから、C# 用の .emacsコンパイラcsc は C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 にあるのでパスを通す。今のところパスを通しただけで使えた。

(autoload 'csharp-mode "csharp-mode"  "Major mode for editing C# code." t)
(setq auto-mode-alist (cons '( "\\.cs\\'" . csharp-mode ) auto-mode-alist ))

(defun csharp-compile-current-buffer ()
  (interactive)
  (compile (concat "csc /w:4 /o /out:a.exe " (buffer-file-name (current-buffer))))
)
 
(defun csharp-compile-current-buffer-no-wall ()
  (interactive)
  (compile (concat "csc /o /out:a.exe " (buffer-file-name (current-buffer))))
)

(defun run-test ()
  (interactive)
  (shell-command "./a")
)

 
(add-hook 'csharp-mode-hook
  (lambda ()
    (local-set-key [?\C-c?\C-m] 'csharp-compile-current-buffer)
    (local-set-key [?\C-c?\C-j] 'csharp-compile-current-buffer-no-wall)
    (local-set-key [?\C-c?\C-n] 'next-error)
    (local-set-key [?\C-c?\C-t] 'run-test)
))

適当に SRM とといてみて具合を確認。ちょっとやって気づいたこと。

  • Tuple がないどころか、Pair がない
  • 配列や List が等値演算子で自然に比較できない

これ結構痛いなぁ。自分の場合、適当に再帰 → memo ということをよくするので、このとき複数引数のときは自然とタプルを使いたくなる。Pair クラスなり作っておいて適当にはっつけるかな。最近思ったのだが、こういうときに Pair みたいなのを入れこさせるなら、配列にしてしまった方が楽な気がする。

それから、generics なメソッドを使うとき、f(3); みたいに使わないといけないらしく、つまり型推論してくれないようだ。make_pair が作れない。少し慣れが必要みたい。