2009年11月29日

FxCopに学ぶ番外編(6) : IDisposable を正しく実装します

   このエントリーをはてなブックマークに追加 Clip to Evernote

メールマガジン「C#プログラミングレッスン」では、今、[FxCopに学ぶ編] を連載中です。
そこで取上げようとしたルールで、下書きまでしたのですが、結局メルマガには書かないことにしたルールがいくつかあります。
そのまま捨ててしまうのはもったいないので、ブログに掲載します。


■IDisposableの実装(2)■
前回の続き
まず、なぜ、以下のクラスは、sealedを付加して継承できないようにしないと いけないのでしょうか?
前回のクラスを再度示します。


たとえば、Sampleを継承した、DelivedSampleを考えてみます。
このクラスにも、Dispoaseしないといけないフィールドが存在したとしましょ う。そうなると、必然的に、IDisposableインターフェースを実装しないとい けません。


しかし、このコードは、派生元のDisposeメソッドを隠すことになってしまい ます。
これだと、派生元のTextReaderオブジェクトを破棄することができませ ん。
つまり、Sampleクラスは、継承に対応していないクラスということになり ます。sealedを付けることで、表面上はこの問題を解決することができます。

無理やりコンパイルを通したとしても、以下のようなコードを書くと、


ポリモーフィズムが働きませんので、派生クラスDelivedSampleのDisposeメソ ッドが呼ばれず、DelivedSampleが保持しているリソースを破棄することがで きなくなってしまいます。

では、継承にも対応したクラスをお見せしましょう。


このコードの肝は、
  1. 複数回、Disposeが呼ばれても問題が発生しない。
  2. Finalaizeメソッド(デストラクタ)を実装することで、DIsposeを呼び出さなかった 場合でも、ガベージコレクション時にクリーンアップ処理をしている。
  3. Dispose を呼び出した場合は、GC.SuppressFinalize を呼び出し、 ファイナライズメソッドの呼び出しを抑制している。
  4. (ファイナライズでやることは、すでにDisposeでやっているから不要ということ)
  5. 実際のクリーンアップ処理を受け持つ、virtualで引数ありのDisposeメソ ッドを用意している。これで継承に対応可能。
の4点です。
これは、Disposeパターンと呼ばれているものです。詳しくは、
http://msdn.microsoft.com/ja-jp/library/fs2xkftw.aspx
をご覧ください。

■FxCopのルール
CA1063: IDisposable を正しく実装します

  

Posted by gushwell at 23:47Comments(7)TrackBack(0)

2009年11月26日

FxCopに学ぶ番外編(5) : 破棄できるフィールドは破棄します

   このエントリーをはてなブックマークに追加 Clip to Evernote

メールマガジン「C#プログラミングレッスン」では、今、[FxCopに学ぶ編] を連載中です。
そこで取上げようとしたルールで、下書きまでしたのですが、結局メルマガには書かないことにしたルールがいくつかあります。
そのまま捨ててしまうのはもったいないので、ブログに掲載します。


■IDisposableの実装(1)■


このコードの問題点はなんでしょうか?

それは、Sampleクラスが IDisposableインターフェースを実装していないこと が問題です。


とIDisposableを指定する必要があります。なぜIDisposableを実装しないと いけないのでしょうか。
それは、reader フィールドのTextReaderクラスがIDisposableを実装している クラスだからです。
TextReaderが使い終わったら、Dispose()メソッドを呼び出しリソースを解放する必要がありますが、それをど こでもやっていません。
どこでTextReaderクラスのDispose()を呼び出せばよいのでしょうか。Execや、Exec2メソッドの中でしょうか。 そうではありませんよね。
利用者側が、Execを呼び出さなかったら、Disposeはされないままですからね。
こんな時には、Sampleクラスにも、Disposeメソッドを定義し、Sampleクラス を利用する側から、Disposeを呼び出してもらえばいいのです。
それが以下のコードです。


使う側が、


