2010年09月29日

try-catchのスタイル

   このエントリーをはてなブックマークに追加 Clip to Evernote
やねうらおさんとこの「C#のvarとtry〜catchが糞すぎる」の記事を読んで思ったこと。

は、確かに、if 文が余分なので、初心者が書くコードなのかもしれないですが、
new をtry の外に出すこと自体は、間違っていないと考えています。

僕は、var を使う、使わないにかかわらず、

と、new を try の外側に書きます。
hoge.YYY() を catchブロックで呼び出さない場合も同様の書き方にしています。

確かに、new Hoge()での例外がキャッチできないですが、
new Hoge()での例外をキャッチしたい場合は、その上位スコープなり上位メソッドでキャッチすれば
良いと思います。

以前、Microsoft Enterprise Library のソースを覗いてみた時も、
結構、このスタイルでtry-catchが書かれていた記憶があるので、
この書き方は、僕だけが主張する特別なコードではないと思います。

もちろん、try { } の中で、new する場合もありますが、その時には、そもそも catchで、
hogeにアクセスするコードは書きませんし、
そうなったら、自分のコードが何かおかしなことになっているぞ、と考えてしまいます。

C#の try ブロックのスコープがもうすこし広くても良いのでは、と思うこともありますが、
そういった仕様なので、その仕様のなかで、どう書くかを考えたときに、
上記のスタイルが自然なのかなと...

try-finally の時も new は、try の外側に出します。
まあ、大抵は、using使うので、書くことは少ないですが...
http://msdn.microsoft.com/ja-jp/library/yh598w02(v=VS.100).aspx読んでもらえれば、new を try-finallyの外に出す理由は分かってもらえると思います。

まあ、いろんな意見の人がいると思うので、あくまでも僕個人の意見ということで...   

Posted by gushwell at 23:34Comments(3)TrackBack(1)

2010年09月28日

2010年09月26日

現在実行中のメソッド名を得る

   このエントリーをはてなブックマークに追加 Clip to Evernote
System.Reflection.MethodBase.GetCurrentMethod()は、現在実行中のメソッドを表す MethodBase オブジェクトを返します。

Name プロパティで、メソッド名を取得でき、DeclaringType はこのメンバーを宣言しているクラスを取得できます。

以下、C#の簡単な例です。


結果は、

button1_Click
Sample.Form1

と表示されます。
MethodBaseを受け取るメソッドを作成し、MethodBase.GetCurrentMethod() を引数に渡してあげれば、簡易トレースメソッドが出来そうです。   
Posted by gushwell at 23:19Comments(0)TrackBack(0)

2010年09月23日

2つの配列から「値のペア」を列挙する

   このエントリーをはてなブックマークに追加 Clip to Evernote
F#の記事を書いて思ったんですが、C#でも、2つの配列にある値から「値のペア」を列挙するような場面は結構あるなーと。

いろんな書き方が考えられるので、例として、Dictionayに値を追加するコードをいくつか試しに書いてみました。
すぐに思い浮かぶのが、for文を使った書き方。これが、一番簡単ですね。

でも、{ ] の中がもっと複雑で、インデックスによるアクセスが複数個所で必要になる場合は、
for 文は、面倒だなーって感じることがあります。
foreach 使いたいなーと思っても、
とか書くと、alpstrの各要素にアクセスできないし、
とか書ければいいんですが、できません。

それと、LINQ使いたいな、というときには、インデックスを使うやり方は使えません。

.NET Framework4だと、Enumerable.Zip があるので、こういった時に使えそうです。

でも、最後の引数のSelectorがめんどくさい。

Tuple が追加されたのだから、

という Tuple 決め打ちのメソッドが標準で用意されてもよかったのにと思います。
そうすれば、以下のようなコードが書けます。

Tuple 嫌いだという方は、C#4.0で導入された dynamic 使って、こんなメソッドを書きます。
IEnumerableジェネリックスの型指定を dynamic にして、匿名クラスのオブジェクトを返しています。
すると、以下のように、書けます。
実際、Tuple使わない理由もないので、このZip2はあまり意味ないですが、dynamic の可能性の一つとして 見てもらえればと思います。

