.NET Framework

【C#】指数表記の文字列をdecimal型で扱う

指数表記文字列を decimal 型に変換するための Parse メソッドを使うとエラーが発生する問題の対方法です。 // 指数表記の文字列を変換するとエラーになる string str = "-1.2345678E-07"; var value = decimal.Parse(str); // System.FormatException: '入…

【C#】Traceの出力先をファイルに変更する

Traceの出力先をファイルにしたりカスタムクラス用いて任意の出力先を設定する方法の紹介です。

【C#】ローカルで作成した待機ハンドルをサービスで使用する

ユーザーがログインしているアカウント上で起動しているソフトで生成した待機ハンドルを同じPC上のサービス (LocalSystem = NT AUTHORITY\SYSTEM) 上で利用する方法の紹介です。

【C#】ファイルを別の場所に書き出してから保存する

既存のファイルに内容を書きこむ時に、直接対象のファイルを開いて書き込みを行うとアプリが強制終了するなどでストリームが異常終了するとファイルの内容が破損する場合があります。この問題を避けるためには以下のアプローチが必要です。 直接ファイルを開…

【C#】UTF-8のBOMあり/BOMなしの指定

UTF-8はBOMの有無があり時と場合によって適切に選択する必要があります。 // BOMあり Encoding bom = System.Text.Encoding.UTF8; // BOMなし Encoding withoutBom = System.Text.UTF8Encoding(false); 取得方法に対称性が無いのが気になるので Utility 化し…

【C#】コマンド実行用のバッファリングキューを実装する

バッファーがいっぱいになるまではデータをバッファリングをしながらバックグランドで1つずつ順番にデータを処理して、バッファーがいっぱいになったら空きができるまで待機となるコマンド実行用のデータキューイングクラスの実装例の紹介です。 確認環境 .N…

【C#】一定時間経過すると削除されるリストの実装

何の役に立つかはわかりませんが、一定時間経過したら削除されるリストを実装しててみました。 確認環境 .NET 6 VisualStudio 2022 実装コード 規定では Add(...) した後に、5秒以内に TryGetItemAndRemove() でデータを取り出されなければバックグラウンド…

【C#】Fisher-Yatesを使って配列/リストをシャッフルする

Fisher-Yates(フィッシャーイェーツ)というアルゴリズムを使って配列やリストを並び替えたいと思います。 アルゴリズムの考え方ですが N 個の要素数があったとして 一番最後の要素 (N) をそれ以外の前方の要素とランダムに交換する 一番最後から -1個目を…

【C#】オープン中のファイルの内容を読み取る

何度も何度も調べなおしてるので自分用のメモです。 他のプロセスが開いているファイルを開こうとすると以下のエラーが発生する。 System.IO.IOException: 別のプロセスで使用されているため、プロセスはファイル 'xxxx' にアクセスできません。 以下のよう…

【C#/Unity】重み付き抽選機能を実装する

よくある重み付きの抽選機能の実装例の紹介です。 重み付き抽選とは要素ごとに選ばれる確率が違う抽選方法です。 例えば以下のように各々確率が違うものをランダムで選びます。 Aは50% Bは25% Cは20% Dは5% 確認環境 使い方 実装コード 確認環境 Unity 2022.…

【C#】ListをAsSpanしたい

