.NET Framework

WESL_UserSettingをC#から参照する

Windows OS 搭載端末をシンクライアント化(キオスク モード化)するようなシェルランチャーを指定する場合などには WESL_UserSetting を使用します。 これを C# の ManagementObject を通じて設定を参照する方法の紹介です。 前提条件として OS の「シェル ラ…

【C#】TimeSpanの書式指定方法

System.TimeSpan 型の書式指定の方法です。 DateTime 型とは ToString の書式の指定が異なるので同じ感覚で記述すると以下の「System.FormatException」が発生します。 // こんな感じのエラーが出る 'span.ToString(@"dd\d\a\y mm\:ss\.fff")' は型 'System.…

TweenCancelBehaviourの指定ごとの挙動

DOTween + UniTask 環境で ToUniTask に渡す TweenCancelBehaviour の識別子ごとの挙動の説明です。 前提として、DOTween を UniTask で await するときに挙動を指定する ToUniTask メソッドには TweenCancelBehaviour を渡すことでキャンセル時の挙動を指定…

【C#/Unity】A*(A-Star)で経路探索を実装する

Unity の場合、3D, 2D ともに NavMesh とエージェントを使用すれば経路探索を自力で実装する機会はないかもしれませんが、経路探索をA*(A-Star)というアルゴリズムを自分で実装する場合の考え方と実装の紹介をしたいと思います。 グリッドベースの A* の経路…

【C#】Tupleで値を入れ替える時の処理速度

かなり前に Tuple で値を入れ替える方法を紹介しましたが、普通に入れ替えるのと、Tuple を使用して値を入れ替えるので処理速度がどの程度違うのか確認します。 takap-tech.com 確認環境 確認環境は以下の通りです。 .NET6 + C# 10.0 VisualStudio 2022 Wind…

【C#】Timerで1日1回任意の時間に処理を実行する

C# で Tiemr を使って1日1回任意の時間に処理を実行する方法を紹介したと思います。 タスクスケジューラーにC#のプログラムを登録すれば、特別な実装をしなくてもOSが自動で処理を起動してくれるます。が、その手段が取れない or 長時間起動しているプロセス…

【C#】コンソールアプリでMessagePipeを使う

前回コンソールアプリ上で「Microsoft.Extensions.DependencyInjection」を使用した DI を環境を構築しましたが、今回は、この環境を使って Cysharp がリリースしているメッセージングライブラリの「MessagePipe」をコンソールアプリに導入して動作を確認し…

【C#】コンソールアプリでDIを使う

.NET 6 でコンソールアプリに DI (=Dependency Injection) 環境を作成して、オブジェクトに依存関係を注入するところまでを確認したいと思います。 使用するライブラリは、「Microsoft.Extensions.DependencyInjection」です。 確認環境 動作確認環境は以下…

【C#】連続で処理が失敗した時に何度も同じような処理をしない

例えば定周期処理などで、エラーが出ても処理を継続するような場合に、最初の一回は例外処理を行うけど、処理が連続で失敗した場合2回目以降は、処理を行わないようにする実装パターンの紹介です。 この仕組みを使用して実装例ではログを何度も出力しないよ…

【C#】ViewModelの実装をスニペットで軽減する

WPF/UWP などの XAML 系実装で使用する ViewModel は OSS(Livet, Prism ReactiveProperty) などを使用しない場合、INotifyPropertyChanged 周りの実装が冗長で、繰り返しが面倒なので軽減策の紹介したいと思います。 アプローチ方法は以下の通りです。 共通…

【C#】WMIでOSのメモリ使用量を取得する

WMI(Windows Management Infrastructure)という機能を使うとWindowsのシステムの各種情報を取得することができます。今回はこの機能を使用して 確認環境 Windows10 VisualStudio 2019 .NET Framework 4.7.2 / .NET 5 プロジェクトの設定 WMI の機能を使用…

【C#】Taskのキャンセル

C# 標準の Task のキャンセルの方法です。どちらも同じ方法でキャンセルできます。 標準で CancellationTokenSource から得られる CancellationToken を Task.Run の第2 引数に渡すことでキャンセルをハンドルできるようになります。 Taskのキャンセル stati…

【C#】INIファイルを読み書きする(DllImportなし)

INI ファイルを C# で読み書きするために DllImport で Windows の User32.dll 使うのは確かに簡単ですが汎用性に欠けると思うので、純粋な C# のみかつ、.NET 4.6 くらいからコピペで使えるライブラリを作成してみました。 ライブラリの性能 確認環境 形式…

【C#】正規表現で一致した部分を取得する

C#の正規表現で、パターンに一致した部分を取得することをグループ化する、などと呼びます。この正規表現のある条件に一致した部分を取得する方法の紹介です。 確認環境 VisualStudio2019 C# 9.0(バージョン不問 名前空間 using System.Text.RegularExpress…

【C#】DateTime.TryParseExactの使い方

すぐ忘れて何度も調べることになるのでメモ 確認環境 VisualStudio2019 C# 9.0(バージョン不問 コード例 具体的にフォーマットを指定する場合以下のように指定する bool isOK = DateTime.TryParseExact("20220413123045", "yyyyMMddHH:mm:ss", CultureInfo.…