最後に、再度断っておきますが、
ここで問題にしているのは、Dictionayオブジェクトに値を追加する方法ではなくて、
2つのコレクションから、値のペアを列挙する方法です。

10/24 追記

意外にも反応がたくさんあってびっくりしました。
何人かの方が、コメントやトラックバックで、別の解法を示してくれて 僕も勉強になりました。
いろいろな書き方があるってことは、C#が表現力豊かな言語である証ですね。

なお、この記事を最初にアップしたときには、

>それと、LINQ使いたいな、というときには、このやり方は使えません。

と書きました。その後、

>それと、LINQ使いたいな、というときには、インデックスを使うやり方は使えません。

と書き直しましたが、
これは、for 文だと、続けて LINQの拡張メソッドに続けられないけど、Zipなどを使えば、
そのあとに、Where や Select や Count などが続けられる、という意図でした。
LINQでは、「2つの配列から値のペアを列挙することができない」という意図で、
書いたのではなかったのですが、僕の表現のあいまいさのおかげ(?)で
いろんなコードを見ることができました。
  
Posted by gushwell at 17:12Comments(3)TrackBack(2)

2010年09月20日

これは反変性の例なのかな?

   このエントリーをはてなブックマークに追加 Clip to Evernote
Microsoftのサイトにある、『連載! とことん C#』の 第 11 回 共変性 (covariance) と反変性 (contravariance) ですが、

ここの「2.共変性と反変性」で説明している反変性の例は適切なのでしょうか?
そのコードを抜粋させていただきます。
なんか、ここで説明しているコードは、反変性の例になっていないような気がするのですが...
どなたかわかれば教えてください。

僕の理解では、C#で、こんな単純なコードで反変性を説明するのは 無理なんじゃないかと...
それとも、僕が知らないだけですか?   
Posted by gushwell at 22:34Comments(6)TrackBack(0)

2010年09月17日

Enum.GetValues で列挙値を列挙

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

という enum に対して、


と表示したいときに、どんなコードを書きますか?
以下、とあるところで見つけたコード。


ネットにはこんなコードが溢れていますが、
目にしてしまうと、書き変えなくては気が済まない悪い癖がでてしまいました。
※ あえて、URLを載せるのは控えさせていただきます。

僕なら、こんな風に書きます。


  
Posted by gushwell at 23:17Comments(2)TrackBack(0)

2010年09月14日

Windows7の拡大鏡のショートカットキー一覧

   このエントリーをはてなブックマークに追加 Clip to Evernote
ちょっと調べたので、Windows7の拡大鏡のショートカットキーをここに書いておきます。

拡大鏡を起動する  Windows キー + (+)
拡大鏡を終了する  Windows キー + Esc
拡大または縮小する  Windows キー + (+)または(−)
全画面表示に切り替える  Ctrl + Alt + F
レンズに切り替える  Ctrl + Alt + L
固定に切り替える  Ctrl + Alt + D
色を反転する  Ctrl + Alt + I
全画面表示で表示位置を変更する  Ctrl + Alt + Space
表示を移動する  Ctrl + Alt + 方向キー
レンズのサイズを変更する  Shift + Alt + 方向キー

Windows7 の拡大鏡はかなり使えます。   
Posted by gushwell at 22:49Comments(0)TrackBack(0)

2010年09月12日

Triangle15パズル

   このエントリーをはてなブックマークに追加 Clip to Evernote
久しぶりに、Gushwell's C# Programming Pageの「C#プログラム小品集」にプログラムをアップしました。

「横に並んだ2つの数の差(正数)をその下の○に入れる」という条件を満たして、○を組み合わせた逆三角形に1~nまでの数字を配置するというパズルを解くプログラムです。

Triangle15パズルというのは、僕が勝手に付けた名前です。正式な名前はわかりません。

Solveボタンを押すと、解の探索を開始し、解答を表示します。


解は2つありますが、その一つだけを表示しています。興味がある方は自力で解いてみてください。

順列を求める応用でこの問題を解いています。 ソースコードは、こちらに掲載しています。  
Posted by gushwell at 22:23Comments(4)TrackBack(1)