2010年09月29日
try-catchのスタイル
やねうらおさんとこの「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の外に出す理由は分かってもらえると思います。
まあ、いろんな意見の人がいると思うので、あくまでも僕個人の意見ということで...
は、確かに、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の外に出す理由は分かってもらえると思います。
まあ、いろんな意見の人がいると思うので、あくまでも僕個人の意見ということで...
2010年09月28日
2010年09月26日
現在実行中のメソッド名を得る
System.Reflection.MethodBase.GetCurrentMethod()は、現在実行中のメソッドを表す MethodBase オブジェクトを返します。
Name プロパティで、メソッド名を取得でき、DeclaringType はこのメンバーを宣言しているクラスを取得できます。
以下、C#の簡単な例です。
結果は、
button1_Click
Sample.Form1
と表示されます。
MethodBaseを受け取るメソッドを作成し、MethodBase.GetCurrentMethod() を引数に渡してあげれば、簡易トレースメソッドが出来そうです。
Name プロパティで、メソッド名を取得でき、DeclaringType はこのメンバーを宣言しているクラスを取得できます。
以下、C#の簡単な例です。
結果は、
button1_Click
Sample.Form1
と表示されます。
MethodBaseを受け取るメソッドを作成し、MethodBase.GetCurrentMethod() を引数に渡してあげれば、簡易トレースメソッドが出来そうです。
2010年09月23日
2つの配列から「値のペア」を列挙する
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つの配列から値のペアを列挙することができない」という意図で、
書いたのではなかったのですが、僕の表現のあいまいさのおかげ(?)で
いろんなコードを見ることができました。
いろんな書き方が考えられるので、例として、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つの配列から値のペアを列挙することができない」という意図で、
書いたのではなかったのですが、僕の表現のあいまいさのおかげ(?)で
いろんなコードを見ることができました。
2010年09月20日
これは反変性の例なのかな?
Microsoftのサイトにある、『連載! とことん C#』の
第 11 回 共変性 (covariance) と反変性 (contravariance) ですが、
ここの「2.共変性と反変性」で説明している反変性の例は適切なのでしょうか?
そのコードを抜粋させていただきます。
なんか、ここで説明しているコードは、反変性の例になっていないような気がするのですが...
どなたかわかれば教えてください。
僕の理解では、C#で、こんな単純なコードで反変性を説明するのは 無理なんじゃないかと...
それとも、僕が知らないだけですか?
ここの「2.共変性と反変性」で説明している反変性の例は適切なのでしょうか?
そのコードを抜粋させていただきます。
なんか、ここで説明しているコードは、反変性の例になっていないような気がするのですが...
どなたかわかれば教えてください。
僕の理解では、C#で、こんな単純なコードで反変性を説明するのは 無理なんじゃないかと...
それとも、僕が知らないだけですか?
2010年09月17日
Enum.GetValues で列挙値を列挙
という enum に対して、
と表示したいときに、どんなコードを書きますか?
以下、とあるところで見つけたコード。
ネットにはこんなコードが溢れていますが、
目にしてしまうと、書き変えなくては気が済まない悪い癖がでてしまいました。
※ あえて、URLを載せるのは控えさせていただきます。
僕なら、こんな風に書きます。
2010年09月14日
Windows7の拡大鏡のショートカットキー一覧
ちょっと調べたので、Windows7の拡大鏡のショートカットキーをここに書いておきます。
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 の拡大鏡はかなり使えます。
2010年09月12日
Triangle15パズル
久しぶりに、Gushwell's C# Programming Pageの「C#プログラム小品集」にプログラムをアップしました。
「横に並んだ2つの数の差(正数)をその下の○に入れる」という条件を満たして、○を組み合わせた逆三角形に1~nまでの数字を配置するというパズルを解くプログラムです。
Triangle15パズルというのは、僕が勝手に付けた名前です。正式な名前はわかりません。
Solveボタンを押すと、解の探索を開始し、解答を表示します。
解は2つありますが、その一つだけを表示しています。興味がある方は自力で解いてみてください。
順列を求める応用でこの問題を解いています。 ソースコードは、こちらに掲載しています。
「横に並んだ2つの数の差(正数)をその下の○に入れる」という条件を満たして、○を組み合わせた逆三角形に1~nまでの数字を配置するというパズルを解くプログラムです。
Triangle15パズルというのは、僕が勝手に付けた名前です。正式な名前はわかりません。
Solveボタンを押すと、解の探索を開始し、解答を表示します。
解は2つありますが、その一つだけを表示しています。興味がある方は自力で解いてみてください。
順列を求める応用でこの問題を解いています。 ソースコードは、こちらに掲載しています。