ITエンジニア向け 情報館  
   

 

.NET 一般

.NETフレームワークの使い方、ライブラリなど

ストリームの内容を別のストリームにコピーする

あるストリームから読み出したデータを、別のストリームに書き込む処理が、.NET4から1つのメソッドで簡単に行えるようになりました。
StreamクラスのCopyToメソッドを使えばよいとのことです。

私はストリーム間のデータ転送処理を書くことも多いので、この方法でちょっとは楽になりそうです。

【参考】ストリームを簡単にコピーするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/1047streamcopyto/streamcopyto.html

ZIPファイルを扱う

DotNetZipというライブラリを使えば、ZIPファイルを扱うプログラムをかける。
http://d.hatena.ne.jp/griefworker/20090422/1240352630

IISを操作する

C#のコードから、IISを操作するサンプルコードとその方法が紹介されています。
http://gushwell.ldblog.jp/archives/52049444.html

microsoft.web.administration.dllを参照設定することによって利用できるらしいですが、IIS7に付属しているようです。

具体的なサンプルコードが、MSDNにもあります。
http://technet.microsoft.com/ja-jp/library/ee175755.aspx

RFC非準拠のメールアドレスの扱い

.NET4では、RFCに準拠しないメールアドレス(ピリオドが連続しているメールアドレスなど)が扱えるようになっています。
対象は、MailAddressクラスです。
.NET 3.5までは、MailAddressクラスにRFCに準拠しないアドレスを指定すると例外が出ましたが、.NET4では例外が出ることなく扱え、メール送信まで行うことができるようです。
http://msdn.microsoft.com/ja-jp/library/system.net.mail.mailaddress.aspx

現在実行中のメソッド名と、クラス名を取得する方法

MethodBaseクラスのGetCurrentMethodメソッドを呼び出すことで、現在実行中のメソッド名を取得することができます。
http://msdn.microsoft.com/ja-jp/library/system.reflection.methodbase.getcurrentmethod.aspx

戻り値はMethodBaseクラスであるため、さらに以下のコードで、どのクラスのどのメソッドを実行中かも取得できます。
MethodBase.GetCurrentMethod().DeclaringType.FullName;

これを応用すれば、実行中のメソッド名などを容易にログに記録できます。
ソース中にメソッド名をべた書きしていると、メソッド名のリファクタリングを行ったときにも容易に対応できます。

CSVファイルの仕様

RFCで、CSVファイルの書式仕様について規定がある。
http://www.ietf.org/rfc/rfc4180.txt

Excelのソフトもこの仕様に沿ったフォーマットで、CSVファイルの読み込み、書き出しができます。
また、この仕様に沿って.NETアプリケーションを作る場合は、Microsoft.VisualBasic.FileIO.TextFieldParserクラスを利用すると便利です。

単体テストを複数のCPUコアで並列実行する方法

VisualStudio2010に単体テスト機能がありますが、複数のCPUコアを使って複数の単体テストを同時に並列実行する方法が書かれています。
http://blogs.msdn.com/b/kkondo/archive/2010/12/06/unittestmulticore.aspx?wa=wsignin1.0

単体テストでのHttpContextクラスの挙動

単体テスト実行中のHttpContextは、テストメソッドごとに初期化される。
そのため、[TestInitialize]のメソッドで、毎回HttpContextを初期化するロジックを入れるとよい。

HTML Agility Pack

HTMLのソースを解析し、タグの要素を抽出できるライブラリです。
http://blogs.itmedia.co.jp/tamaki/2011/04/html-agility-pa-767a.html

IMEで入力された日本語の読みを取得

http://www.atmarkit.co.jp/fdotnet/dotnettips/875imeyomi/imeyomi.html

IDisposableの実装

http://gushwell.ldblog.jp/archives/51931181.html

正規表現

パスワードとして次の要件を必要とする場合、

  • パスワードを8文字以上
  • 半角英数字以外に、キーボードから入力できる記号も許容

これを表した正規表現は次の通り。

