はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

C#

【C#】unsafeを用いずにReadOnlySpan<char>からSpan<char>に変換をして中身を好き勝手にいじる

C#

はじめに 今回はunsafeを用いずにReadOnlySpan<Span>からSpan<char>に変換する方法について紹介をしたいと思います。 ReadOnlySpan<char> str = "hello, world"; var span = MemoryMarshal.CreateSpan(ref MemoryMarshal.GetReference(str), str.Length); // unsafe使わずとも</char></char></span>…

【C#】Unsafe.WriteUnalignedとMemoryMarshal.GetReferenceとSpanを組み合わせてメモリのコピーを行う

C#

はじめに 今回はUnsafe.WriteUnalignedとMemoryMarshal.GetReferenceとSpanを組み合わせてメモリのコピーを行ってみようという記事になります。 // サンプルコード public static void Main(string[] args) { int value = 999; // 231, 3, 0, 0 Console.Writ…

【C#】64ビットの擬似乱数生成器"Splitmix64"を実装してみる

C#

はじめに 今回はSplitmix64という擬似乱数生成器をC#で実装してみようという記事になります。 はじめに 概要 実装 参考 概要 Splitmix64は64ビットの高速な疑似乱数生成器です。C#で64ビットの型はlongやulongとかですね。 64ビットの状態のみを使用した非常…

【C#】MemoryMarshal.Castを利用してある型の配列を他の型の配列に変換をする

はじめに 今回はMemoryMarshal.Castについて取り上げたいと思います。learn.microsoft.com // int[]からbyte[]に変換を行うサンプルコード // 変換前:int[] (intは4バイト) Span<int> from = Enumerable.Range(int.MaxValue - 5, 5).ToArray(); // 変換後:byte[</int>…

【Rider】メソッド抽出(extract method)というリファクタリング機能がとても便利

はじめに 今回はメソッド抽出(extract method)というRiderのリファクタリング機能について紹介したいと思います。pleiades.io メソッドの抽出をしている様子 はじめに 概要 やり方 メソッドの抽出 ローカル関数の抽出 概要 Riderのメソッド抽出を利用するこ…

【Unity】Unity Test Frameworkでログ出力のテストをする方法(特にDebug.LogError, Debug.LogException)

はじめに 今回はログ出力のテスト方法について紹介をしようと思います。 ログ出力をしている例 はじめに 概要 テスト方法 概要 Unity Test FrameworkではDebug.LogErrorやDebug.LogExceptionが実行されるとテストが失敗になる仕様にデフォルトでなっています…

【Unity】コンパイル後のdllに対してリフレクションを利用せずにasmrefを使ってinternalにアクセスする方法(必ずできるわけではない)

はじめに 今回はコンパイル後のdllに対してリフレクションを利用せずにasmrefを使ってinternalにアクセスする方法について紹介したいと思います。この記事を見ている方ならasmrefについての説明は大丈夫かと思いますが、一応前書いておいた記事を貼っておき…

【C#】XMLタグのseeタグを用いてコメント内からリンクを生成する

C#

はじめに 今回はXMLタグのseeタグについて取り上げたいと思います。 /// <summary> /// <see cref="HogeClass"/>はとても凄いクラスです。 /// </summary> public class SampleClass seeタグを利用している様子 はじめに 概要 書き方 参考 概要 XMLタグのseeタグを利用することで、テキスト内からリンク…

【C#】string-interpolation(文字列補間)がC#10.0からboxingが発生しないようになる修正が入ったらしい(DefaultInterpolatedStringHandler)

C#

はじめに 今回はstring-interpolationの実態がどうなっているかについて取り上げたいと思います。 var x = 10; var y = 20; var str = $"{x}, {y}"; はじめに C#9時点 defalt(C#10.0以上) Unityとの関係性について C#9時点 SharpLabにて先ほどのコードをC#9…

【Rider拡張機能】XML Doc Inspectionsを導入して XML Doc commentの警告を出す範囲を指定する(Unityでも有用)