ハック的な手法で List に AsSpan の拡張メソッドをは生やすことができますが、.NET5からは標準ライブラリでサポートされたので両対応してみます。 public static class ListExtensions { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static…

【C#】アプリを多重起動しないようにする

Mutex を取得して新規に作成できれば新規の起動、取れなかったら 2つめの起動という感じに判断できます。 string key = "application_name"; using (var mutex = new Mutex(true, key, out bool createdNew)) { if (!createdNew) { return; // 多重起動にな…

【C#】enumのメンバーに任意の番号を振る

enum は宣言した順に数字が自動で振られています。 以下の例だと Apple=0, Banana=1 といように自動でインクリメントされた数字が割り当てられます。なのでメンバーを途中に追加すると数値が変わってしまいます。 public enum Type { Apple, // 0 Banana, //…

【Unity】ExcelのデータをScriptableObjectに取り込む

Excel で管理しているゲームデータを自作のプログラムを使って ScriptableObject にインポートする方法を紹介したいと思います。 これ系は既にライブラリとかアセットが色々と配布されていて、それらを使用したほうが時間の節約になると思いますが、今回はを…

【C#】正規表現で小数文字列をマッチする

小数文字列は書き方が複数ありますが、それらを正規表現でマッチさせたりマッチした文字列を取り出す方法を紹介したいと思います。 小数の表記方法の確認 小数は以下のように表現されます。 123.456 / +123.456 -123.456 .456 / +.456 -.456 1.23e5 / 1.23E5…

【C#】インスタンス作成速度の比較

C# で数通りあるインスタンス作成方法の処理速度の比較です。 前提条件・環境 環境は以下の通り Visual Studio 2019 + .NET Core 3.1 Windows10, Releaseビルドをコンソールから実行 動作検証 検証は BenchmarkDotNet を使用して検証は以下の通り実行します…

【C#】Windowsで使用できるファイル名かチェックする

C# で Windows 上で使用できるファイル名かどうかをチェックする実装です。 using System.IO; using System.Text.RegularExpressions; public class WindowsFileSystem { // 使用禁止文字 static readonly char[] invalidChars = Path.GetInvalidFileNameCha…

【C#】NuGetパッケージを再インストールする

環境 Windows10 VisualStudio 2019 状況 以下でパッケージのキャッシュをクリアしたらエラーが出て「発行」できなくなった。 ツール > オプション > NuGet パッケージ マネージャー > すべての NuGet キャッシュをクリア 次に、Webプロジェクトを発行すると…

【C#】BenchmarkDotNetを使って処理時間を計測する方法

C# の処理の実行時間の測定やメモリ使用量、GCの量を正確に計測できるライブラリ「BenchmarkDotNet」の最速セットアップ & 使用方法の紹介したいと思います。実行時間を測定するために Stopwatch クラスを使用する方法もありますが、このライブラリを使った…

【C#】ExceptionのMessageを後から変更する

C# でいちど作成した Exception の Message プロパティは get のみで後からメッセージを変更することができません。 今回は一度作成した Exception オブジェクトの Message を変更したいと思います。 確認環境 VisualStudio 2022 .NET 6 IDE上からDebug実行…

【C#】オブジェクトにクラスが継承されているかどうかを調べる

あるオブジェクトに特定のクラスやインターフェースが継承されているかどうかを調べる処理方法は以下の通りです。 public static bool IsInherited1<T>(object obj) where T : class { return (obj as T) != null; // ★(1) asで変換できるかどうか調べる } publ</t>…

【C#】ジェネリックが推論できないコード2選

C# の型推論は大抵の場合型を推定してくれてジェネリックの型も推論で省略することができます。 特にジェネリックパラメータを推論によって省略できるため、メソッド使用時に型を書く手間がなくなり、コードの見た目もかなりすっきりできます。が、ごく一部…

【Unity】デリゲートを指定するときにGCAllocを減らす

あるメソッドの引数にデリゲートが必要な場合、GC Allocationを減らす方法の紹介です。 以下状況での GC Alloc が発生する話になります。 public static class SampleUtility { // デリゲートを引数に取るメソッド public int Execute(Action<int> method) { ... </int>…

VisualStudioとC#バージョンの関係性

だんだん状況が変わってきたのでメモ。 2023年3月現在、.NET のバージョンと C#、VisualStudio の対応関係は以下のような関係性になっています。 .NET ver. C# ver. VisualStudio .NET 7 C# 11 2022 .NET 6 C# 10 2022 .NET 5 C# 9.0 2022, 2019 .NET Core 3…

【C#】文字列から一部分を取り出す(Substringの使い方)

C# で文字列から一部分を取り出す処理は Substring メソッドを使用します。 この記事では、SubString の使い方と注意点、便利な使い方を紹介したいと思います。 確認環境 .NET 6 VisualStudio 2022 Windows 11 この記事は C# であればどのバージョンでも使用…

【C#】タスクトレイに常駐するアプリの実装Tips

Windows Forms で作成したソフトをタスクトレイに常駐させてメインウインドウを表示しないときの実装方法の紹介です。 条件は以下の通り。 Windows Forms タスクバーにアイコンを表示しない タスクトレイの常駐させる 起動したときにウインドウ(フォーム)を…

【Unity】Vector3(構造体)に自分自身の値を変更する拡張メソッドを定義する

Unity の Vector3 (Vector2 など構造体)に自分自身を書き換える処理を追加する拡張メソッドの定義方法の紹介です。 前提として以下のように Vector3 に拡張メソッドを定義して値を変更しようとしても値は変わらない事を確認します。 public static class Vec…

【Unity】メモリの改ざんを防ぐ機能を実装する

アプリなどでメモリ上に保持してる値って外部ツールで割と簡単に読み取ったり変更されてしまうんですよね。変更したときにどのアドレスに保存されているみたいな位置を特定されると実行中に値を書き換えられてしまいます。 そこでこれらの行為を防止するため…

【C#】メモリにファイルの内容を展開せずにAESで暗号化する

以前にデータを AES 暗号化する方法を紹介しましたが、実装例が何らかのデータをアプリのメモリ上に byte 配列として全部に読み取った内容を展開してから AES 暗号化する方法でした。 この方法だと、例えば 1GB のファイルを暗号化しようとすると1GBぶん全て…

【Unity】パララックス(多重スクロール)を実装する

Unityの2Dの表現で視差の効果を使ったパララックスのスクロール(Parallax)を実装例を紹介したいと思います。かつてレトロゲームの背景スクロールでよくありましたね。 この表現方法は、スクロールの速度が奥のほうがゆっくりで手前ほど早くスクロールする…