タグ:programming ( 56 ) タグの人気記事
On Lisp 第6章 表現としての関数
短い章。これからはじまるマクロ祭りへの序章っぽい。
初めてクロージャってものに触れたときはチンプンカンプンだったなぁ。

Lisp での表現手段 => クロージャ

6.1 ネットワーク
- クロージャの3つの便利な性質
- アクティブ
- ローカルな状態を保持している
- 複数のインスタンスを作れる

6.3 展望
- 「クロージャで表現する」==「コンパイルする」


On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
[PR]
by fkmn | 2009-11-09 23:55 | 一人読書会
On Lisp 第5章 返り値としての関数
この辺りの関数指向の機能は、最近のプログラミング言語だと普通に持ってたりするところに、少し時代を感じる。
再帰の一般化のあたりは、少し歯ごたえがあって面白かった。


5.4 関数を合成する

5.5 cdr部での再帰
- スペシャル変数 *print-circle*
=> 印字中に同一のコンスまたは同一のベクタが現れるかかどうかを検出するか
# 循環リストを表示する場合等に設定
参考:
- データの入出力
- M.Hiroi's Home Page / xyzzy Lisp Programming

5.6 部分ツリーでの再帰
- copy-list, 部分リストの参照はそのまま
# shallow copy的なコピー
- copy-tree, 部分リストの構造を含めてコピー
# deep copy的なコピー

5.7 いつ関数を作るべきか
- リードマクロ #. で、ソース読み込み時に関数を生成

On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
[PR]
by fkmn | 2009-11-06 23:55 | 一人読書会
On Lisp 第4章 ユーティリティ関数
&key とか :key みたいな、記号 + 一般的な名詞ってのは調べにくいなぁ。


- Common Lisp のオペーレータ
- 関数
- マクロ
- 特殊形式

4.1 ユーティリティの誕生
- 抽象化の初歩: 「振る舞いを密接に組み込んでは行けない」

