C#

OPC UAサーバを実装してみた

cactuaroid.hatenablog.com これの続き。チャットサーバとして、OPC UAサーバのサンプル実装をした。その際UA-.NETStandardのサンプルや各所に散らばっている資料を理解する必要があったので、それらのメモを含めて実装ガイドとしてQiitaに記事を公開した。 …

イベントハンドラで同期・非同期処理をする実装パターン

C#

イベント・イベントハンドラであっても、asyncメソッドの実装時と考え方は同じだが、イベントという皮を被ると少しわかりにくくなるのでまとめておく。 【Case 1】イベントソースは、イベントハンドラの完了を待機して抜けたい # awaitしたい? イベントソー…

ジェネリックメソッドで値型を返す時にボックス化させない方法

C#

戻り値の型がTのジェネリックメソッドを実装した時、return (T)(object)valueのようなキャストを書いてしまうと、値型ではボックス化⇒ボックス化解除が行われてしまう。そもそもこういうコードを書くならジェネリクスじゃないだろという話は置いといて、ボッ…

Dictionaryの仕組みとGetHashCode

C#

Dictionary<TKey, TValue>へ入れたり取り出したりするとき、こんな感じになっている。 参考:https://referencesource.microsoft.com/#mscorlib/system/collections/generic/dictionary.cs,bcd13bb775d408f1 もしkey1.GetHashCode()の返すハッシュが途中で変わってしまった</tkey,>…

SQL Serverの変更検出のメモ

C#

SQL Serverで特定のテーブルに変更が発生したことを検出して色々したい。できれば、どの行が追加/編集/削除されたかが欲しい。 まずクエリ通知というのが見つかる。クエリの結果に変更がある場合に通知してくれるが、どの行に変更があったのかは分からない代…

BinaryFormatterによるDeep Copyと明示的実装の違い

C#

お手軽にDeep Copyを実現するなら、BinaryFormatterが使われることがあるが、かなり処理時間がかかるため、速度を重視するなら明示的にDeep Copyを実装する必要がある。ぶら下がっている型全てで明示的に実装する必要はあるが、大抵は特に問題なく実装できる…

LINQで非同期ラムダを待機する

C#

System.Linq.Asyncのバージョン4.0.0で、LINQの各メソッドに非同期ラムダを受けて待機するバリエーションである~Awaitシリーズが追加された。以前までは自分で用意する必要があって微妙でIssueもいくつか立っていたが、パッケージに含まれるようになったの…

C#アプリのAPIをOPC UAサーバとして公開したいので下調べ

2022/12/19追記 試した結果をまとめました。 qiita.com OPC UAサーバを開発するために情報を集めた。C#アプリケーションのRPC的なAPIを公開することが念頭にあるので、C言語向けだったりPLC向けだったり情報を垂れ流すのみ系は無視している。 OPC UAサーバを…

COMポートの詳細設定画面をC#から開く

C#

COMポート番号を変更したい場合、通常は以下のようにデバイスマネージャから詳細設定画面を開く必要がある。C#のアプリケーションでRS232C接続をする場合、RS232C-USB変換アダプタを使うのが一般的だと思うが、この時COMポート番号が不定になってしまい、環…

doubleを整数部と小数部それぞれを表すintから生成する時の速さ

C#

関数の入力値の取りうるパターンが決まっているならあらかじめ計算しておくと速いよネタ。 Method Mean Error StdDev string経由 223.3938 ns 2.5656 ns 0.1450 ns 小数部を計算して加算 53.5654 ns 8.8778 ns 0.5016 ns 小数部を計算して加算2 1.3613 ns 1.…

可変型のフィールドにreadonlyをつけてはいけないのか?

C#

X DO NOT assign instances of mutable types to readonly fields. A mutable type is a type with instances that can be modified after they are instantiated. For example, arrays, most collections, and streams are mutable types, but System.Int32…

PrivateObjectExtensions 更新とNuGetで公開

ソースコードをコピペして回るのだるくなったのでdll配布するためNuGetで公開。使ってみてね! www.nuget.org cactuaroid.hatenablog.com さくっとdll作って終わりかと思いきや、思わぬ伏兵がいた。元々Microsoft.VisualStudio.QualityTools.UnitTestFramewo…

dll, exeにビルド時のパスの情報が残らないようにする

C#

dllやexeをReleaseビルドしても、アセンブリ内部にはビルド時のパスの情報が残っているのをご存じだろうか。試しにバイナリエディタで開いて、パスの一部でも検索してみてほしい。ビルド時のpdbファイルのパスが記録されている。 アセンブリを匿名で一般公開…

Functional Programming in C# のメモ

本記事はFunctional Programming in C#を読んで私が重要と感じた部分を列挙したメモです。読みながらなるほどと思った点だけを列挙するため網羅性はありません。書籍の英語は平易でコードや解説も丁寧で読みやすいので興味ある方は是非書籍をお読みください…

WPFのControlTemplateとDataTemplateの備忘録

データを表現するコントロール2種 ContentControl: 単一の内容(Content)を表現するコントロール。(例)Button Label TabItem etc. ItemsControl:コレクション(Items、ItemsSource)を表現するコントロール。(例)ListBox コントロール自体(表現する…

byte[]をstringへ高速に変換する

C#

生のバイト配列を文字列に変換したい場面は割とある。ログを残したいときとか。いくつもの方法があるようだが、単純に変換した場合と速度にこだわった実装とでどれくらいの差があるのか実際に確かめてみた。 Method Mean Error StdDev Gen 0/1k Op Gen 1/1k …

文字列挿入($"")でInvariantCultureを指定する

C#

多言語対応のアプリケーションを開発している場合に気を配らなければならないのが.ToString()などによる文字列変換時のカルチャ指定。例えば小数点はピリオドで桁区切りはカンマと思いきや、国によっては逆だったりするので要注意だ。パース時のカルチャ指定…

BinaryFormatterによる深いコピーと深い同値性判定

C#

BinaryFormatterによってあるオブジェクトのグラフ全体をバイト配列にシリアライズできることを利用して、深いコピーと深い同値性判定を実装できる。ただし対象の型には[Serializable]属性を付けておく必要がある。 例えばある状態のオブジェクトを生成する…

BinaryFormatter.Deserialize() ではコンストラクタが呼ばれない

C#

以下のコードを実行すると、デシリアライズの際にはコンストラクタを通らないことが確認できた。新たなオブジェクトを生成しているのにコンストラクタを通らないなんて! だからこそ、getterのみのプロパティも復元できてしまうのだろう。JsonConvertではこ…

resxで定義された言語リソースの値をそのキー名で実行時に差し替える

C#

resxファイルで定義された言語リソースをアプリケーションの各所で表示するが、実際に画面に表示されているのがどのキーの言語リソースなのか確認したい時がある。例えば、言語リソースの量が膨大で同じ値のキーが複数あったり、あるいは2つのキーの値が日本…

配列に対して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#もなんか怪しいし分かりにくいのが悪いんです。完全に理解するための記事を書こうと思って書き出したら、やっぱり出てくる自分がきちんと理解できていない部分。文章にまとめるの…

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) といった簡単な構成になっており、こう…