コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【C#】指定した文字列が予約語かどうか確認できる関数を自作する

C#

ソースコード public static class Utils { public static IReadOnlyList<string> List { get; } = new [] { "abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked", "class", "const", "continue", "decimal", "default", "deleg</string>…

【C#】予約語の一覧を取得できる関数を自作する

C#

ソースコード public static class Utils { public static IReadOnlyList<string> List { get; } = new [] { "abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked", "class", "const", "continue", "decimal", "default", "deleg</string>…

【C#】シーケンスから重複している要素を取得する拡張メソッド

ソースコード using System; using System.Collections.Generic; using System.Linq; public static class IEnumerableExt { public static IEnumerable<TKey> GetDuplication<TKey, TSource> ( this IEnumerable<TSource> self, Func<TSource, TKey> keySelector ) { return self .GroupBy( keySelector )</tsource,></tsource></tkey,></tkey>…

【Unity】IDisposable の破棄漏れを見つけるクラス

ソースコード Dispose が呼び出されずにインスタンスが破棄されると デストラクタのタイミングでエラーログを出力する 使用例 using UnityEngine; // IDisposable を直接実装するのではなく、 // CheckDisposable を継承するようにする public sealed class …

【C#】Excel のファイルを作成して折れ線グラフを挿入する方法

C#

はじめに 上記サイト様で詳細が記載されていますが、備忘録として自分のブログにも Excel のファイルを作成して折れ線グラフを挿入する方法を書き残しておきます インストール Visual Studio メニューの「ツール > NuGet パッケージ マネージャー > ソリュー…

【C#】.ini ファイルの読み込み・書き込みができる「INI File Parser」紹介

はじめに 「INI File Parser」をプロジェクトに追加することで .ini ファイルの読み込み・書き込みができる 入手方法 Install-Package ini-parser パッケージマネージャーコンソールで上記のコマンドを実行します 使い方 読み込み [Dialog] Width=512 Height…

【C#】Conditional 属性でシンボルが定義されている場合に関数を無効化する方法

概要 using UnityEngine; public class Example : MonoBehaviour { private void Update() { Log( "ピカチュウ" ); } #if DISABLE_DEBUG_LOG [System.Diagnostics.Conditional( "DUMMY" )] #endif private void Log( string message ) { Debug.Log( message …

【C#】Parallel.ForEach で Partitioner.Create を使用する場合の処理速度検証

C#

検証用スクリプト using System; using System.Collections.Concurrent; using System.Diagnostics; using System.Threading.Tasks; internal static class Program { private static void Main() { var count = 1000000000; var rangePartitioner = Partiti…

【C#】Console 出力を高速化する方法

C#

通常 using System; internal static class Program { private static void Main() { for ( int i = 0; i < 10000; i++ ) { Console.WriteLine( i ); } } } 高速化 using System; using System.IO; internal static class Program { private static void Mai…

【.NET Core】Unhandled Exception: System.ArgumentException: 'shift_jis' is not a supported encoding name

C#

概要 using System.Text; class Program { static void Main() { var encoding = Encoding.GetEncoding( "shift_jis" ); } } Encoding.GetEncoding で Shift-JIS を使用する際に Unhandled Exception: System.ArgumentException: 'shift_jis' is not a suppo…

【.NET Core】作成したプロジェクトで「Cannot resolve symbol 'XXXX'」と表示される場合

C#

概要 作成した .NET Core のプロジェクトで void や sting などが赤く表示され、 「Cannot resolve symbol 'XXXX'」と表示される場合 ソリューションエクスプローラーでプロジェクトを右クリックして 「プロパティ」を選択し、 「ターゲットフレームワーク」…

【おすすめスライド】「今日からできる!簡単 .NET 高速化 Tips」

スライド

【C#】関数の戻り値で ValueTuple を使用する

概要 private (int id, string name) GetCharacter() { return ( 25, "ピカチュウ" ); } 関数の戻り値で ValueTuple を使用することで var character = GetCharacter(); Console.WriteLine( character.id + ", " + character.name ); var ( id, name ) = Get…

【C#】ValueTuple を使用して二重ループを一重ループで記述できるようにする拡張メソッド

ソースコード using System.Collections.Generic; using System.Linq; public static class IEnumerableExt { public static IEnumerable<(T item1, T item2)> Combine<T> ( this IEnumerable<T> first, IEnumerable<T> second ) { return first.SelectMany( i1 => se</t></t></t>…

【C#】二重ループを LINQ で記述する

C#

ソースコード 通常 var list1 = Enumerable.Range( 1, 3 ); var list2 = Enumerable.Range( 1, 3 ); foreach ( var i1 in list1 ) { foreach ( var i2 in list2 ) { Console.WriteLine( i1 + ", " + i2 ); } } LINQ var list1 = Enumerable.Range( 1, 3 ); v…

【Unity】LINQ の結果を匿名型ではなく ValueTuple で受け取る

概要 using System.Linq; using UnityEngine; public class Example : MonoBehaviour { private static string[] m_list = { "フシギダネ", "フシギソウ", "フシギバナ", }; private void Update() { // 匿名型 var r1 = m_list.Select( c => new { name = c…

【Unity】構造体をインターフェイスで受け取ると GC Alloc が発生するが Generic 制約でインターフェイスを指定すると発生しない

概要 using UnityEngine; public interface ICharacter { } public struct Character : ICharacter { } public class Example : MonoBehaviour { private Character m_character = new Character(); private void Update() { Hoge1( m_character ); } privat…

【Unity】System.Enum で引数を受け取ると GC Alloc が発生するが Generic 制約 で Enum を指定すると発生しない

概要 using System; using UnityEngine; public class Example : MonoBehaviour { private enum Type { GRASS, FIRE, WATER, } private void Update() { Hoge1( Type.FIRE ); } private void Hoge1( Enum value ) { } } System.Enum で引数を受け取ると GC A…

【Unity】ローカル変数をキャプチャする場合、その処理が実行されなくても GC Alloc は発生する

概要 using System.Linq; using UnityEngine; public class Example : MonoBehaviour { private static string [] m_list = { "フシギダネ", "フシギソウ", "フシギバナ", }; private void Update() { var name = "ピカチュウ"; // ここで return するので r…

【Visual Studio】ラムダ式の => にカーソルを重ねるとキャプチャされている変数を確認できる

概要 ラムダ式の => にカーソルを重ねるとキャプチャされている変数を確認できます 参考サイト様 https://www.slideshare.net/xin9le/dotnetperformancetips-170268354

【Unity】LINQ の拡張メソッドを自作して GC Alloc を減らす方法

概要 using System.Linq; using UnityEngine; public class Example : MonoBehaviour { private static string[] m_list = { "フシギダネ", "フシギソウ", "フシギバナ", }; private void Update() { var name = "ピカチュウ"; var result = m_list.Where( c…

【C#】readonly なフィールドをコンストラクタから呼び出される関数で初期化する方法

C#

概要 public sealed class Character { private readonly int m_id; private readonly string m_name; public Character() { Initialize( out m_id, out m_name ); } private void Initialize( out int id, out string name ) { id = 25; name = "ピカチュウ…

【C#】配列やリストから重複組合せを取得できる拡張メソッド

はじめに 上記サイト様が、リストから組み合わせを取得できる関数を公開されております こちらを少し修正して、配列やリストから重複組合せを取得できる拡張メソッドを作りました ソースコード using System.Collections.Generic; using System.Linq; public…

【C#】配列やリストから組合せを取得できる拡張メソッド

はじめに 上記サイト様が、リストから組み合わせを取得できる関数を公開されております こちらを少し修正して、配列やリストから組合せを取得できる拡張メソッドを作りました ソースコード using System.Collections.Generic; using System.Linq; public sta…

【C#】リフレクションで引数に params が付いているかどうか確認できる拡張メソッド

ソースコード using System; using System.Reflection; public static class ParameterInfoExt { public static bool HasParams( this ParameterInfo param ) { var type = typeof( ParamArrayAttribute ); return param.GetCustomAttributes( type, false )…

【C#】Type 型で組み込み型のエイリアス名を取得できる拡張メソッド

ソースコード using System; public static class TypeExt { public static string GetAliasName( this Type self ) { switch ( self.FullName ) { case "System.Boolean": return "bool"; case "System.Byte": return "byte"; case "System.SByte": return …

【Unity】List.Find の null チェックを少しだけ簡潔に記述できる拡張メソッド

ソースコード using System; using System.Collections.Generic; public static class ListExt { public static bool TryFind<T>( this List<T> self, Predicate<T> match, out T result ) where T : class { result = self.Find( match ); return result != null; } </t></t></t>…

【C#】二次元配列を回転させる拡張メソッド

はじめに 上記サイト様が公開されているプログラムを参考に 二次元配列を回転させる拡張メソッドを作成しました ソースコード public static class ArrayExt { // 時計回りに 90 度回転 public static T[,] RotateClockwise<T>( this T[,] self ) { int rows = </t>…

【C#】バイトサイズを簡単に扱うことができる「ByteSize」紹介

C#

はじめに 「ByteSize」をプロジェクトに追加することで バイトサイズを簡単に扱うことができるようになります インストール Install-Package ByteSize パッケージマネージャーコンソールで上記のコマンドを入力します 使い方 コンストラクタ using ByteSizeL…

【C#】文字列から数値を抽出する拡張メソッド

ソースコード using System.Text.RegularExpressions; public static class StringExt { public static int ExtractInteger( this string self ) { return int.Parse( Regex.Replace( self, @"[^0-9]", string.Empty ) ); } } 使い方 var str1 = "s012"; Con…