ネコのために鐘は鳴る

寺院に住み着くパソコ〇好き

c#

(雑記) int の範囲チェック速度 小ネタ

int型の整数の引数の範囲チェックで、0 から Size の範囲外だったら例外を投げる、のような範囲チェックはする機会が多いが、 int valueとint Sizeに対して if(value < 0 || value >= Size) throw new ArgumentOutOfRangeException(); よりも if((uint)value…

(C# 雑記) Linq の Count() と IReadOnlyCollection<T>

Linq のCount()、つまりint Enumerable.Count(IEnumerable<T>)は原理的には全列挙による数え上げだが、配列ライクなものは初めから要素数を持っているのでO(N)を回す必要はない。そのため、配列ライクなものについては直接要素数を取るよう最適化が施されている</t>…

(C#) 共変性による参照型配列のパフォーマンス

C# の配列は共変性 (covariance) があり、以下のコードはコンパイルできます。 object[] array = new int[10]; array[2] = 5; そして困ったことに、次のコードもコンパイルできます。 object[] array = new int[10]; array[2] = "hello"; // ← 代入できる!…

(C#) 参照型インスタンスのアドレスを取得する

C# では unsafe キーワードを使うことで値型のポインタや、unmanaged型配列の配列要素へのポインタを取得できますが、 参照型インスタンスへのポインタは取得できません。ガベージコレクション (GC) によるコンパクションでアドレスが移動する可能性があり、…

(C#) ReadOnlyCollection<T> を Unsafe.As で違法に書き換える

System.Runtime.CompilerServices.Unsafe クラス System.Runtime.CompilerServices.Unsafeクラスは C# において safe なコンテキストで unsafe なことができる、.NET の標準ライブラリにある公式黒魔術書です。Unsafeという名前から明らかですが、safe で使…

(C#) 配列の for の JIT 最適化処理

[前提] C# のコンパイルと JIT コンパイル C# --> [コンパイル] --> IL -> [JIT] --> バイナリ の流れを知ってる人は読み飛ばしてください forの最適化の話をする前に、C#のソースコードが実行可能バイナリ (アセンブリ) にコンパイルされるまでの流れをおさ…

(C#) string で発生するガベージを抑える (String Interning)

C# においてstringは参照型で、そのインスタンスはヒープメモリに生成されます。 当然、参照されなくなったstringは次回のガベージコレクションで回収されます。 少しでもガベージは減らしたいものですが、文字列は生成するたびに同じ内容でも別インスタンス…

(C#) 知らぬ間に起こるstructのboxingを回避する

この記事の要点 自分でobjectにキャストしなくてもboxingは起こるよ structは等価比較を実装しないとパフォーマンスが落ちますよー ボックス化 (boxing) とは C# には値型と参照型があり、structは値型です。値型のオブジェクトは参照型のメンバ変数である場…

(C#) 同期コンテキストと Task, async/await

.NET framework 4 で追加されたTaskおよび .NET framework 4.5 で追加されたasync, awaitキーワードによって、C# の非同期処理は非常にに簡単になりました。 Windows Form, WPF, UWP, Unity など各種フレームワーク上の場合、非同期処理はスレッドやコールバ…

(C#) コレクションのカプセル化

コレクションの保護 クラスの不十分なカプセル化としてよく見られるのがコレクションです。 以下の例は、カプセル化されていないコレクションの例です。 public static class Database { public static Person[] People { get; private set; } } public clas…

.NETとマルチプラットフォーム

C#でマルチプラットフォームなアプリケーションを作りたかった時に、調べたことを自分用メモとしてまとめました。 たまには違う言語も書いたら? C#の実行環境 C#はIL(中間言語;Intermediate Language)にコンパイルされ、仮想環境上で動くコンパイル系言語で…

(C#)Enumの要素に表示名をつける ~ローカライズ編~

前回の記事の続きです 前回はEnumDisplayName属性に定数リテラル文字列を与えることはできましたが、 リソースから値を割りつけることができませんでした。これでは多言語化する時に困ります。 [AttributeUsage(AttributeTargets.Field)] public class EnumD…

C#5でもnameofしたい

結論 前置きが長いと結論を早く知りたいマンにボコられるので、 まずはタイトルに対する結論から。 using System; using System.Linq.Expressions; public static class GetName { public static string Of<MemberType>(Expression<Func<MemberType>> expression) { return (expression.Bo</func<membertype></membertype>…

(C#) Enumの要素に表示名をつける

やりたいこと Enumのフィールド名と表示名を分離したい。 最終的な目標として、Sushi.Takoというenumを表示する文字として"タコ"を割り当てたい。かつ汎用性のある構造にしたい。多言語によるローカライズにも対応したい。今回はそういうお話です。 2019/2/2…

DependencyPropertyとBindingについて

DependencyPropertyとは何か WPFにおけるBindingの根幹をなす依存関係プロパティ(DependencyProperty)について書いておこうと思います。 まず、DependencyPropertyとは何かというと、一言で言うとBindingができるプロパティのことです。 より正確に言うと、B…

MVVMで始めるWPF生活

はじめに 皆さんはラーメンは何で食べますか?いえ、そうではなく、WPFとはいったい何でしょうか?正式にはWindows Presentation Foundationといい、Windows Formに代わる新しいWindowsにおけるGUIアプリケーションのプラットフォームであり、登場は2006年。…