前記事で本の内容について書いたので、読みながら感じた「C#自体の感想」を覚え書いておく。記憶の定着に有益かと思い。
新記事にせずにコメントでずらずら書いてこうかとも思ったけど、書式付けられず編集もできなくて不便そうなのでこっちに。
あと初めて Markdown で書いてみる。「見たまま」編集モードがめんどくさく、機能も貧弱なので。
基礎からしっかり学ぶC#の教科書 改訂新版 (マイクロソフト関連書)
- 作者:WINGSプロジェクト 髙江 賢
- 発売日: 2019/12/20
- メディア: 単行本
私はC#使用歴ほぼ0なので、使っていくとしっくりきたり、あるいは別の問題点に気付いたりするかもしれない。あくまで「C/C++が母語の人から見た第一印象」ということで。
全体
- C#という言語はあまり好きになれそうにない。必然性や美しさが感じられない仕様が多い気がする。(個人の感想)
- caseインデントやめろやって思うけど、MS社がそうしてるのか…。
まあ「switch 改行 {」で下げずに case 来ると違和感あるかもね。 - しかし「do {} 改行 while ();」はだいぶイヤw
2~4章
さすがにここは飛ばしていいかなと思いつつも、するっと読んだ。
学べたこと
- class foo {} ←セミコロンいらない。struct, enum も。
- 逐語的文字列リテラル…えらい大仰な、verbatim を「逐語的に」訳すとそうなるのか。メモリ屋さんの名前であったような。まあヒアドキュメントか、見た目どおり。
- 以下のような fool proof 仕様。まあ賢明か
- p.56 入れ子ブロックでの名前衝突は許容しない
- 暗黙の静的 narrowing 変換禁止
- そのわりにキャストはCスタイル。ここはC++より退化してるような。キャストをスティグマ化する意思がない
- char は2バイト。UTF-16やから
- decimal なんてある。Ruby#BigDecimal みたいなもんか
- プリミティヴも実は構造体。MaxValue などのメソッドが使える
5章 制御文
- 構造化定理。1960年代に証明されていたのか!
- p.86 case の breakも「必ず必要」。「禁止されたフォールスルー」というコラムもある。
これも fool proof なんやろけど、必須なら「fallthru しない仕様」ってことでむしろ省略できたのでは…
新人もベテランも平等に不満足な仕様にしたってことか。 - p.94 foreach ループについて、iterator や template というものに一切触れず説明。
ほんまC#を「理解する」じゃなくて「使う」人のための本やなあ。まあ紙幅が足りないってこともあろうが。
6章 クラスの基礎とメソッド
6.3.6 名前付きパラメーターの制限
ふ~んハッシュ的に渡せるやつね、さすがモダン言語…と思ったらだいぶ制約あるやん、しかもC++のデフォルト引数の制限より自明でない仕様。そこまで不自由ならやめちまえよと思う。
6.3.9 値渡し、6.3.10 参照渡し
VBっぽい仕様。
- 呼び元にも ref 必要ってうっとうしすぎひん?(呼び元でも参照渡しであることを明示するためか)
- 「引数が参照型でもデフォルト値渡しになる」って、C/C++から入った人は絶対はまりそう。なんて仕様だ!
6.3.11 in パラメーター就職子
C# 7.2で in キーワードができたと。const T& なやつ。呼び元の ref は不要。
6.5.3 静的クラス
いわゆるユーティリティクラス、「単なる関数群」か。OOP言語の税金って感じやね。
7章 継承とカプセル化
「基本クラス」じゃなく「基底クラス」のほうがなじみ深いが。
- p.144 派生のメンバ→基底ctor→派生ctorの順。これ重要っぽい
- p.147 基底クラスメンバの「隠蔽」が可能。これはC++と同様。多重継承禁止するならこっちも禁止すればよかったのに?
- 意図的に隠蔽してることをコンパイラに明示するには new を付ける
…伝統ある new を new な意味で override するなよ!と思う。self, my とかでよかったんでは?
- 意図的に隠蔽してることをコンパイラに明示するには new を付ける
- p.149 override virtualとの対を必須にするのはいいかも。
- p.157 自動プロパティ 単なる糖衣構文。attr_accessor なんやろけど、get; set; 書くのすら冗長なような。
- p.158 オブジェクト初期化子 こんなの要る?いたずらに混乱を招くだけのような…と思ったが、いちいちコンストラクタを増やさずに柔軟な生成を可能にしたいってことかな。
8章 ポリモーフィズム
- p.169 isとas。これは簡潔でいい。初めてC#の文法でいいと思ったかもw
- p.180 interface Javaと一緒か。duck typing を可能にするための仕組みって感じ。ちょっと前にかじったGoとも一緒かな。
has a 寄りの is a で使えばいいか。 - p.187 型スイッチ こんな仕様よく思いついたな、感心
9章 例外処理
- p.198 catch 節を広い→狭いの順に書くとコンパイルエラー この fool proof は親切。
10章 配列と構造体
- p.224~ 構造体、だいぶ特殊。C++とかなり違い、制限多めのクラスって感じ。
結局 new の仕様がよーわからん、「コンストラクタ呼び出し」と等価? - p.231 タプル かんたん構造体か。
- p.233 「_」でGoに合流!!w
- p.236 nullable を enable にしたら「null非許容」になる?? わかりにくすぎやろ。
11章 高度なプログラミング
- p.244 これは new 省略しても同じ。ん、new 省略可否に一貫性がなく直感的でない?
- p.253 変数のシャドーイング ローカル関数内で外側と名前かぶっても暗黙に上書きされる。
まあ普通と思うけど、入れ子ブロックでの衝突を禁止してるのと一貫性ないぞ?? - p.275 true をオーバーロードしたら false が、operator< に対しても operator> が「必ず必要」。
単に片方を否定したらいいだけやのに、承服しかねる仕様。true != !false になったらどうする気?(むしろその矛盾を実現したい仕様??) - p.279 拡張メソッド reopen っぽい機能。しかしそのために static class ExFoo みたいなのを定義せなあかん、直感的でない this の再利用(せめて the にしたら?)、などこれも不可解な仕様。
namespaceが分割定義できるなら class もそうすりゃよかったんでは。
…いや。public にしかアクセスできないってことは、ヘルパの記述を簡略化しただけで、実は reopen してないのか。
決め打ち=ほぼ無意味な public static 書かせるくらいなら class xc extends c {...} にすりゃよかったのに。
12章 クラスライブラリの活用
- p.322 using も再利用。いかがなものか。検索するとき不便ちゃう?
- p.334 ^ を「末尾から」の意味に使うとは。直感的でない。$ がいい?
- 「..」も range 的なやつには当然の記法だが、「m..n」は index m~n-1、つまりRubyで言う「...」である。うーん