配列に対してContains()を呼ぶとIEquatable.Equals()が使われない

C#

Enumerable.Contains<T>()の実装は以下のようになっていて、sourceがICollection<T>を実装していたらICollection<T>.Contains()が呼ばれ、実装していなかったらEqualityComparer<TSource>.Defaultで比較される。EqualityComparer<TSource>.Defaultはsourceの要素がIEquatable<T>を実装して</t></tsource></tsource></t></t></t>…

IEquatable完全に理解した

C#

qiita.com Advent Calendar初参加でした。 公式のガイドラインもEffective C#もなんか怪しいし分かりにくいのが悪いんです。完全に理解するための記事を書こうと思って書き出したら、やっぱり出てくる自分がきちんと理解できていない部分。文章にまとめるの…

「集約の境界と整合性の維持の仕方に悩んで2ヶ月ぐらい結論を出せていない話」の感想

kbigwheel.hateblo.jp こちらの記事の感想。 私の感覚では以下のような構造になって、整合性境界とか気にするような話ではないように思えてよくわからない。リポジトリに永続化に関わらないビジネスロジック持たせるのは変だし、説明を読む限り組織がユーザ…

WPF + gRPCでチャットサーバ・クライアントの実装

gRPCのお試し実装として、チャットサーバ・クライアントを作った。せっかくなのでヘキサゴナルアーキテクチャ。 github.com .protoファイルのサービス定義はこれ。すべてのRPCをクライアント側から要求するため、サービスはクライアント視点でのメソッドとし…

BenchmarkDotNetの概要

C#

github.com .NETアプリケーション用の標準ベンチマークパッケージ Stopwatchでログ吐くより信頼性高い JIT・GC・CPU動作クロックなどによる結果のばらつきを極力排除(たぶん) こんな感じ Method Mean Error StdDev Scaled Allocated Dictionary 145.376 ns…

非同期ストリームを扱うときはRxとIx-Asyncを使い分ける

C#

非同期ストリーム(=非同期シーケンス)を扱うならRx(System.Reactive)となりがちな昨今、Ix-Async(System.Interactive.Async)も道具箱に入れておいて適切に使い分けるのがいいのではという話。 Rxの解説において、IEnumerable<T>はpull型でIObservable<T>はp</t></t>…

ちょっとだけStatic Type Cachingのパフォーマンス確認

C#

CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する p.43からの部分のパフォーマンス比較を自分でやってみた。 Method Mean Error StdDev Allocated Dictionary 145.243 ns 3.6203 ns 0.2046 ns 0 B Cache 1.409 ns 0.1900 ns 0.0107 …

IDisposableの典型実装とコードスニペット

C#

(2020/5/10追記) 最新のVisual StudioではIDisposableの実装テンプレートをクイックアクションで生成できるようになっているので、コードスニペットを自前で用意する必要はありません。 stackoverflow.com この投稿が非常に分かりやすく参考になった。特に…

IEquatable<T>の典型実装とコードスニペット

C#

2018/12/15追記 こちらにまとめなおしたので参照してください。 qiita.com IEquatableの実装はややこしく、どうすればよいのかの情報が散乱していてよく混乱してしまうので、考慮もれなくきちんと実装できるようコードスニペット*1にまとめてある。ガイドラ…

簡単なGetHashCode()の実装例とパフォーマンス比較

C#

追記:Visual Studio 2017・ReSharperで自動生成できるので、もはや自動生成一択。 Generate C# Equals and GetHashCode Method Overrides - Visual Studio | Microsoft Docs stackoverflow.com stackoverflow.com IEquatableを実装した時にGetHashCode()を…

WPFアプリのMVVM構造の設計時に留意すべきこと

WPFアプリケーションでMVVMで実装するサンプルはネット上に数多くあるが、その多くは ウィンドウ 1つ(MainWindow.xaml) ビューモデルクラス 1つ(MainWindowViewModel.cs) モデルクラス 1つ(MainWindowModel.cs) といった簡単な構成になっており、こう…

MVVM + ヘキサゴナルアーキテクチャ + Entity Framework

WPFアプリケーションではMVVMのレイヤ化アーキテクチャがよく採用される。MVVMはGUIアーキテクチャの1つであり、 ビュー層 ビューモデル層 モデル層 の3層を考える、ビューにフォーカスした考え方である。したがって、例えばDDD(ドメイン駆動設計)における…

Visual StudioでProtocol Buffersを試す

Protocol Buffers使うなら.protoファイルでスキーマ定義してなんぼ*1ということでそうするが、protocで一々コンパイルとかはありえないのでVisual Studioに以下のカスタムツールを追加。 marketplace.visualstudio.com プロジェクトにNuGetで以下をインスト…

非同期イベントハンドラの完了をイベント発行元で待機する

C#

普通にEventHandlerを使ってイベントを実装すると、非同期のイベントハンドラを登録してもInvoke()で完了を待機できない。 Before Invoke After Invoke 1 EventHandlerはvoid型のdelegateなので待機できない。 全ての非同期のイベントハンドラの完了をイベン…

