はなちるのマイノート

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

C#

【Rider】Riderで改行コード(CRLFとLFとCR)の設定方法(新規ファイル, 開いているファイル, 指定したファイル・ディレクトリ)

はじめに 今回はCRLF・LF・CRの違いとRiderでの設定方法について取り上げたいと思います。 はじめに 改行コード Riderでの設定方法 新規ファイルに対しての適応方法 現在開いているファイルに対して改行コードを変更する 指定したファイルやディレクトリ内の…

【Unity】PackageManager.Clientを利用してC#スクリプトを通してPackageManagerを操作する

はじめに 今回はPackageManagerのスクリプティングAPIについて取り上げたいと思います。docs.unity3d.com はじめに 概要 使い方 LogLevel Add AddAndRemove List Embed Remove Resolve 参考 概要 PackageManagerを操作するためにはPackageManager.Clientクラ…

【C#】浮動小数点をToString()するとCultureInfoによって出力が異なってしまう件

C#

はじめに 1.23f.ToString()のような浮動小数点のToStringを実行するとカルチャ(国/地域)によって表示が異なることに最近気がつきました。 // ja-JP Console.WriteLine(CultureInfo.CurrentCulture); // 1.23 Console.WriteLine(1.23f.ToString(CultureInfo.C…

【C#】.NET7より導入されたInt128 構造体とUInt128 構造体を用いて128ビット整数を活用する

C#

はじめに 今回は128ビット整数のInt128とUInt128について取り上げたいと思います。learn.microsoft.com learn.microsoft.com はじめに 概要 概要 128bitの整数(Int128・UInt128)が.NET7から導入されました。C#のバージョン的にはC# 11からのタイミングなはず…

【C#】C#11から登場した生文字列リテラル(Raw String Literal)を利用してT4の実行時テンプレートを脱却する

C#

はじめに 今回はC#11より登場した生文字列リテラル(Raw String Literal)を紹介したいと思います。 // サンプル public static void Main() { var name = "Hanachiru"; // C#11より登場した生文字列リテラル (T4の実行時テンプレートの移行先としてしばしば利…

【C#】メモリレイアウトを制御できるStructLayout &LayoutKind.Explicitを用いて別の型として解釈する(あとUnsafe.Asを利用した例も)

C#

はじめに 今回はStructLayoutとLayoutKind.Explicitを用いて指定したメモリ領域を別の型として解釈する方法について紹介したいと思います。 別の型として解釈する例(bool + byte + ushort => int) はじめに 別の型として解釈する StructLayoutとは Unsafe.As…

【C#】オープンジェネリック型(Open Generic Types)とクローズジェネリック型(Closed Generic Types)の違いについて

C#

