C#チートシート
using declaration
using を変数宣言時に指定するとスコープを抜けた時に Dispose が自動で呼び出される。IDisposable を実装しているクラスに対して使用可能。
- System.IDisposable : アンマネジドリソースを開放する仕組みを提供する。GC に任せたくない場合に実装する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Hoge : IDisposable { public void Dispose() { Console.WriteLine("Disposed."); } } public static void Main() { Console.WriteLine("Using declarationl."); using (var hoge = new Hoge()) { //using var hoge = new Hoge(); // C#8.0 ではこのように簡略化可能 } } |
IEnumerable
- コレクションに対する反復子を提供するインタフェース
- eg. foreach の反復子を提供
- Select() – 引数のラムダ式を適用した新しいコレクションを返す
- Where() – 引数のラムダ式が真の要素で新しいコレクションを返す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// 各要素にラムダ式を適用した新しいコレクションを返す。 { Console.WriteLine("IEnumrable.Select()"); int[] numbers = { 0, 1, 2 }; var addedNums = numbers.Select(val => { return val + 1; }); foreach(var val in addedNums) Console.WriteLine(val); } // 各要素にラムダ式で示す条件が真の新しいコレクションを返す。 { Console.WriteLine("IEnumrable.Where()"); int[] numbers = { 0, 1, 2 }; var addedNums = numbers.Where(val => { return val == 1; }); foreach(var val in addedNums) Console.WriteLine(val); } |
yield return
- yield return で遅延評価されるコレクションを返せる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using System.Collections.Generic; using System.Linq; public class Program { public static IEnumerable<int> GetIntArray(int arraySize) { Console.WriteLine("GetIntArray() invoked."); for(int i = 0; i < arraySize; ++i) { Console.WriteLine("Yield Return Invoked."); yield return i; } } public static void Main() { var intArray = GetIntArray(3); // 関数は実行されない。 var item = intArray.ElementAt(1); // GetIntArray(2) が実行される。 Console.WriteLine(item); // "1" が表示される。 Console.WriteLine("foreach:"); foreach(var val in intArray) // ループ毎に yield が順次評価されていく。 { Console.WriteLine(val); } } } |
テンプレートクラス(ジェネリッククラス)の実装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System; using System.Collections.Generic; public class Program { class MyList<TItem,TItem2, TItem3, TList> where TItem : class, new() // new() は引数無しのコンストラクタを持つという意味。一番最後に書かないとダメ。 where TItem2 : IComparable where TItem3 : struct // new() 制約はつけれない。struct の時点で引数を取らないので。 where TList : IList<TItem3> { TItem item; TItem2 item2; TList Container; }; |
- テンプレートパラメータの制約を書ける
where template_param : [constraint], [constraint]
ベースクラスの取得
C++のthisでベースクラスにアクセスしたい場合のC#版。
普通にアップキャストする。
ファイルのフルパスからディレクトリを取得
Path.GetDirectoryName(fullPath)を使う。内部処理はパスとして適切な文字列かチェックし、ファイル名部分をカットしているだけ。
ファイル出力
1 2 3 4 |
// 新規作成 File.WriteAllText(@"C:\temp\output.txt", "Hello."); // 追記 File.AppendAllText(@"C:\temp\output.txt", "Hello."); |
ログ出力
1 2 3 |
int val1 = 1; int val2 = 2; System.Console.WriteLine("val1: {0} val2: {1}\n", val1, val2); |
配列を宣言して初期化リストで初期化する
1 2 |
int[] array1 = new int[] { 1, 3, 5, 7, 9 }; int[] array2 = { 1, 3, 5, 7, 9 }; // インスタンス化を省略できる |
std::vector<T>相当のコンテナ
1 2 3 4 5 6 7 8 9 10 |
using System.Collections.Generic; List<int> intArray = new List<int> { 1 }; intArray[0] = 4; intArray.Add(2); System.Console.WriteLine("arraySize: {0}\n", intArray.Count); |
テキストファイルからラインを読み込んで任意セパレータでstringの配列にする
1 2 |
string s = "comma separated some string"; string[] values = s.Split(','); |
stringの先頭を大文字にする
1 2 |
string str = "hoge"; string temp = char.ToUpper(str[0]) + str.Substring(1); |
stringの指定位置から指定文字数分を削除する
1 2 3 4 |
string ret = "a;;" int removeCount = 2; int pos = ret.Length - removeCount; string removedStr = ret.Remove(pos, removeCount); // ;; を削除 |
ディレクトリ内のファイルパス一覧を作成する
1 2 |
string srcDir = @"D:\prj\software\codegeneration\CommaSeparatedResource\Resource"; string[] filePaths = Directory.GetFiles(srcDir); |
cf. C# examples
Typeで分岐する
typeofを使用する。switchよりif文を使うのが綺麗。
1 2 3 |
if (serializerType == typeof(Generator.GpuDescriptor.GpuDescriptorAccessorGenerator)) { } |
参考:
https://stackoverflow.com/questions/43080505/c-sharp-7-0-switch-on-system-type
コメントを残す