【C#】TypeCodeを使った高速な型判定を行う?

ライブラリなどの比較的低レイヤー寄りの実装をしていると受け取った、ジェネリックな型や、object 型で受け取った変数がどの型なのかを判定するケースがありますが、タイトルの通り TypeCode を使うと Type を使った判定より、効率的かつ高速な処理にできる…

【Unity】2D用のNavMeshでTimeMap以外の領域や障害物をベイクする

2D 用の NavMesh の導入方法とタイルマップへの適用方法は記事がいくつかあるので、導入~タイルマップに適用するまでは比較的簡単にできると思います。ただ、実際にトップダウン系のゲームなどで使用する場合、障害物を設置したり経路を動的に足したりでき…

【C#】2つのキーを管理するDictionary

よく2つのキーを持つ Dictionary が必要になるときがありますが以下のように Dictionary を2重にすると「管理が面倒」「後から見たときに意味が分からない」など技術的負債になりがちです。 // 2つのキーで管理したいのでDictionaryを2重に宣言する pribate …

Dispose呼び出しを簡潔に書く

IDisposable を継承しているクラスは使い終わったら Dispose メソッドを呼び出して破棄を明示しますが using 構文の外で開放したい場合も using 構文を使って簡単に開放できます。 // こんなクラスがあったときに public class Sample : IDisposable { //...…

【C#】デリゲートの引数は呼び方でパフォーマンスが違う

引数がデリゲートのメソッドは呼び出し方がいくつかあります。書き方でコンパイラが展開する方法が異なるります。このため一部実行コストやパフォーマンスにも差が出るようなのでまとめてみました。 確認環境 この記事は以下環境で確認しています。 VisualSt…

「ラムダ式本体によるメソッドの記述」はちょっと微妙

C# 6.0 から追加された「Expression bodies on method-like members(ラムダ式本体によるメソッドの記述)」という機能ですが、これをメソッドに使うのは少し考えた方がいいという話です。この機能を利用すると以下のようにメソッドで中カッコ({})を使用…

【C#】前置・後置インクリメントの速度差

若干怪文書っぽいですが、タイトルの件を検証したいと思います。 古参のC言語系プログラマーなら一度は聞いたことがあるかもしれませんが、forループのカウンターとして使用する i や j 等の変数のインクリメントは「前置の方が高速だから前置インクリメント…

【C#】タプルの色々な宣言方法と受け取り方

C#でタプルの宣言方法と受け取る方法ですがバリエーションがいくつかあって知らないと冗長な書き方になっているときがあるので、宣言のしかたと受け取り方を紹介したいと思います。 確認環境 .NET 5, C#9.0 VisualSturio 2019 Windows 10 宣言方法と受け取り…

Teamsを退席中にしないツール作った

TeamsをはじめとするいわゆるグループウェアってしばらくPCを操作しないと「退席中」と割とすぐに表示されてしまいます。実際は作業してるのに…みたいな状態にならないように退席中になるのを防止するツールを作ってみました。MouseKeeperってツールです。 …

【C#】配列をN個に分割する

文字列をSplitで分割する処理は割と見かけますが、ある配列を複数の配列に分割する処理はあまり見かけたことが無いので書きました。 例えば10個の要素の配列を3個ずつの配列に分割して 3 + 3 + 3 + 1要素の配列に分割する場合の処理方法です。 確認環境 以下…

【C#】コレクション(リスト・配列)を安全に外部公開する

この記事は、あるクラスの中で管理しているコレクション(リスト・配列)をクラス外に渡す時に安全な渡し方の考え方や実装の紹介です。 あるクラス内で管理しているリストをクラス外に公開する場合に具体的にどういった危険性があるのか、どうすれば安全なの…

【C#】QueueとConcurrentQueueの使い方

C# で キューというデータ構造を扱う Queue<T> クラスと、スレッド排他制御機能付きの ConcurrentQueue<T> クラスの使い方の紹介をしたいと思います。 2つのQueue まず「Queue」ですが一言で言うと、入れたデータが入れた順番に取り出せる入れ物の事を指します。以</t></t>…

C#でビット操作を簡単に行うラッパークラスの紹介

例えばC#でハードウェアに近い I/O を扱う場合、1チャンネルが ushort の1ブロックの読み書きが要求されていて、各ポートはビットごとに割り当てられているなんてケースが割とありますがいちいち出力ポートの設定を読んでビット操作をしてまた書き込むなどの…

ディレクトリの中から最新の更新時刻のファイルを取得する

タイトルの通りですが、あるディレクトリ(フォルダ)の中から最新の更新時刻、つまり一番最後に内容を更新したファイルを 1件だけ取得する実装例です。 最近似たような処理を何度も書いた気がするので記事にしてみました。 確認環境 この記事は以下の環境で…

2つのファイルの内容が同じかチェックする

C#で内容を含めて2つのファイルの内容が同じかどうかをチェックする方法です。 処理の流れは、2つのファイルをファイルサイズで比較した後、内容を1バイトずつ比較しています。 FileStreamで1バイトづつ比較しているのでメモリ使用量が少なく比較的高速に動…