[\w!"#$%&'()=\-~^|\\`@{[+;*:}\]<,>\.?/_]{8,}

.NETで簡単に月末の日付を求める方法

【月初/月末の日付を求めるには?[C#、VB]】

こちらのサイトにある記事で、ある月の日数(例:1月なら31、10月なら30)を求めるメソッドが、.NETで標準で用意されていることを知りました。長年.NETやってますが、これは知らなかった。
自分が負けたような気分で、悔しいです(笑)

これまで仕事上、いろんな人たちが、月末の日付を求めるオリジナルなロジックを作り込んでいる現場をたくさん見てきました。
正確に月末の日付を計算できないロジックもいろいろ見てきましたが、今後はこれを使ってもらうよう指導すれば、無駄な開発工数を削減できそうです。

かゆいところに手が届くメソッドが、意外と.NETにはたくさんあるものですね。

文字コードの判別ライブラリ

ReadJEncというライブラリが個人的には一番優秀に感じました。

ダウンロード:
https://www.vector.co.jp/download/file/winnt/util/fh702871.html

公式サイト:
https://hnx8.hatenablog.com/entry/20140824/1408844344

関連サイト情報サイト

.NETアプリ内で発生した例外をいち早くキャッチする方法

アプリ内で発生した例外を一括して処理する仕組みが.NETにはあります。
詳しくは後述のURLを見ていただくとして。

AppDomainクラスに、FirstChanceExceptionイベントというエラー処理用のイベントがあることを、恥ずかしながら最近知りました。
.NET4.0から登場したそうです。

このイベントでは、catchできなかった例外だけでなく、そもそもcatchされる直前の時点で呼び出されるイベントです。
あらゆる例外を真っ先に検知できる仕組みと言えます。

例外処理の幅が広がる一方、FirstChanceException内で例外が発生すると無限ループに陥るなど、使いどころ・使い方にちょっと工夫が必要になるようですね。

【例外をまとめてトラップするには?】
http://www.atmarkit.co.jp/ait/articles/1512/16/news026.html

コレクションクラスの処理速度比較(オーダー比較)

以下は、MSDNのサイトよりまとめたもの。

クラス List<T> Collection<T>
内部実装 配列 配列
Add O(1)またはO(n) O(1)
Count O(1) O(1)
Contains

O(n)

O(n)
Item O(1) O(1)
Remove O(n) O(n)

 

クラス Dictionary
<T>
SortedList<T> Sorted
Dictionary<T>
内部実装 ハッシュテーブル ソート済み配列 二分木
Add O(1)またはO(n) O(n) O(logn)
Count O(1) O(1) O(1)
ContainsKey O(1)に近い O(logn) O(logn)
ContainsValue O(n) O(n) O(n)
Item O(1)に近い 取得はO(logn)
設定はO(n)
O(logn)
Keys O(1) O(1) O(1)
Remove O(1)に近い O(n) O(logn)
TryGetValue O(1) O(logn) O(logn)
Values O(1) O(1) O(1)

 

アプリケーションアーキテクチャ

「アプリケーションアーキテクチャガイド」のページへのリンク
http://msdn.microsoft.com/ja-jp/architecture/gg998968

ClickOnce

ClickOnceのちょっとしたワンポイントテクニックについて書かれています。
http://blogs.msdn.com/tsmatsuz/archive/2006/08/16/701993.aspx

windowsサービス開発

効率よくWindowsサービスを開発・デバッグできるツール

.NETで開発したWindowsサービスを、簡単に動作確認、デバッグするためのツール「topshelf」がとても便利です。
詳しいことは「topshelf」で検索すれば、いろいろ出てきます。

UnicodeとシフトJISとで、文字の比較順序が異なる

二つの文字を、UnicodeとシフトJISとでそれぞれ文字コード順で比較したときに、結果は一般的に同じとは限りません。
例えば、Unicodeで比較したときあれば"本">"部"ですが、シフトJISで比較した場合は"本"<"部"となります。

逆に、文字コード順にソートされていることが分かっているが、どの文字コードでソートしているかが分からないとき、「本」「部」の2文字で比較すれば判断することが可能になります。
名づけて、「本部作戦」とでも呼ぶのがいいでしょうかね。

マルチスレッド処理

.NET4のマルチスレッド処理

.NET4では、System.Threading.Tasks名前空間にあるParallel.Invokeメソッドを使うことで、複数のメソッドを簡単にマルチスレッドで実行することができる。
ただし制限として、引数なし、戻り値voidのメソッドに限られる点に注意。

【参考】http://www.atmarkit.co.jp/fdotnet/csharp4/csharp4_02/csharp4_02_01.html

このページでは、CPUに存在するコア数を超えてマルチスレッド処理を行った場合、逆にパフォーマンスが下がることがあることも指摘している。これも合わせて参考になる。

さらに、.NETで稼動コンピュータのCPUコア数を知る方法もあるようです。
【参考】http://gurizuri0505.halfmoon.jp/20080806/2423
【参考】http://social.msdn.microsoft.com/Forums/ja-JP/netfxgeneralja/thread/eeed7149-6a36-4c64-a41f-5d93600e821a

これを併用すれば、搭載されているCPUコア数を元に最適なスレッド数で処理を実現するコードも書けそうです。

非同期メソッドを同期メソッドとして動かしたい場合

非同期メソッドに戻り値がある場合は、以下のように実装する。
参考:https://blog.takunology.jp/entry/2020/12/24/142652

return Task.Run(async () => {
return await AsyncCommand(params・・・);
}).GetAwaiter().GetResult();

非同期メソッドに戻り値がない場合は、何らかの方法があるのかもしれないがうまくいかなかった。
そこで非同期メソッドに無理やりintやstringなどの戻り値を設定させ、上記のように実装したところ、うまくいった。

HttpClientクラスでHTMLをダウンロード時、応答がなくなった場合の対処法

.NET4.5で登場した、HttpClientクラスはとても便利です。
以前はWebClientやHttpResponse/HttpRequestクラスなどを使っていましたが、それよりも格段に使い勝手がよくなっています。

ただ注意点もあります。HttpClientクラスでは非同期によるダウンロードメソッドが用意されていますが、場合によってはスレッドデッドロックが発生し、結果が返らない状態が永遠に続く、という現象に陥ることがあります。
さらに、タイムアウトを設定しても、非同期呼び出しだとタイムアウト機能が無効化されるのです。
そのため、ダウンロードメソッド呼び出し後に、結果が返ってこない、反応がない、固まった、という現象に見舞われることもあります。

私もその現象が発生しましたが、ConfigureAwaitメソッドを呼び出して解決することができました。
詳しくは、下記のサイトをご覧ください。

※「スレッド デッドロック ConfigureAwait」で検索すれば、いろいろな情報が得られます。