とすれば、usingブロックを抜ける時に、Sample.Dispose()が呼ばれ、その中 で、TextReader.Disposeが呼ばれます。

これで、めでたしめでたし...
ではありません。実は、このコードはFxCopでは警告が出てしまいます。
この警告を手っ取り早く回避するには、


と sealed クラスにします。
しかし、sealedにするということは、このクラスから継承させることができな いということです。では継承を許し、かつ、IDisposableを実装するにはどう したら良いのでしょうか?

それは次回に解説します。


■FxCopのルール
CA2213: 破棄できるフィールドは破棄します

  
Posted by gushwell at 23:37Comments(0)TrackBack(0)

2009年11月24日

次の話題は何にしようか

   このエントリーをはてなブックマークに追加 Clip to Evernote
メールマガジン「C#プログラミングレッスン」ですが、「FxCopに学ぶ編」もそろそろ終わりに近づいてきたので、次の話題を考えなければいけない時期になっているのですが、 何が良いのか思案中です。

とりあえず考えてみました。

1. コードレシピ編
これまでは、文法や機能からの切り口で説明してきたが、 何をやりたいかという切り口で説明する。
例えば、『○○○レシピブック』のようなもの。
今まで「○○編」という形では取上げにくかった話題にも触れられる可能性が ある。 これをやり始めると、長期連載になりそう。
でも、すでにいろんなサイトでTISPは見られるなー。


2. シリアライズ編
これは、それほど書く内容がないかな。 でも、リリーフ役としてはちょうど良いかも。

3. 正規表現編
これもリリーフ役としては良い題材かも。
ただ、正規表現が初めてという人を対象とすると C#の説明というよりは、正規表現の説明が主になりそうな気がする。
正規表現を上手く説明する自信がない。 メールアドレスとマッチさせる正規表現を取り上げると、 お前は何も分かってないと、ツッコミが入りそう。

4. アルゴリズム編
教科書に載っているようなアルゴリズムの解説というのは今の時代難しい なーと思う。
自前のリンクリストやソートのコードを示しても、あまり有り難味が無いし... 取り上げる題材が難しい。それに、アルゴリズムの説明はパワーが必要だ。

