merさんのブログ

[Effective C#] 項目20 インターフェイスを実装することと仮想関数をオーバーライドすることの違い

本日の Effective C# は「項目20 インターフェイスを実装することと仮想関数をオーバーライドすることの違い」です。

これ、分かりにくいんですよねぇ…。Java のように、デフォルトで仮想関数ならば、あまり差がないんですが、C# の場合はデフォルトで仮想関数ではないので…。

書籍の方では、いろいろとごにょごにょ書いていますが、インターフェイスの実装と仮想関数は目的が違うので、目的に合わせて使い分けるのがいいと思います。

というか、似て非なるもの、なので、置き換えが可能なものでもありません。組み合わせて使ったりもします。

[Effective C#] 項目19 継承よりもインターフェイスの定義および実装を行うこと

今日の Effective C# は、「項目19 継承よりもインターフェイスの定義および実装を行うこと」です。

これ重要です!

オブジェクト指向を学び出したころは、継承による差分プログラミングを夢見ていました。でもまあ、これは失敗に終わりました。(もちろん、継承による差分プログラミングが有効だったときもありますが)

個人的にインターフェイスを使うべき最大の理由が、Mock Object の問題です。例えば、NMock はインターフェイスの Mock しか作れません。ですので、継承ではなく、極力インターフェイスを使うようになりました。(クラスの Mock を作れるのもありますが、その場合 virtual メソッドに限定されるので、やっぱり使えなかったりします)

そしたらなんか別のメリットが出てきてびっくりしました。

[Effective C#] 項目18 Dispose パターンの標準的な実装

今日の Effective C# は「項目18 Dispose パターンの標準的な実装」です。

これはためになります。Dispose メソッドを実装する回数ってそれなりに多いので、そのたびに深く考えるのは馬鹿らしいです。

Dispose メソッドの実装というエントリが MSDN Library にもあります。

って、書籍に書いてあることは全部書いてあるな…。

個人的には、こういう Dispose みたいなメソッドのために、多重継承が欲しいんですよねぇ。基本的には MSDN Library にあるサンプル通りに書いたクラスを継承することで対処すれば問題ないんですけどね。

ただ、Abstract パターンみたいなのを使ってるときは多重継承できないから、Dispose の方のクラスを継承できないというか…。

ASP.NET MVC2 Release

ScottGu のブログより。

ASP.NET MVC 2がリリースしたんだそうな。

個人的には気に入っているんだけど、いまいち盛り上がっていない感じ。さみしい…。

さーて、いろいろと研究せんとね。とか思いつつ、書籍がほとんどないんですよねぇ。洋書ならあるんだけど。

ASP.NET MVC実践プログラミング―.NET Frameworkによる標準Web開発技法くらいかな? これにしても MVC1 だし。あたりまえだけど。

[Effective C#] 項目17 ボックス化、ボックス化解除を最小限に抑える

本日の Effecitve C# は「項目17 ボックス化、ボックス化解除を最小限に抑える」です。

あー、ややこしいんですよね、これ…。

ボックス化とボックス化解除 (C# プログラミング ガイド)

この機能のおかげで、値型をさもオブジェクトのように扱えるので、非常にありがたいのですが、ボックス化・ボックス化解除で値型のコピーが作られ、ヒープにもボックスが作られるので、遅くなる原因になることがあるそうです。

ありがたいことに、C# からジェネリックが入りまして、これでほとんどの問題が解決できます。なので、省略!

[Effective C#] 項目16 ゴミの量を最小限に抑えること

仕事忙しすぎ。そんなわけで、現実逃避。

本日の Effective C# は「項目16 ゴミの量を最小限に抑えること」です。

これはまああれです。ヒープに短命な参照型をたくさん作るべきではないってやつです。オブジェクト指向ってのは隠ぺいなので、こういったものは、本来なら意識すべきではないとおもうのですが、やっぱり意識しないといけないのですよね。

ローカル変数が参照型であり、なおかつ非常に頻繁に呼び出されるメソッドの中で使用する必要がある場合には、その変数をメンバ変数へ昇格すべきです (値型のローカル変数については特に必要ありません)。

[Effective C#] 項目15 using および try...finally を使用してリソースの後処理を行う

本日の Effective C# は「項目15 using および try...finally を使用してリソースの後処理を行う」です。

using ステートメントは私が C# で大好きな機能の一つです。using ステートメントは try-finally を使うのと同じ効果が得られます。

[Effective C#] 項目14 コンストラクタの連鎖を活用する

本日の Effective C# は「項目14 コンストラクタの連鎖を活用する」です。

寒いです…。

コンストラクタが複数ある場合、その初期化処理の実装は悩みものです。初期化処理をメソッドとして書き、コンストラクタからそれを呼び出すとかやりたくなります。

でも、Effective C# によると、この方法は効率が悪いんだそうです。コンストラクタはちょいと特殊で、そのままコンパイルされるわけではないんだそうで、変数初期化子などのコードが追加されるそうです。

コンストラクタの連鎖を利用した場合は、連鎖の最後のコンストラクタにだけそういったコードが追加されるんだそうで。

んで、一番の理由はあれですよね。

readonly フィールドはコンストラクタからしか初期化できないこと、です。

なので、コンストラクタの連鎖を使用し、初期化コードをコンストラクタ内に書くことが重要なんです。

[Effective C#] 項目13 static メンバは static コンストラクタで初期化する

本日の Effective C# は「項目13 static メンバは static コンストラクタで初期化する」です。

あれ?
[Effective C#] 項目12 割り当て演算子よりも変数初期化子を使用すること
では変数初期化子を使用するとか言ってたんじゃなかったのけ?

と思いました。

要はですね。

static 変数初期化子/static コンストラクタは CLR から呼び出され、例外が発生すると、即プログラムが停止するんだそうです。

それを避けるためには、static コンストラクタで変数の割り当てを行い、例外処理をきっちりしろということだそうな。

例外処理や複雑な処理が必要な場合は static 変数初期化子を使う方がよいとのこと。

静的変数初期化子および静的コンストラクタは、クラス内の静的メンバを初期化する最も明瞭な方法です。これらの方法を使うことで可読性が増し、エラーの修正も容易になります。C# 以外の言語において、静的メンバの扱いが複雑だったことを教訓として、言語機能に組み込まれました。

だそうです。

IEnumerator<T> と IEnumerable<T>

tag: 

.NET Framework には IEnumerator<(Of <(T>)>) インターフェイスIEnumerable<(Of <(T>)>) インターフェイスの二つを実装することで、イテレータパターンを実装することができます。


[Effective C#] 項目11 foreach ループを使用すること
にはさらっとしか書かなかったんですが。

ページ

RSS - merさんのブログ を購読