Essential C# 5.0読書メモ #3

2015年4月30日木曜日

前回: Essential C# 5.0読書メモ #2
前回はChapter 2で値型と参照型、そして配列の話。終わりのほうは特にメモ書くことなかったのでスルーして、今回は続きのChapter 3。
Chapter 3は演算子と制御フローの章。
ここもほぼ読むところはないのでメモ箇所のみ。

浮動小数点演算について

+Infinity-Infinityがあること
IEEE 754準拠の浮動小数点演算では+0と-0の区別がある。単純に0.0と-0.0は区別して処理してくれるということで、きっと便利なシーンがある(自分の手元ではさほどなさそう)。

インクリメント/デクリメントについて

C++ではfoo(x++, x++);とした際の評価順がコンパイラ依存となっているが、C#では常に左から順に評価されるという話が書かれていた。あまり複雑なインクリメント配置はしたくないけれど、覚えておくと便利そうなやつ。
スレッドセーフでlockを利用しないインクリメント/デクリメント方法としてSystem.Threading.Interlockedクラス内にIncrement()Decrement()という両メソッドが生えているとのこと。
これらはプロセッサが持つ機能を使ってスレッドセーフに高速なインクリメント/デクリメント処理をおこなってくれると書かれていた。x86だとinc/dec命令とか使ってくれるのだろうか

コードブロック、スコープ、宣言空間

コードブロックとスコープは正確には違うよという話。unqualified nameで参照できる範囲がスコープで、ローカル変数のスコープはそれを囲むコードブロック。
そしてスコープと宣言空間も違う。スコープは、ある名前が何を指すかを解決するためのもの。宣言空間は、2つのものが同一の名前を持ってはいけない範囲のこと。
コードブロックはスコープの定義と共に宣言空間の定義もおこなう。

条件付き演算子

? : なやつ。C#で唯一の三項演算子だから三項演算子と呼ばれることもあるけれど、基本的には条件付き演算子と呼んだほうが良い旨が書かれていた。

null合体演算子

これ自体はそこそこ使うけれど、Coalescingという単語が特殊でよく覚えられないと気付いたのでメモ。

foreachループ

ループ本体がループ変数を利用するラムダ式か匿名メソッドを含む場合にループ変数の挙動がC# 5より前と5以降で異なるという話(詳しくはChapter 12らしい)があったのでメモっておく。

switch文

  • switchセクションからの脱出にcontinueを使うのは挙動把握が紛らわしくなるのでやめれとあった(そもそもそのパターンで使おうと思ったことがないけれど)
  • fall-throughをどうしても実現したければgotoを使えとあってファァとなった
    • goto default;以外、つまりラベル指定をおこないたければgoto case constant;とするように、とあって用途の特殊感が出てた
    • まあこうやって用途を制限してgotoにまつわる厄介な問題を回避するように言語設計されてるけど、やっぱりコードの流れを追いづらくなるのでgotoは避けようね、で終わっていた
  • defaultセクションを末尾に置く必要は特にないと書かれていて、そういえばそうかと思った

プリプロセッサ用のディレクティブ

#lineは馴染みがなかった。SourceMapのようなことができる(#warningで警告を発生させる際に、当該警告箇所ではなく別の場所が原因で問題が発生したことをコンパイラへレポートするもの)。
ライブラリを作っていると便利なシーンがきっとある感じがした。
結構長い章だったけれどこれで終了。次のChapter 4はメソッドとパラメータ。

0 件のコメント:

コメントを投稿