4.4 検索
# 本書の直接の内容ではないけど、、、
- ラムダリストキーワード (参考:M.Hiroi's Home Page / xyzzy Lisp Programming)
- &key, キーワードを設定する
- :key, キーワードの指定
(defun before (x y lst &key (test #'eql))
(and lst
(let ((first (car lst)))
(cond ((funcall test y first) nil)
((funcall test x first) lst)
(t (before x y (cdr lst) :test test))))))

(before 'a 'b '(a b c d)) ;=> (A B C D)

を、&key を使わずに書き換えると
(defun before-no-key (x y lst)
(and lst
(let ((first (car lst)))
(cond ((eql y first) nil)
((eql x first) lst)
(t (before-no-key x y (cdr lst)))))))

(before-no-key 'a 'b '(a b c d)) ;=> (A B C D)


4.7 シンボルと文字列
- 任意の文字列をシンボルとして使用可能。
シンボルに空白や括弧が含まれる場合は、
「縦棒 (|) で挟まれる」 or 「文字の前に \ がつけられる」
(let ((s (symb '(a b))))
(and (eq s '|(A B)|) (eq s '\(A\ B\))))
;=> T




On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
[PR]
by fkmn | 2009-11-05 23:55 | 一人読書会
On Lisp 第3章 関数プログラミング
まだまだ基礎の確認。


3.1 関数型のデザイン
- 副作用を避ける

- nconc
(setq x '(1 2 3))
(setq y '(4 5 6))
(nconc x y)
;=> x: (1 2 3 4 5 6)
; y: (4 5 6)

;; x が nil の時の挙動
(setq x nil)
(nconc x y)
;=> x: NIL
; y: (4, 5, 6)


- 多値の受け取り
(multiple-value-bind (int frac) (truncate 26.21875)
(list int frac))


- 多値を返すには values オペレータで
(defun powers (x)
(values x (sqrt x) (expt x 2)))



On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
[PR]
by fkmn | 2009-10-31 23:55 | 一人読書会
On Lisp 第2章 関数
まだ小手調べ。Common Lisp の紹介といったところ。
といいつつ、Common Lisp と Scheme は、異なる部分が結構多いので、少し戸惑い中。


2.1 データとしての関数
- 関数は Lisp のオブジェクト

2.2 関数の定義
- #' オペレータ
=> 指定した名前の関数オブジェクトを取得

- 変数と関数の名前空間が別

2.4 属性としての関数
(defun behave (animal)
(funcall (get animal 'behavior)))

(setf (get 'dog 'behavior)
#'(lambda ()
(wag-tail)
(bark)))

(behave 'dog) ;;=> wag-tail と bark を実行

- OOP のメソッドの概念に対応

2.5 スコープ
- Common Lisp はレキシカルスコープ

2.7 ローカル関数
- labels 式
=> - ローカルに束縛された関数を作る
- let と違い、labels 式の中で定義された関数を参照可能
(defun count-instances (obj lsts)
(labels ((instances-in (lst)
(if (consp lst)
(+ (if (eq (car lst) obj) 1 0)
(instances-in (cdr lst)))
0)))
(mapcar #'instances-in lsts)))

# defun の中に defun じゃだめなの?
# とおもったら、defun は宣言する場所に関係なく、
# グローバルスコープに関数を定義してしまうらしい。
# flet と labels の動作確認 - ポロポロ

2.8 末尾再帰
- 末尾再帰を最適化するかどうかは、実装依存
# CLISP はそのままでは最適化しない
# => (proclaim '(optimize speed)) が必要

2.9 コンパイル
- (compiled-function-p #'foo)
# コンパイルされているかどうかの判定

- 関数単位のコンパイル
- (compile 'foo)
- (compile nil '(lambda (x) (+ x 2)))
# compile を陽に呼ぶのは、eval を呼ぶのに匹敵するほど過激な方法

- ファイル単位のコンパイル
- compile-file


On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
[PR]
by fkmn | 2009-10-28 23:55 | 一人読書会
Carbon Emacs に Common Lisp 環境を整えてみる
On Lisp を読み始めるにあたって、環境を整えた。

レシピ
  • Mac OS X (10.5)
    # Snow Leopard のパッケージが手元にあるが、まだインストールしてない
  • Carbon Emacs (2009年夏版, Emacs 22.3)

処理系は、特に理由も無く CLISP を選択
## CLIPS のインストール
% sudo port install clisp

## SLIME のインストール
% cd ~/.emacs.d/elisp
% cvs -d :pserver:anonymous:anonymous@common-lisp.net:/project/slime/cvsroot co slime
## CVS ディレクトリは要らないので削除
% find ~/.emacs.d/elisp -type d -name CVS -print0 | xargs -0 rm -rf


.emacs に以下を追加
(setq inferior-lisp-program "clisp")
(add-to-list 'load-path "~/.emacs.d/elisp/slime")
(require 'slime)
(slime-setup)


HyperSpec を設定したりもしたいけど、それはまた後で。

参考:

On Lisp
Paul Graham

4274066371
オーム社 2007-03
売り上げランキング : 82240
おすすめ平均 star

Amazonで詳しく見る
by G-Tools
[PR]
by fkmn | 2009-10-27 23:55 | 日記
【感想】Java並行処理プログラミング —その「基盤」と「最新API」を究める—
 ひげぽんさんのエントリを読んで、図書館で貸し出し予約をして、実際に手元に届くまで半年。大人気です。

 前半の第一部では、マルチスレッドプログラミングおける注意点やコツについて、後半の第二部では、Java の並行処理用の各種部品について、最後の16章では、Java のメモリモデルについてまで解説されている。

 Java の本だけど、他言語メインの人も、第一部だけ読んで、(Javaに限らない) マルチスレッドプログラミングの肝を掴むとか、第二部を読んで、Java がマルチスレッドプログラミングのために工夫している部分について学ぶとかいった使い方ができると思う。

 扱っている内容が実践的なので、ぜひとも手元に置いておきたい本なんだけど、絶版になってしまっているのが残念。
 復刊ドットコムでの交渉がはじまっているみたいなので、そちらに期待。


Java並行処理プログラミング ―その「基盤」と「最新API」を究める―

4797337206
ソフトバンククリエイティブ 2006-11-22
売り上げランキング : 169096
おすすめ平均 star

Amazonで詳しく見る
by G-Tools


以下、読書メモ。


1章 はじめに

- NPTL スレッドパッケージ (Linux2.6以降、カーネルのデフォルトのスレッド機能)


2章 スレッドセーフ

2-1 スレッドセーフって何?
- クラスは複数のスレッドからアクセスされたときに
正しく動作するならスレッドセーフである。

- ステートレスなオブジェクトはつねにスレッドセーフ

- 複合アクション
- リード・モディファイ・ライト
- チェック・ゼン・アクト
- 遅延初期化

- java.concurrent.atomic パッケージ


3章 オブジェクトを共有する

- メモリの可視性

3-1 可視性
- volatile を宣言されていない64ビットの数値 (double と long)
=> JVM は 64 ビットのリードとライトが
二つの32ビット操作である事を許している。

- 揮発性変数 (volatile):
そのリードはつねに、あるスレッドが書き込んだ最新の値を返す

- ロック => 可視性とアトミック性の両方を保証
揮発性変数 => 可視性だけを保証

3-2 公開と逸出
- NGなコード
- private なフィールドが外部から変更可能になる例
class UnsafeStates {
private String[] states = new String[] { "AK", "AL" };

public String[] getStates() { return this.states; }
}

- this参照の逸出

- スレッド拘束
- java.lang.ThreadLocal

- スタック拘束

3-4 不可変性
- Arrays.copyOf (Java6から)

3-5 安全な公開
- オブジェクトの利用と共有のためのポリシー
- スレッド拘束
- リードオンリーの共有
- スレッドセーフな共有
- ガード

4章 オブジェクトを組み立てる

4-1 スレッドセーフなクラスを設計する
- スレッドセーフなクラスの設計
- オブジェクトのステートを構成する変数 (ステート変数) を同定する
- ステート変数の値などを制約する不変更を同定する
- オブジェクトのステートへの並行アクセスを管理するためのポリシーを確立する

4-3 スレッドセーフを委譲する
- java.util.Collections.unmodifiableMap メソッド

- java.util.concurrent.CopyOnWriteArrayList

4-5 同期化ポリシーをドキュメントする
- ドキュメンテーションはスレッドセーフ性を管理するための
最高に強力なツールの一つ


5章 並行処理の構築部材

5-3 プロデューサ・コンシューマパターン

5-5 シンクロナイザ
シンクロナイザ: 自分のステートを使ってスレッドのコントロールフローを調停するオブジェクト
セマフォ、バリヤ、ラッチ など。

java.util.Conccurent
- CountDownLatch
- FutureTask (implements Future)
- Semaphore
- CyclicBarrier
- Exchanger

5-6
メモ化をスレッドセーフにする。


6章 タスクの実行

6-2 Executor フレームワーク
- java.util.conccurent
- Executor
- ExecutorService

- タスクの依頼と実行を分離する事で、
実行ポリシー (タスク実行の "what, whre, when, how") を簡単に指定できる。

- NG: java.util.Timer
OK: java.util.concurrent.ScheduledThreadPoolExecutor

6-3
- java.util.concurrent.CompletionService

- Future.get の時間指定付き呼び出し

- ExecutorService.invokeAll


7章 キャンセルとシャットダウン

Thread.stop と suspend には深刻な欠点があり、使うべきではない。

7-1. タスクのキャンセル
- volatile フィールドを使った協力的キャンセル

- スレッドは、インタラプションポリシーを持つべき

- インタラプションポリシーが分かっていないスレッドを
インタラプトしてはいけない

- java.util.concurrent.ThreadPoolExecutor の newTaskForフック

7-2. スレッドを使っているサービスを停止する
- スレッドを所有するサービスに、スレッドのシャットダウンの仕組みを持たせる

- プロデューサ・コンシューマ型のサービスのシャットダウン
- 毒薬 ("これをもらったら停止せよ" を意味するオブジェクト)

- java.lang.Thread.UncaughtExceptionHandler インタフェース


8章 スレッドプールを利用する

8-1 タスクと実行ポリシーの暗黙の結合
- Executor フレームワークではタスクの依頼と実行を切り離しきれない
タスクのタイプ
- 依存性のあるタスク
- スレッド拘束を利用しているタスク
- 応答時間に敏感なタスク
- ThreadLocal を使うタスク

8-3 ThreadPoolExecutor
- java.util.concurrent.ThreadPoolExecutor

- ThreadPoolExecutor のコンストラクタに渡すオプションのほとんどは、
コンストラクションの後でセッターメソッドを使って変更できる。

8-4 ThreadPoolExecutor を拡張する
- ThreadPoolExecutor は、拡張される前提で設計されている


9章 GUIアプリケーション

9-3
- SwingWorker クラス
長時間のタスクをバックグラウンドのスレッドで動かして、
GUIの応答性を維持するためのフレームワーク


10章 生存自己を防ぐ

10-1 デッドロック
- ロックの順序を固定する。

- 引数の順序で、ロック順が変化する場合は、
Sysytem.identityHashCode でロック順を誘導。

- 引き分けロック (第3のロック)

- ロックを保持した状態で、別のロックを保持するよそ者メソッドを呼び出すと、
デッドロックの可能性が高まる (しかも、分析が難しい)。
できるだけオープンコールを使うようにする。
オープンコール: ロックを保有しないでメソッドを呼び出す事


10-2 デッドロックの防止と診断
- Lock クラスの tryLock メソッド (時間制限付きのロック)

- スレッドダンプの出力
- Unix
- SIGQUITシグナル (kill -3)
- Ctrl-\
- Windows
- Ctrl-Break

10-3 そのほかの生存事故
- 飢餓状態
- シグナル喪失
- ライブロック


11章 実行性能とスケーラビリティ

11-2 アムダールの法則
ー 並列化できる部分と直列の部分の比率が重要。

11-3 スレッドがもたらす費用
- コンテキストスイッチ
- コンテキストスイッチの回数とそのために消費された時間の表示
- Unix : vmstat
- Windows: perfmon

- メモリの同期化

- ブロッキング

11-4 ロックの争奪を減らす
- 排他的ロックに代わる並行的フレンドリーな方法
- 並行コレクション
- リードライトロック
- 不可変オブジェクト
- アトミックオブジェクト
- etc.

- 通常は、オブジェクトを新たに作る方が、
既存のオブジェクトを同期化して使うよりもチープ


12章 平行プログラムを試験する

12-1 正しさを試験する
- スケジューリングのランダムさの確保
ループの中でスレッドをスタートさせると、スレッドは直列っぽく走る
(スレッドの作成とスタートは、程々に重い操作なので)
- 対応として、CountDownLatch や CyclicBarrier を使う

- 並列に動くスレッドの混じり具合をより多様にするために、
テストをマルチプロセッサのシステムで動かすべき。
さらに、アクティブなスレッドの数をCPUの数より多くする。

12-2 実行性能を試験する
- 複数のアルゴリズムを比較する

- 応答性を計測する

12-3 試験の落とし穴を避ける
- ガーベッジコレクション

- 動的コンパイル
- HotSpot は、-XX:+PrintCompilation で
動的コンパイル時にメッセージを出力する

- 処理系によるデッドコード (意味の無いコード) の排除


13章 明示的なロック

13-1 Lock と ReentrantLock
- java.util.concurrent.locks.ReentrantLock
- 固有のロックが持つ制約(*)を受けないロックの仕組み
* ロックの入手を待ってブロックしているスレッドにインタラプトできない
ロックを入手したコードブロックと同じブロックの中で解放する必要がある

- Lock.lockInterruptibly メソッドを使うと、
インタラプションへの応答性を維持したままロックの取得をトライできる

13-3 公平性 (fairness)
- 不公平なロックの良好な実行性能が、キューの公平性よりも重視される
(ロックの獲得にはコストがかかるので)

13-4 synchronized と ReentrantLock の使い分け
- ReentrantLock
- 時間制限付きのロック待機
- インタラプトできるロック待機
- コードブロックに縛られないロック
=> ReentrantLock は synchronized よりも明らかに危険なツール

13-5 リードライトロック
- ReadWriteLock インタフェース


14章 カスタムシンクロナイザを構築する

自作のシンクロナイザの作り方とその利用方法、メリットとデメリットについて。
固有の条件キュー

14-3 明示的な条件オブジェクト
- java.util.concurrent.locks.Condition インタフェース

14-5 AbstractQueuedSynchronizer
ロックとシンクロナイザを構築するためのフレームワーク


15章 アトミック変数とノンブロッキング同期化

15-2 ハードウェアの並行性サポート
- ほとんどの現代的なプロセッサに、
何らかの形のアトミックなリード・モディファイ・ライト命令がある

- compare and swap
- IA32 や Sparc など

15-3 アトミック変数
- ハードウェアの並行性サポートを直接使う
- 全12クラス
- 4つのグループ
- スカラー
- フィールドアップデータ
- 配列
- 複合変数

15-4 ノンブロッキングアルゴリズム
- 値を投機的に更新し、更新に失敗したらリトライする
# エラー忘却型コンピューティングに通じる考え方?


16章 Java のメモリモデル
- 半順序

- 排他性と可視性

[PR]
by fkmn | 2009-10-25 12:59 | 読書記録
「C# エッセンシャルズ」まとめ その3

2.9.7 メソッド (p.51, 52)

・引数の値渡し/参照渡し
 デフォルトでは、C# の引数は値渡しされる。ref 修飾子を仮引数にしていすると、参照渡しになる。

static void Foo(int p) { ++p; }      // 値渡し
static void Bar(ref int p ) { ++p; } // 参照渡し
public static void Main() {
int x = 8;
Foo(x);
Console.WriteLine(x); //=> 8
Bar(x);
Console.WriteLine(x); //=> 9
}
 デフォルトが値渡しってのは、意外と珍しいかも。

・out修飾子
 メソッドから値を受け取るための引数を指定するための修飾子。メソッド内で変数に値を割り当てられる事が保証されるので、メソッド呼び出しの時点では初期化を行わなくても良い。
using System;
class Test {
static void Split(string name, out string firstNames,
out string lastName) {
int i = name.LastIndexOf(' ');
firstNames = name.Substring(0, i);
lastName = name.Substring(i + 1);
}

public static void Main() {
string a, b; // 初期化不要
Split("Nuno Bettencourt", out a, out b); // 呼び出し側でも out が必要
Console.WriteLine("FirstName: {0}, LastName: {1}", a, b);
//=> FirstName: Nuno, LastName: Bettencourt
}
}

 うーん、これは正直どうなんだろ。引数で結果を受け取るという機会が、Cならまだしも、C#ではほとんどないような気がするんだけど。少なくとも、僕は使わないだろうな。

・params修飾子
 params修飾子は、メソッドの最後のパラメータに指定することができる。これが指定されると、メソッドは、特定の方のパラメータをいくつでも受け取ることができる。
using System;
class Test {
static int Add(params int[] iarr) {
int sum = 0;
foreach (int i in iarr)
sum += i;
return sum;
}

static void Main() {
int i = Add(1, 2, 3, 4);
Console.WriteLine(i); //=> 10
}
}

 ruby の * が付いた仮引数みたいなものだね。ちなみに、Ruby 1.9 からは、* は最後以外の引数にも指定できるようになりました (って、いつの間にか ruby の話になってる・・・w)。
def add(*iarr, name)
sum = 0
sum = iarr.inject { |r, s| r += s }
return "sum: #{sum}, name: #{name}"
end

def main
puts add(1, 2, 3, 4, 'fkmn') #=> "sum: 10, name: fkmn
end

main()


2.9.9 インスタンスコンストラクタ (p.56, 57)

 クラス/構造体では、コンストラクタをオーバーロードする事が可能。thisキーワードを使うと、オーバーロードされたコンストラクタを呼び出すことができる。baseキーワードを使うと、親クラスのコンストラクタを呼び出すことができる。
class B {
public int x;
putlic B(int a) {
x = 1;
}
public B(int a, int b) {
x = a * b;
}
// クラスBのコンストラクタは、すべてパラメータを受け取る
}

class D : B {
public D() : this(7) {} // オーバーロードされたコンストラクタを呼び出す
public D(int a) : base(a) {} // 親クラスのコンストラクタを呼び出す
}

 構文にちょっと違和感を感じるけど、機能自体はまぁ普通、というか無いと困る。

2.10.5 明示的なインターフェイスの実装 (p.65)

 インターフェイスメンバとそのクラスまたは構造体の既存のメンバの名前が重複した場合は、競合を解決するために、インターフェイスのメンバを明示的に実装することができる。

public interface IDelete {
void Delete();
}

public interface IDesignTimeControl {
object Delete();
}

public class TextBox : IDelete, IDesignTimeControl {
void IDelete.Delete() { ... }
object IDesignTimeControl.Delete() { ... }
// 競合を解決するためには、片方だけを明示的に実装すれば十分
}

[PR]
by fkmn | 2009-04-10 23:55 | IT
「C# エッセンシャルズ」まとめ その2

2.9.5 プロパティ (p.47, 48)

 アクセサ (Java でいう getter や setter) を生成する機能。

public class Well {
decimal dollars; // private フィールド
public int Cents {
get { return(int)(dollars * 100); }
set {
if (value >= 0)
dollars = (decimal)value / 100;
}
}
}

class Test {
static void Main() {
Well w = new Well();
w.Cents = 25; // set
int x = w.Cents; // get
w.Cents += 10; // get と set
}
}
 get{} だけ定義すると読み取り専用、set{} だけ定義すると書き込み専用というように定義できる。

 プロパティは、MSIL (Microsoft Intermediate Language) の段階で、get_XXX や set_XXX に変換される、とのこと。
public int get_Cents {...}
public void set_Cents (int value) {...}

 したがって、上の例のように Cents というプロパティを定義しているクラスでは、(C# の段階で) get_Cents や set_Cents といったメソッドは作成できない (Visual C# 2008 Express Edition で確認)。
public class Well {
decimal dollars; // private フィールド
public int Cents {
get { return (int)(dollars * 100); }
set {
if (value >= 0)
dollars = (decimal)value / 100;
}
}

// ***** エラー!! *****
public int get_Cents() {
return (int)dollars;
}
}


2.9.6 インデクサ (p.48, 49)

 配列スタイルの [] 構文をつかって、オブジェクトにアクセサを生やす。コレクションをカプセル化するクラスの生成等に使える。
public class ScoreList {
int[] scores = new int[5];

// インデクサ
public int this[int index] {
get { return scores[index]; }
set {
if (value >= 0 && value <= 10)
scores[index] = value;
}
}

// プロパティ (読み取り専用)
public int Average {
get {
int sum = 0;
foreach (int score in scores)
sum += score;
return sum / scores.Length;
}
}
}

class IndexerTest {
static void Main() {
ScoreList sl = new ScoreList();
sl[0] = 9;
sl[1] = 8;
sl[2] = 7;
sl[3] = sl[4] = sl[1];
System.Console.WriteLine(sl.Average); //=> 8
}
}

 微妙に分かりにくい機能。obj[0] を obj.0 というプロパティに対する構文糖衣と考えると、少し分かりやすいかも。


次回へ続く。
[PR]
by fkmn | 2009-04-08 23:55 | IT
「C# エッセンシャルズ」まとめ その1
 「C#エッセンシャルズ」について、というよりも、C# そのものの言語仕様について、個人的に「おっ」と思った部分についてのまとめメモ。このペースでいくと、全3-4回ぐらいになりそう。

verbatim文字列リテラル (p.15)

 Stringリテラルの先頭に @ をつけると「verbatim文字列リテラル」として取り扱われる。\ などのエスケープ文字が含まれていても、そのままの内容として扱われる。

public void StringDemo() {
string a1 = "\\\\server\\fileshare\\helloworld.cs";
string a2 = @"\\server\fileshare\helloworld.cs";
Console.WriteLine(a1 == a2); //=> True

string b1 = "First Line\r\nSecond Line";
string b2 = "First Line
Second Line";
Console.WriteLine(b1 == b2); //=> True
}

 Perl や Ruby のシングルクォートで囲まれた文字列みたいなものか。


using ステートメント (p.32)

 ruby の ブロックを使った open みたいなことが C# でもできる。
using (FileStream fs = new FileStream(fileName, FileMode.Open)) {
// fs に対する処理
}

 usingステートメントを使うと、IDisposableインターフェースを実装する変数の Dispose メソッドが自動で呼び出される。
 上のコードは、次のコードと全く同じとの事。
FileStream fs = new FileStream(fileName, FileMode.Open);
try {
// fs に対する処理
}
finally {
if (fs != null)
((IDisopsable)fs).Dispose();
}


2.7.3 仮想関数メンバ (p.37, 38)

 オーバーライドされる関数メンバは「virtual」キーワードで宣言する。オーバーライドする側は「override」キーワードを指定する。
class Location {
// オーバーライドされる関数メンバ
public virtual void Display() {
Console.WriteLine(Name);
}
}

class URL : Location {
// Location クラスの Display メソッドをオーバーライド
public override void Display() {
// 先頭の http:// を切り捨て
Console.WriteLine(Name.Substring(7));
}
}



2.7.6 継承したメンバを隠す機能 (p.39, 40)

 new キーワードの、コンストラクタ呼び出し以外の機能。
using System;
class B {
public virtual void Foo() {
Console.WriteLine("In B.");
}
}

class D : B {
public override void Foo() {
Console.WriteLine("In D.");
}
}

class N : D {
// Dクラスの Fooメソッドを隠す
public new void Foo() {
Console.WriteLine("In N.");
}
}

class Test {
public static void Main() {
N n = new N();
n.Foo(); //=> "In N."
((D)n).Foo(); //=> "In D."
((B)n).Foo(); //=> "In D."
}
}

 ちょっと、使いどころがまだよくわからないな。


2.9.3 フィールド、2.9.4 定数 (p.45, 46)

 フィールドに readonly 修飾子をつけると、読み取り専用フィールドとなり、値を割り当てた後にそれを修正する事ができなくなる。「readonly」は実行時に評価される
class MyClass {
int x;
float y = 1, z = 2;
static readonly int MaxSize = 10;
}


 「const」で定数を宣言する。コンパイル時に評価され、暗黙的に静的になる。コンパイル時に評価されるので、コンパイラによる最適化が行われる。
public static double Circumference(double radius) {
return 2 * Math.PI * radius;
}
は、最適化されて、次のように評価される。
public static double Circumference(double radius) {
return 6.28318530717959 * radius;
}


次回へ続く。
[PR]
by fkmn | 2009-04-06 23:55 | IT


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX