うにてぃブログ

主にUnityとC#に関する記事を書いていきます

C#

【C#】for ループの i++ と ++i は IL 的に差があるのか

昔 for は i++ じゃなくて ++i を使おうって言われたことがあった気がしたので 実際に IL でどう違うのか調べてみました for (var i = 0; i < 10; i++) { } for (var i = 0; i < 10; ++i) { } IL を見てみる i++ がこちら IL_0007: ldloc.0 IL_0008: ldc.i4.…

【C#】ジェネリックメソッドをリフレクションで呼び出す

ジェネリックメソッドを呼び出す場合は MethodInfo から MakeGenericMethod を利用して、再度 MethodInfo を取得する必要がある public class Sample { public void Exec<T>() where T : class { Debug.Log(typeof(T)); } } 例えば上記クラスの Exec メソッドを</t>…

【C#】for ループ内 で Action や コールバックなどで index を利用した際に、最終的な値になる件について

例えば 下記のコードを実行すると 結果は 10 になる using System; using System.Collections.Generic; public class C { public static void Main() { var actions = new List<A>(); for (var i= 0; i < 10; i++) { actions.Add(new A(() => {Console.Write(i)</a>…

【C#】パラメータの変更を監視するクラス

C#

HPゲージなど、パラメータが変更されたタイミングで UI に反映する必要があり、 そのパラメータの利用箇所が増えると処理が複雑になっていく そのため、汎用的に利用できる監視クラスを作成しました ※UniRx を使えば簡単に利用できるあれですが… using Syste…

【C#】インスタンスが登録してなくてもエラーにならない ServiceLocater

ServiceLocater のコードを見ていると インスタンスが登録されていない場合は エラーになるものが多く(多分) もし、インスタンスがなくてもエラーにならないものを作る場合どのような実装になるのか気になったので、作成してみました この ServiceLocater …

【C#】interface を private で定義する

interface を利用したクラスでは基本的に public で定義する必要がある public class SampleRandom : MonoBehaviour { private void Start() { var t = new Test(); t.Test1(); } private interface ITest1 { void Test1(); } private class Test : ITest1 {…

【C#】string.Format内部で { や } を利用する

const string format = "\"{0}\": {\n"; string.Format(format, sample); としたときに Format の指定が間違っているエラーが出て変換できなかった FormatException: Input string was not in a correct format. \", \', \n, \\ などエスケープできるのは知…

【C#】特定の シンボル定義時にメソッド呼び出しを行わない方法

Conditional をメソッドに定義することで、文字列で指定した シンボルが定義されていた場合のみ呼び出すようになる [Conditional("UNITY_EDITOR")] private void DebugMethod() { } ````

【Unity】AStarアルゴリズムのサンプル

github.com A* のアルゴリズムを組んで見たくて wiki を参考に作成してみました A* - Wikipedia アルゴリズム アルゴリズムは wiki にあるとおりの順番で実装してあります 1 開始地点をオープン済みとして登録する 2 オープン済みのノードの中から一番コスト…

【Unity】パスを指定してディレクトリを作成する

UnityProject 内部 で ディレクトリを作成する方法として AssetDatabase.CreateFolder と System.IO.Directory.CreateDirectory(path) の2つが存在します 2つの違いを以下のとおりです AssetDatabase.CreateFolder "Assets/" から始まるディレクトリパスを指…

【C#】特定のクラスを継承した全クラスのインスタンスを作成する

このコードは BindingFlags フラグに対応していないので internal クラスの場合インスタンスが生成できなくなるので注意 internal クラスの場合はインスタンス作成時に引数がかなければ Activator.CreateInstance(t, true) で作成できる using System; using…

【C#】空 Action を渡す

例えば以下のメソッドがあり、null は指定したくないが、何も処理したくない場合がある private void CallAction(Action action) その場合は () => { } を渡してやれば何を処理をしない CallAction(() => { }); 他には ReorderableList 等で コールバックを…

【C#】XY のループが面倒なので拡張してみた

通常 x と y のループを回す場合は下記のように for を2回使ってループを回す がインデントが上がってしまうので面倒だと思い foreach 一度でループできるようにしてみました for (var x = 0; x < hogeX; x++) { for (var y = 0; y < hogeY; y++) { } } usin…

【C#】Enumerable で利用できる static メソッド

C#

Enumerable.Range public static IEnumerable<int> Range (int start, int count); for のように a ~ b までの値のリストを作成する 1 ~ 10 までのリストができる IEnumerable<int> enumerable = Enumerable.Range(1, 10); Enumerable.Repeat public static IEnumerable<int></int></int></int>…

【C#】Linq で利用できるメソッド一覧

https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.defaultifempty?view=netcore-3.1 上記からよく使いそうなメソッドをまとめました Any All Append Average Cast Concat Contains Count Where First FirstOrDefault GroupBy Last LastO…

【C#】List の初期サイズを指定した場合と指定しなかった場合

new List<T>(1) のように List のインスタンス生成時に 要素数を指定すると 予め 領域を確保することができるため突然のGC を防ぐことができる 初期化のタイミングだと空の場合は 40B 指定した場合は 76 + サイズ * 4B (int の場合) 指定したサイズに満たない場</t>…

【Unity】boxing の GC を見る

boxing 時にはゴミが出るから使わないほうがいいと聞いたが 実際には調べたことがなかったので調査してみました ボクシングについては下記サイトに記述されていますので参考にしてください ボックス化 - C# によるプログラミング入門 | ++C++; // 未確認飛行…

【C#】ToArray の GC を見る

Primitive型 int 型のからリストを ToArray してみてGCを見てみる var list = new List<int>(); // 32B list.ToArray(); 次に 1要素だけ入れて見てみる var list = new List<int>(){0}; // 36B list.ToArray(); 36B になった int 型が 4B なのでおそらく要素分だけゴミ</int></int>…

【C#7】switch で 条件式を利用する

C# 7

C#7 から switch で when を利用できるようになりました これを利用することで switch の case に 条件式を埋め込めます switch (chr) { // アルファベットかどうか case var c when c >= 'A' && c <= 'z': break; // 数字かどうか case var c when c >= '0'…

【C#】2進数の1の数をカウントする

C#

どこかで拾ってきた処理だとは思うが、いつか使うかもしれないのでメモ こちらのページにて解説してる人がいたので、詳細はこちらから intの1のビットの数を数えるロジック | mwSoft public static int GetBitCount(int x) { x = (x & 0x55555555) + ((x >> …

【C#】Dictionary をソートする

C#

Dictionary を key 順にソートしたくて、調べていると SortedDictionary というものがあるみたいでした docs.microsoft.com 使い方 例えばこのようにすると foreach で取得する際にはソートされて取得できます var sortedDictionary = new SortedDictionary<int, string>(</int,>…

【C#】for と foreach

C#

パフォーマンス 0~10000までを加算して計測する private class Test { public int Value; } private void Main() { List<Test> _list = Enumerable.Range(0, 10000).Select(i => new Test(){Value = i}).ToList(); var sum = 0; Profiler.BeginSample("ProfileFor"</test>…

【C#】配列をString化して返す

C#

using System.Collections.Generic; public static class ListUtil { public static string Display<T>(this IList<T> self) { if (self == null || self.Count <= 0) return ""; var builder = new System.Text.StringBuilder(); builder.AppendLine("[Display IL</t></t>…

【C#】for と Enumerable のパフォーマンスを調べる

下記コードを実行して速度等を見てみる ループの上限が60000なのは Enumerable.Range 側で大きい値を入れると OverflowException: Arithmetic operation resulted in an overflow. のエラーが出てしまったため private void Start() { Profiler.BeginSample(…

【C#】Stateを管理するクラス

C#

State を enum で分けて管理しているとき クラスが増えていった際に 追加処理が面倒だったので自動的に管理してくれるものを作成 using System; using System.Collections.Generic; using System.Linq; public class ClassManage<T, TEnum> where T : BaseClass where </t,>…

【C#】配列の要素を入れ替える

C#

using System.Collections.Generic; public static class ListUtil { /// <summary> /// Replace Index1 and index2 /// </summary> public static void Replace<T>(this IList<T> self, int index1, int index2) { if (self.Count <= index1 || self.Count <= index2) return; var ca</t></t>…

【C#】重みをつけて IList を抽選する

C#

抽選したいクラスに interface を継承させて LotteryUtil.Lot を呼び出せば抽選してくれる private class Food : LotteryUtil.IWeight { public string Name; public int Weight; public int GetWeight() => Weight; } コード using System; using System.Co…

【C#】List をシャッフルする【LINQ】

LINQ を使わずに配列をシャッフルする方法を以前紹介したが 今回はLINQ を利用した配列をシャッフル方法を記述する 【C#】配列をシャッフルしたり、ランダムに取得する - うにてぃブログ Guid C# には GUID を生成するために Guid 構造体が存在する Guid 構…

【C#】ランダムな文字列を返す

C#

ランダムな文字列の長さを指定するとその長さ分の文字列を返してくれる関数 private const string PASSWORD_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static string GenerateRandomString(int size = 32) { var s…

【C#】メソッドをオーバーライドしているかどうか判定する

using System; using System.Reflection; private static bool IsOverrideMethod(Type type, string methodName) { var method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic); if (method == null) return false; return m…