はじめに 今回はRiderの拡張機能であるXML Doc Inspectionsについて紹介したいと思います。 A simple ReSharper extension which enables to show warnings for missing XML Doc comments for types and type members. In contrast to the C# compiler's CS1…

【Rider】RiderにHeap Allocations Viewerを導入してヒープアロケーションを可視化する(Unityでもオススメ)

はじめに 今回はHeap Allocations Viewerについて取り上げたいと思います。 This plugin statically analyzes C# code to find all local object allocations happening.It can be used to reduce number of heap allocations in hot paths of your C# progr…

【C#】ref構造体(ref struct)の特徴・制約について

C#

はじめに 今回はref構造体(ref struct)について取り上げたいと思います。 ref 修飾子は、構造体型の宣言内で使用できます。 ref struct 型のインスタンスはスタック上に割り当てられます。マネージド ヒープにエスケープすることはできません。 learn.micros…

【C#】Dictionary, HashSet, Hashtable, SortedDictionary, SortedSetの違いをそれぞれ解説(ハッシュテーブル or 2分探索木)

C#

はじめに 今回はDictionary, HashSet, Hashtable, SortedDictionary, SortedSetという似たようなコレクションについて取り上げたいと思います。 はじめに データ構造 使用例 HashSetとDictionaryの違い Hashtable SortedDictionaryとSortedSetの違い 参考 デ…

【C#】ハッシュ関数MD5, SHA1, SHA256, SHA384, SHA512の使い方まとめ

C#

はじめに 今回はハッシュ関数について取り上げたいと思います。そもそもハッシュ関数(ハッシュアルゴリズム)ってなんやねんと思う方もいると思うので引用を載せておきます。 ハッシュ アルゴリズムは、任意の長さのバイナリ値を、ハッシュ値と呼ばれるより小…

【C#】2次元配列でループを回す際にアクセス順序によって速度に違いがでるらしい(行優先)

C#

はじめに 先日ネットサーフィンをしていたところ、以下の記事を見つけました。daeudaeu.comC言語だと以下のコードに違いがでてくるそうです。 // こっちは低速 for(x = 0; x < 4096; x++){ for(y = 0; y < 4096; y++){ array2[y][x] = array1[y][x]; } } // …

【C#】C#9.0から登場したコンストラクタ・オブジェクト初期化子のみで変更可能なinitアクセサーについて

C#

はじめに 今回はC#9.0から登場したinitアクセサーについて取り上げたいと思います。 learn.microsoft.com はじめに 概要 サンプルコード 参考 概要 initアクセサーを用いることでコンストラクタもしくはオブジェクト初期化子のときのみ変更できるようにでき…

【C#】配列のインデックス・範囲の指定方法まとめ

C#

はじめに C# 8.0からa[^1]やa[1..2]といった記法が使えるようになりました。learn.microsoft.comただ私は未だにこれどこ指しているんだっけとなってしまうので、備忘録的な意味合いも兼ねて一覧としてまとめておきたいと思います。 はじめに インデックスの…

JetBrains Rider2022.3.2で「ReSharper Host Connecting to ReSharper Host...」から進まないときの対処法

はじめに JetBrains Rider2022.3.2を利用していたら、突然以下のようなエラーが表示されインテリセンスが効かなくなってしまいました。 Connecting to Reshaper Host ReSharper Host Connecting to ReSharper Host... 一応解決できたので備忘録の意味合いも…

【C#, Unity】ValueTask.AsTaskを利用してValueTask<TResult>からTask<TResult>に変換をする

C#

はじめに 今回はValueTask.AsTaskメソッドについて紹介をします。learn.microsoft.com はじめに 説明 説明 AsTaskを実行すると以下の挙動になります。 この ValueTask でラップされる Task オブジェクト (存在する場合)、または、結果を表す新しい Task オブ…

【Unity】UniTask-Supplementを用いてUniTaskのCancellationTokenを渡す記述を簡素化する

はじめに 今回はUniTask-SupplementというUniTaskのCancellationTokenを渡す記述をより簡単にしてくれるライブラリについて紹介をしたいと思います。github.com github.com はじめに 導入方法 使い方 基本 新しく実装されたメソッド WhenAnyでCancellationTo…