はじめに 今回はオープンジェネリック型(Open Generic Types)とクローズジェネリック型(Closed Generic Types)について取り上げたいと思います。 はじめに 概要 オープンジェネリック型 クローズジェネリック型 参考 概要 オープンジェネリック型(Open Gener…

【C#】ジェネリック型を構築するジェネリック型定義を取得・判定する(GetGenericTypeDefinition(), IsGenericTypeDefinition)

C#

はじめに 今回はジェネリック型を構築するジェネリック型定義を取得・判定する方法について紹介したいと思います。 System.Collections.Generic.Dictionary`2[System.String,System.Int32] Dictionary<string, int> ↓ // ジェネリック型定義 System.Collections.Generic.D</string,>…

【C#】C#11より実装されたUTF-8文字列リテラルを用いてUTF-8のbyte配列を生成する

C#

はじめに 今回はC#11より実装されたUTF-8文字列リテラルを紹介したいと思います。 // サンプル ReadOnlySpan<byte> span = "Hello"u8; var builder = new StringBuilder(); foreach (var c in span) { builder.Append(c.ToString("x")); builder.Append(", "); } /</byte>…

【Rider】InlineErrorという拡張機能を入れて警告やエラーメッセージをコードの右側に表示させる(常に表示されるので便利)

はじめに 今回はInlineErrorというRiderの拡張機能について紹介したいと思います。 実装に動作させている様子plugins.jetbrains.com はじめに 概要 インストール手順 概要 InlineErrorというRider拡張機能を利用することで、警告やエラーのメッセージをコー…

【C#】System.Diagnostics.ConditionalAttributeは「戻り値・outがあるとNG」で「ref・inはOK」である

C#

はじめに 今回はConditionalAttributeの制約について紹介をしたいと思います。 指定した条件付きコンパイル シンボルが定義されていない場合、メソッド呼び出しまたは属性を無視するようコンパイラに指示します。 learn.microsoft.com最近知ったのですが、以…

【C#】TypeConverter.ConvertFromStringメソッドを用いてstringからgenericな型にParseでき、C#11からはIParsable<TSelf>が使える

C#

はじめに 今回はTypeConverter.ConvertFromStringとC#11から導入されたIParsable<TSelf>を紹介したいと思います。learn.microsoft.comlearn.microsoft.com はじめに 概要 C#11以前 C#11以降 パフォーマンス的な話 概要 例えばstringからジェネリックのTの値にパース</tself>…

【Rider】nullになることを示す[CanBeNull]・ならないことを示す[NotNull] と 値解析モードによる挙動の違いについて

はじめに 今回は[CanBeNull]と[NotNull]、またそれらに対する挙動を設定できる値解析モードについて取り上げたいと思います。pleiades.io // 値解析モードによる挙動の違いについてのサンプル var sample = new Sample(canBeNullObj: null, notNullObj: null…

【C#】インターフェースで定義されているメンバーを実装するときにConditional属性は使えない

C#

はじめに 以下のようなコードを書いたところエラーが出てきてしまいました。 public interface IProgram { public void Hoge(); } public class Program : IProgram { [Conditional("ENABLE_HOGE")] public void Hoge() { Console.WriteLine("HOGE"); } } [C…

【Unity】コマンドラインからバッチモードでstaticメソッドを実行する方法

はじめに 今回はコマンドラインからUnityを操作する方法について紹介したいと思います。 コマンドラインから実行している様子docs.unity3d.com はじめに 概要 コマンドについて Unityのパスを指定 -quit -batchmode -nographics -projectPath -executeMethod…

【Unity】asmdefで"必須パッケージ"と"任意パッケージ"を定義する方法

はじめに 今回はasmdefで必須パッケージと任意パッケージを定義する方法について紹介をしたいと思います。 任意パッケージのサンプル(左)と必須パッケージのサンプル(右) はじめに その前に やり方 必須パッケージのやり方 任意パッケージのやり方 その前に …

【C#】fixedステートメントを用いてGCによるアドレスの変更を阻止する(GC管理下だとコンパクションの可能性があるため)

C#

はじめに 今回はfixedステートメントについて書きたいと思います。 はじめに 概要 使い方 参考 概要 GC管理下にあるオブジェクトは、アドレスが最適化のために移動されることがあります。詳細は未確認飛行さんのコンパクションの箇所を読むと良いでしょう。 …

【C#】BitConverter.GetBytesはbyte配列が生成されてしまうので、極力BitConverter.TryWriteBytesを利用してAllocation削減する

はじめに 今回はBitConverter.GetBytesとBitConverter.TryWriteBytesに焦点をあててAllocationについて書きたいと思います。learn.microsoft.com learn.microsoft.com はじめに 概要 BitConverter.TryWriteBytesを利用する 利用サンプル1 利用サンプル2 参考…

【C#】Conditional属性は呼び出し元のシンボル定義を参照するので注意、またその対処法

C#

はじめに 今回はConditionalAttributeは呼び出し元のシンボル定義を参照していることについて取り上げたいと思います。learn.microsoft.com メソッド呼び出しがスキップされる場合とされない場合 はじめに 概要 気をつけたいこと 対処法 概要 そもそもCondit…

【C#】CallerMemberName, CallerFilePath, CallerLineNumberを用いてメソッドの呼び出し元の情報を取得する(メソッド名またはプロパティ名, パス, 行番号)

はじめに 今回はメソッドの呼び出し元情報を取得できるようになる3つの属性(CallerMemberName・CallerFilePath・CallerLineNumber)を紹介したいと思います。 はじめに 概要 CallerFilePath CallerLineNumber CallerMemberName 使い方 実験 概要 CallerMember…

【Unity】Unity.Collections.xxHash3.StreamingStateを利用してデータ少しずつ入力しながらハッシュ値を計算する

はじめに 前回xxHash3.Hash64とxxHash3.Hash128を紹介したのですが、今回はいくつかのデータをそれぞれ計算した後にハッシュ値を取得できるxxHash3.StreamingStateを紹介したいと思います。 www.hanachiru-blog.com // サンプルコード // 128bits xxHash3.St…

【C#】Utf8Formatter.TryFormatを用いて一般的なデータ型をUtf8 文字列として書式設定する

C#

はじめに 今回はUtf8Formatter.TryFormatについて紹介したいと思います。 int value = 999; // e7, 3, 0, 0 Console.WriteLine(string.Join(",", BitConverter.GetBytes(value).Select(x => x.ToString("x")))); // 書き込み先のメモリ領域 Span<byte> destination</byte>…

【C#】.NETの内部実装がGitHubで公開されていたので見てみる(Contributeも可)

C#

はじめに 先日教えていただいたのですが、どうやら.NETの内部実装を見れるGitHubのRepositoryが公開されているらしいです。 This repo contains the code to build the .NET runtime, libraries and shared host (dotnet) installers for all supported plat…

【C#】IBufferWriter<T>の使い方・実装の仕方について学んでいく(公式のArrayBufferWriter<T>の内部実装を見ながら)

C#

はじめに 今回はIBufferWriter<T>の使い方・実装の仕方について書きたいと思います。learn.microsoft.com はじめに IBufferWriterの利用者視点での使い方 IBufferWriterの実装者視点での使い方 応用 File書き込みとかにも利用したい 参考 IBufferWriterの利用者</t>…

【C#】Marshal.AllocHGlobal・NativeMemory.Alloc・NativeMemory.AllocZeroedを利用してアンマネージドメモリを確保する方法

C#

はじめに 今回はアンマネージドメモリを確保・破棄する方法について以下の3つを紹介したいと思います。 Marshal.AllocHGlobal NativeMemory.Alloc NativeMemory.AllocZeroed はじめに 概要 Marshal.AllocHGlobal Marshal.FreeHGlobal NativeMemory.Alloc Nat…

【Unity】Unity公式のハッシュアルゴリズムxxHash3がCollectionsパッケージに入っているので使ってみる

はじめに 今回はUnity公式のxxHash3について紹介をしたいと思います。 public void Start() { // unmanagedなHeap確保 NativeArray<byte> input = new NativeArray<byte>(10000, Allocator.Temp, NativeArrayOptions.UninitializedMemory); for (var i = 0; i < input.Le</byte></byte>…

【C#】RuntimeHelpers.IsReferenceOrContainsReferences<T>メソッドを利用して"参照型"か"参照型を含む値型"か調べる

C#

はじめに 今回はRuntimeHelpers.IsReferenceOrContainsReferences<T>について紹介をしたいと思います。learn.microsoft.com はじめに 概要 使い方 考察 参考 概要 public static bool IsReferenceOrContainsReferences<T> (); 指定された型が参照型であるか、また</t></t>…

【C#】C#9.0から導入された静的匿名関数(Static anonymous functions)を利用して状態のキャプチャを禁止する

はじめに 今回はC#9.0から導入された静的匿名関数(Static anonymous functions)について取り上げたいと思います。 learn.microsoft.com はじめに 概要 参考 概要 ラムダおよび匿名メソッドに対して ' static ' 修飾子を許可します。これにより、含まれるスコ…

【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…