2009年06月30日

ManualResetEvent の簡単なサンプル

   このエントリーをはてなブックマークに追加 Clip to Evernote
ManualResetEvent の簡単なサンプルです。


button2をクリックすることで、ThreadProc内の処理が進みます。
  

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

2009年06月28日

Stopwatch.ElapsedTicksから秒数を求める

   このエントリーをはてなブックマークに追加 Clip to Evernote
Stopwatchクラスには、ElapsedTicksプロパティがありますが、この値はどうもピンときません。
秒数を知りたいときには、Frequencyプロパティを使い、


とします。これで正確な秒数を得ることが可能です。

Frequencyは、1秒間あたりのタイマ刻みの数を示すので、ElapsedTicks(タイマ刻み回数)を Frequencyで割れば、秒数を求めることができるわけです。

ただ、通常はあまりにも小さな値になっちゃうので、マイクロ秒(μs)とかに変換したほうが良いかもしれません。

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

2009年06月27日

メルマガ:C#プログラミングレッスン 読者数1800名突破

   このエントリーをはてなブックマークに追加 Clip to Evernote
メールマガジン「C#プログラミングレッスン」の読者数が1800名を突破しました。

メールマガジンを発行した当初は、まさかこんなに長く続けるとは思っていなかったし、読者数がここまで増えるということも予想していませんでした。
購読してくださっている皆さん、ありがとうございます。
感謝です。

現在は、初心者向け記事「C#入門編 2nd」を連載中です。
この連載終了後は、「FxCopに学ぶ編」を開始する予定です。開始はたぶん8月中ころかな。
  
Posted by gushwell at 15:04Comments(0)TrackBack(0)

2009年06月24日

スレッド プールに許可されるワーカー スレッドの最大数

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

「スレッド プールに許可されるワーカー スレッドの最大数」 と「スレッド プールに許可される非同期 I/O スレッドの最大数」

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

2009年06月21日

カリー化について考えてみる

   このエントリーをはてなブックマークに追加 Clip to Evernote
もうひとつのブログ Gushwell's F# Programming Diary に「F#: カリー化と部分適用をC#で考えてみる(1)」を掲載しましたが、F#に興味のない方は、読んでいないと思うので、こちらのブログにもアップします。

多少、文言を変えていますが、内容は同じものです。

----------

関数 f(x,y) をカリー化するとは、関数 g を

が常に成り立つ関数にすることです。

関数gの引数は、x ひとつです。xは、元の関数 f の最初の引数ですね。
関数gの戻り値は、「元の関数 f の残りの引数を取り、fと同じ型の結果を返す関数」です。つまり、戻り値は関数です。
この、カリー化の定義を、もうすこし、わかりやすいC#風のコードを使って書きなおすと、

というコードで、常に、"a == b"が表示される 関数 g を定義することが、カリー化するということになります。
----------

一応、カリー化の定義が理解できたところで、具体的な例で考えてみます。


というメソッドを例に考えると、カリー化した関数は、

となります。
いきなり、結論から入ってしまいましたが、これを噛み砕いて説明しましょう。
CurriedSum関数は、x を引数として受け取ると、

という「デリゲート (ラムダ式)」を返しています。デリゲートというのは関数のことだと思ってください。
ラムダ式がよくわからないという方は、僕のBlogのここ「ラムダ式」を読んでみてください。

この「関数」を返すというのがこのCurriedSum関数の肝です。 なので、CurriedSum(10) と呼び出すと、

というデリゲート(int y を受け取り、10+y の結果を返す関数)が返ってきます。
なので、このカリー化した関数の使い方は


となります。引数が2つあったのが、一つずつ与える形に変更されたのがわかると思います。
つまり、

が成立したということです。
カリー化した関数は、こんな書き方もできます。

これで面白いのは、

などと書けることです。最初の 10 という引数をずーっと保持し続けることができます。
ということは、

のように、インクリメントする関数を定義することができます。
このように、カリー化した関数を呼び出し、あらたな関数を得ることを部分適用といいます。

関数型言語ではよく使われるみたいですが、普通のC#プログラマーは、こういったコードはまず書かないと思います。
なので、僕も、どう便利なのかがいまいち実感がありません。
  
Posted by gushwell at 21:56Comments(0)TrackBack(0)

2009年06月19日

自動的に名前が付けられたデータベースをアタッチできませんでした

   このエントリーをはてなブックマークに追加 Clip to Evernote
しばらく前から、Visual Studio 2008 の動作がおかしいです。
NORTHWND.MDFをサーバーエクスプローラから、 「Microsoft SQL Server データベース ファイル (SqlClient)」で接続しようとすると、

ファイル D:\...\NORTHWND.MDF の自動的に名前が付けられたデータベースをアタッチできませんでした。同じ名前のデータベースが既に存在するか、指定されたファイルを開けないか、UNC 共有に配置されています。

というエラーが出て、接続できなくなってしまいました。
不思議なことに、このファイルを Northwnd.mdf と大文字から小文字へリネームすると、接続ができます。

プログラムからの実行でも、同様のエラーが発生し、リネームすると接続できます。
もちろん、SQL Server Management Studio からは、問題なくアタッチできます。

SQL Server側の環境がおかしくなってしまったのか、それとも、.NET Framework側の環境なのか?
何が悪いのかさっぱりわかりません。
OSから再インストールするしかないのかな。   
Posted by gushwell at 22:35Comments(6)TrackBack(0)

2009年06月17日

C#で高階関数

   このエントリーをはてなブックマークに追加 Clip to Evernote
Gushwell's F# Programming Diary で、高階関数のことについて書きましたが、 C#でも、と思って、はてなキーワード 高階関数 のページにあるコードを C#で書いてみました。


となる関数 f を定義するというものです。


とこんな感じでしょうか?

これを使った例を以下に示します。


  
Posted by gushwell at 21:56Comments(0)TrackBack(0)

2009年06月10日

Decimalは、プリミティブではない

   このエントリーをはてなブックマークに追加 Clip to Evernote
このコードを実行しても、uncheckedが有効に働いてくれずに、
「Decimal 型の値が大きすぎるか、または小さすぎます。」
というOverflowException例外が発生してしまいます。

decimalは、CLRが直接演算できるプリミティブな型ではないためのようです。
実際に、以下のコードを実行してみると、


decimal型では、falseが表示され、IsPrimitive プロパティがfalseであることが分かります。
※実際には、decimalの演算で、uncheckedをしたいという要求はないのですが、興味があって試してみました。


ちなみに、C#では、uncheckedがデフォルトなので、intやlongの演算でoverlfowが発生しても例外が発生しません。
例外を発生させたいならば、

のように、checkedで囲む必要があります。
  
Posted by gushwell at 21:49Comments(2)TrackBack(0)