外からThread.Abort()されてもfinally句は最後まで実行される

C#

Reference Source見ていて面白いコードを見つけた。 https://referencesource.microsoft.com/#mscorlib/system/threading/timer.cs,562 // prevent ThreadAbort while updating state try { } finally { // 途中で止めたくない処理 } 試してみると確かにThre…

PrivateObjectExtensions

C#

github.com 作った。 ユニットテスト書いている時、実際の型と見えている型が違うとか同じとかを気にせずにprivateメンバにアクセスしたいことがよくある。Moqでモック作った時とか、基底クラスの型でオブジェクトを扱っている時とか。staticかどうかも気に…

MEFでImportしているメンバをモックに差し替える

C#

github.com C#でMEF使っているコードで、ユニットテストでMoqを使ってモックに差し替える話。 [Export] public class Test1 { [Import] private Test2 m_test2; public Test1() { } } [Export] public class Test2 { [Import] private Test1 m_test1; public…

Windows10でスタートメニューが表示されなくなったらまず完全シャットダウンを試す

Windows7からWindows10にアップデートしてから数日経ち、急にスタートメニューが表示されなくなりました。ググってみると同様の症状は結構発生しているようで修復やらの方法が色々出てきますが、その前にまず完全シャットダウンを試しましょう。私はこれだけ…

DVDを入れるとドライブが表示されなくなる

PC

USB接続の外付けDVDドライブを使っていますが、USBを接続した時点ではエクスプローラ上にドライブが表示されるのにDVDを入れると消える現象に悩まされました。 原因はPC前面のUSBポートに接続していたことでした。前面のUSBポートはマザーボードからケーブル…

C#でのイテレータパターン

1. Iteratorパターン 1 | TECHSCORE(テックスコア) これをC#で書く。イテレータはC#だとIEnumerator<T>なので、イテレータパターンはIEnumerable<T>を実装するパターンということになる。 public class MyStudentList : StudentList, IEnumerable<Student> { public MyStude</student></t></t>…

List<T>の列挙方法による速度比較

C#

追記:以下ではStopwatchで実行時間を計測しておりあまり適切ではありませんが、BenchmarkDotNetで再計測したところおおむね同じ結果となり、傾向としては間違っていないと考え、書き直しはしていません。 List<T>に対してforeachのようなことをするには、いく</t>…

テスト駆動開発をどう使うか

テスト駆動開発(TDD)についてのお勉強と考察。 「本実装の前にユニットテストを書く」というルールを自分に課して開発してみたことは何度かあるが、ユニットテストをどう書くかということも関係してそう単純なものではないことは肌で感じており、今回TDDの…

i5 4690Kのオーバークロック

PC

Core i5 4690Kを常用オーバークロックしました。 目的 ゲーム時のパフォーマンスを向上したい アイドル時は消費電力を抑えたい 方針は、Turbo Boostの上限を3.9GHzから引き上げることに。アイドル時についてはいじらないことで非OC時と同じ消費電力に抑えま…

リモートデスクトップ接続でMicrosoftアカウントを指定する

私はWindows 10にログオンする際にMicrosoftアカウントを使用していますが、リモートデスクトップ接続する際にアカウント名をどうすればよいのかちょっと迷いました。 アカウント名:MicrosoftアカウントのEメールアドレスパスワード:Microsoftアカウントの…

ゲーミングPC購入

PC

数年ぶりにゲーミングPCを組みました。最初はBTOにするつもりが、良いのが見つからず結局自作することに。1ヶ月ほど使ったのでレビューします。 M/B: MSI - Z97 PC MATE ($90.99) CPU: Intel - Core i5 4690K ($217.99) CPUクーラー: V3 Components - Voltai…

Windows 10でサインインに使用するMicrosoftアカウントを変更

早速Windows 7からWindows 10にアップグレードしてみました。初回設定時にサインインアカウントとしてMicrosoftアカウントを設定したのですが、その後別のMicrosoftアカウントに変更したくなりました。 設定メニューからアカウントの設定を開きます。どこに…

インストーラでデバイスドライバをインストールする

WiX

環境:Visual Studio 2012 Professional、Wix Toolset 3.6 インストーラにデバイスドライバを追加するには Driver Element (Difxapp Extension) を使って以下のように書きます。 <Wix xmlns='http://schemas.microsoft.com/wix/2006/wi' xmlns:difx='http://schemas.microsoft.com/wix/DifxAppExtension'> </wix>

32bit・64bitのインストーラをまとめて作る

Wix

環境:Visual Studio 2012 Professional、Wix Toolset 3.6 状況: 開発しているアプリ群は複数のソリューションで構成される。 複数のアプリを1つのインストーラで配布する。 1度のビルドで32bitOS向けと64bitOS向けの両方のインストーラを作成する。 一部の…

NuGetでパッケージのアンインストールのエラー

VSの「NuGetパッケージの管理」でプロジェクトで使用しているパッケージをすべて更新したところ、画面下部に「1つ以上のパッケージを完全にアンインストールできませんでした。再起動してアンインストールしてください。」というようなエラーメッセージが表…