5. どう書く?.org編
サイト「どう書く?.org」http://ja.doukaku.org/で出された課題のいくつかを ピックアップして取り上げるというもの。
最初のレシピ編やアルゴリズム編とかぶる部分があるが、 プログラミングの練習として適当なお題を選んで僕なりのコードを書いてみる。
[どう書くorg編」「続・どう書くorg編」「続々・どう書くorg編」 [帰ってきた・どう書くorg編」と長く続けられそう。 なによりも、今回は何を書こうかなと考える手間が省ける。 パズル的要素が強いお題が多いのが気にかかる。

今の僕の気持ち的には、5番かなと。

そのほかの話題としては、C#4.0や.NET4 がありますが、これは時期尚早だと思いますし、
Silverlight、WPFの場合は、C#のコードというよりも XAMLの説明が主になってしまいそうだし、
Linq To SQLは、需要が少ないような気がするし....

難しいなー。

  
Posted by gushwell at 22:58Comments(0)TrackBack(0)

2009年11月23日

FxCopに学ぶ番外編(4) : ISerializable を正しく実装します

   このエントリーをはてなブックマークに追加 Clip to Evernote

メールマガジン「C#プログラミングレッスン」では、今、[FxCopに学ぶ編] を連載中です。
そこで取上げようとしたルールで、下書きまでしたのですが、結局メルマガには書かないことにしたルールがいくつかあります。
そのまま捨ててしまうのはもったいないので、ブログに掲載します。

■独自例外クラスの書き方(3)■■

MyExceptionに独自のプロパティを追加したとします。


このコードを FxCopに食わせると、GetObjectDataの実装を型 MyException に追加してくださいという警告が出ます。

これは、独自のプロパティを正しくシリアライズするために GetObjectDataメソッドを overrideする必要があることを示しています。
独自のフィールド/プロパティを持つ例外クラスを作成する場合は、GetObjectDataをoverrideする必要があります。

GetObjectDataメソッドを実装した MyExceptionを示します。


MyException(SerializationInfo info, StreamingContext context) コンストラクタも変更されていいる点に注意してください。
これで、シリアライズ、デシリアライズに対応させることができます。

■FxCopのルール
CA2240: ISerializable を正しく実装します

  
Posted by gushwell at 23:59Comments(0)TrackBack(0)

2009年11月22日

Silverlightアプリをブログに張り付ける(多角形の完全グラフ)

   このエントリーをはてなブックマークに追加 Clip to Evernote
Silverlight StreamingでSilverlightアプリを公開する」で、 多角形の完全グラフを描くSilverlightアプリケーションを掲載したのですが、Silverlight Streamingのサービスが終了してしまったので、 http://gushwell.ifdef.jp/のWebサイト(NINJA TOOLSの無料ホームページスペース)に掲載したものを、こちらのブログに張り付けてみました。

SilverlightのWebプロジェクトの 「xxxxPage.html」と「ClientBinフォルダ」をサーバーにアップロードしておいて、Blog には、以下のような記述をします。。

  Startボタンを押してみてください。簡単なアニメーションが始まります。


これで、動きのあるプログラムをブログで公開できます。 なぜか右側の枠線が隠れてしまっていますが、それは御愛嬌ということで...  
Posted by gushwell at 23:07Comments(0)TrackBack(0)

C# プログラム小品集

   このエントリーをはてなブックマークに追加 Clip to Evernote
Gushwell's C# Programming Page に「C# プログラム小品集」というページを新たに追加しました。
まだ、載せているプログラムの数は少ないですが、徐々に増やしてゆきたいと思います。

過去にこのブログに掲載したプログラムからもいくつかピックアップして掲載するつもりです。

それと、「Gushwell's C# Programming Page」 もRSSフィードにも対応しました。
RSSファイルの作成に、「Fumy RSS & Atom Maker」というFreeソフトを利用しています。
  
Posted by gushwell at 15:21Comments(0)TrackBack(0)

2009年11月19日

FxCopに学ぶ番外編(3) : シリアル化コンストラクタを実装します

   このエントリーをはてなブックマークに追加 Clip to Evernote

メールマガジン「C#プログラミングレッスン」では、今、[FxCopに学ぶ編] を連載中です。
そこで取上げようとしたルールで、下書きまでしたのですが、結局メルマガには書かないことにしたルールがいくつかあります。
そのまま捨ててしまうのはもったいないので、ブログに掲載します。


前回の続きです。

■■独自例外クラスの書き方(2)■■

前回は、


と書きましたが、まだ、コンストラクタが不足しています。


というコンストラクタを定義する必要があります。
これがないと、この例外をシリアル化することができません。
例えば、ネットワーク越しにこの例外を伝えたいような場合、このコンストラクタが無いと正しく動作しません。

それには、以下のように修正する必要があります。


■FxCopのルール
CA2229: シリアル化コンストラクタを実装します

  
Posted by gushwell at 23:33Comments(0)TrackBack(0)

2009年11月18日

SkyDrive Explorer

   このエントリーをはてなブックマークに追加 Clip to Evernote
数か月前からマイクロソフトが運営するオンラインストレージサービス「Windows Live SkyDrive」を利用しているのですが、ブラウザではなく、エクスプローラから操作ができる「SkyDrive Explorer」なるフリーのツールがあるということで さっそくダウンロードしインストールしました。
エクスプローラからD&Dでファイルの操作ができるので、とても便利ですね。

ところで、その「SkyDrive Explorer」のダウンロードページ (http://skydriveexplorer.com/download.php) を見てたら、

Mojibake problem fixed;

って書いてありました。「文字化け」は、英語で「mojibake」 なんですね。
  
Posted by gushwell at 23:24Comments(0)TrackBack(0)