【Unity】Unity 2023.1より登場したAwaitableの使い方まとめ(Unity公式版UniTask??)

はじめに ついにUnity2023.1よりUnity公式版UniTaskが出ました。(結構語弊がありそうだか...)github.comただ現段階ではUniTaskと同等・もしくはそれ以上な機能を持っているわけではなく、軽く触った限りはまだまだAPIが足りず発展途上かなといった感じです。…

【Unity】 「ValueTaskSupplement」でValueTaskに対してWhenAny, WhenAllを適応する

はじめに 今回はValueTaskに対してWhenAny, WhenAll, Lazyを適応できるようにするValueTaskSupplementについて紹介したいと思います。github.comまたLazy(AsyncLazy)に関しては、私自身ちゃんと理解できていなくこの記事には書かないので注意してください。 …

【C#, Unity】Regex.Matchはインスタンスメソッドを使うとGC.Allocと処理速度の面で有利

はじめに Regex.Matchには静的メソッドとインスタンスメソッドが存在します。 // 静的メソッド Match match = Regex.Match("An extraordinary day dawns with each new day.", @"\ba\w*\b"); // インスタンスメソッド Match match2 = new Regex(@"\ba\w*\b")…

【Unity】コルーチンでタスクをyiled returnしようとすると1フレームだけ待つという罠(UniTask.ToCorouine推奨)

はじめに コルチーンの中でTaskを待つために以下のようなコードがあったとします。 private IEnumerator SampleCoroutine() { Debug.Log("Start Task"); // 1フレームだけ待つことに注意 yield return SampleAsync(); Debug.Log("EndTask"); } private asyn…

【C#】System.Lazy<T>を用いてスレッドセーフな遅延初期化を行う

C#

はじめに 今回はSystem.Lazy<T>について取り上げたいと思います。learn.microsoft.com はじめに 概要 使い方 概要 System.Lazy<T>を使うことで、スレッドセーフな遅延初期化をすることができます。 遅延初期化のサポートを提供します。 遅延初期化を使用して、大規</t></t>…

【Unity】ZStringを導入してマネージドヒープへのアロケーションを削減する

はじめに 今回はZStringという文字列生成におけるGC.Allocをゼロにするライブラリについて紹介したいと思います。 今回、文字列生成におけるメモリアロケーションをゼロにする「ZString」というライブラリを公開しました。 ZString – Unity/.NET Coreにおけ…

【C#, Unity】C#7.0から導入された「ValueTask<TResult>」を利用してヒープアロケーションを減らしたかった(実験付き)

はじめに 今回はC#7.0より導入されたValueTask<TResult>について取り上げたいと思います。 learn.microsoft.comまずValueTask<TResult>の説明の前に、Task<TResult>を利用した非同期処理には以下のような問題点が指摘されていました。 非同期メソッドでも同期処理になる場合が多い Task</tresult></tresult></tresult>…

【C#】「"Year, Month, and Day parameters describe an un-representable DateTime."」というエラーが出てきた時の対処法

C#

はじめに 以下のようなエラーに遭遇しました。 "Year, Month, and Day parameters describe an un-representable DateTime." // Google翻訳 「Year、Month、および Day パラメータは、表現できない DateTime を記述しています。」 その対処法をメモしておき…

【C#】C#8.0から追加されたIAsyncEnumerableを使って非同期ストリームを実装する

C#

はじめに 恥ずかしながら最近になってやっとIAsyncEnumerableというものを知りました。 learn.microsoft.com ufcpp.net これは非同期ストリームと呼ばれるもので、ざっくり言うとasync/awaitとyieldが共存できるようになったというイメージでしょうか。C#8.0…

【C#】「ConfuserEx2」を用いてコードを難読化をする(Windows,プリセット毎の実験結果付き)

C#

はじめに 今回はConfuserEx2という.NETアプリケーションのためのオープンソースな難読化ツールを紹介したいと思います。mkaring.github.ioまた公式ドキュメントは以下にあります。 github.com はじめに 概要 サポート 実験環境 ダウンロード 下準備 使い方 C…