「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>.NET言語]] * 目次 [#o6a7ac42] #contents *概要 [#bbeab94d] 2000年から開発が始まったマイクロソフト([[アンダース・ヘルスバーグ>https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC%E3%82%B9%E3%83%BB%E3%83%98%E3%83%AB%E3%82%B9%E3%83%90%E3%83%BC%E3%82%B0]]率いるチーム)が設計・開発したプログラミング言語。 -構文はC言語や、C言語風に構文が設計されたC++やJavaなどの影響がある。 -構文以外についてはヘルスバーグが以前の所属であるBorlandで設計したDelphiからの影響がある。 -標準化機構に託して自由な利用を許す(ECMA-334、ISO/IEC 23270:2003、JIS X 3015)など、姿勢の変化がある。 *詳細 [#j1cdd26f] **パラダイム [#o10ee916] マルチパラダイム -構造化, 命令型、宣言型、手続き型 -イベント駆動型, オブジェクト指向 -ジェネリック -リフレクション -関数型, 並行計算 **型付け [#h5685ded] ***強い静的型付け [#ffb64525] ***マネージ型・アンマネージ型 [#m9bee403] -マネージ型 --System::Object クラスから派生する型 --ガベージ・コレクタの管理下に置かれる。 --Equals、GetHashCode、ToStringなどの基本メソッドを実装する。 -アンマネージ型 --組み込み型 --ポインタ型 --列挙型 --構造体(参照型のフィールド・プロパティを含まない) **他の言語との関係 [#qecbb3f2] ***影響を受けた言語 [#h64398a3] C++, Delphi, Eiffel, Java, LISP ***影響を与えた言語 [#z11133cd] D言語, F#, Java, Nemerle, Vala **その他 [#g6a53f1e] ***プラットフォーム [#nfcd3ddd] Windows, macOS, Linuxなど ***ライセンス [#jb6e24e1] Apacheライセンス (Roslyn) *スニペット [#rd342cba] 忘れ易いスニペット置き場が欲しかったので。 **変数定義 [#r8945e59] ***var [#o6d9cac4] 型推論を利用したローカル変数の宣言。~ 一時的に使用される型を簡単に定義する。 var her = new { Name = "Jane Doe", Age = 20 } var him = new { Name = "John Doe", Age = 20 } ***dynamic [#pb4362dc] -Dynamic Language Runtime(DLR)追加によりサポートされ、~ オブジェクトに対する操作のバインドは実行時まで遅延される。 -Reflectionやスクリプト言語との連携が容易になる。 ***ref変数 [#yb6adef2] 値型を参照型として扱う。 // ref戻り値をref変数で受け取る ref int max = ref Max(ref x, ref y); // limitとmaxは同じ値を参照する ref int limit = ref max; **クラス定義 [#dfda40f7] ***部分型 [#l8a5bdd3] 開発ツールなどが裏で使用していることが多い。~ (ユーザー・コーディング部分と、designer生成部分) class MyClass { int a; int b; } ↓↓↓ partial class MyClass { int a; } partial class MyClass { int b; } **プロパティ [#w02c7410] ***自動実装プロパティ [#k72517b2] メンバ変数+プロパティ・プロシージャの略記が可能。 private int __value; public int Value { get { return __value; } private set { __value = value; } } ↓↓↓ public int Value { get; private set; } **メソッド定義 [#p431bac5] ***オプション引数 [#ddfc223e] public int MethodB(int A = 0, int B = 0, int C = 0) { return A + B + C; } ***ref戻り値 [#e519d65d] [[ref変数>#yb6adef2]]で受け取る場合、~ ref戻り値として返すなどする。 ***名前付き引数 [#hd290800] 上記の[[オプション引数>#ddfc223e]]を選択的に指定できる。 public void MethodA() { // 第1引数と第2引数を指定、第3引数は未指定: Console.WriteLine("Ans: " + MethodB(1, 2)); // Ans: 3 … 1 + 2 + 0となっている // 第1引数と第3引数を指定、第2引数は未指定: Console.WriteLine("Ans: " + MethodB(A: 1, C: 3)); // Ans: 4 … 1 + 0 + 3となっている } ***ジェネリック [#i53b100a] クラスでも使用可能。STLっぽく書く(コンセプトは違うっポイ)。~ -TemplateとGeneric - 時計屋の雑記帳~ http://d.hatena.ne.jp/NetSeed/20081225/1230208222 -where (ジェネリック型制約) --https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/where-generic-type-constraint --https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/CS/Frameworks/Infrastructure/Framework/Util/UserInfoHandle.cs#L70 --C#7.3ではSystem.Enum, System.Delegate, unmanagedのジェネリック型制約の種類が追加された。 ***[[匿名デリゲート>ラムダ式って#s603d78e]] [#se46be4a] ***ラムダ式 [#s48cc77a] [[匿名デリゲート>#se46be4a]]に次ぐ「delegate」の拡張。 -C# 今更ですが、ラムダ式~ https://qiita.com/rawr/items/11790e9ea08a29d028a4 --定義側 public IEnumerable<string> Read(string path, Func<string, string> fx) { var result = new List<string>(); using (var reader = new StreamReader(path)) { while (reader.Peek() >= 0) { var line = reader.ReadLine(); result.Add(fx(line)); } } return result; } --呼出し側 XXXX.Read("hoge.txt", s => s + ".txt"); 上記のように「[[Action、Funcのデリゲートの型>ラムダ式って#s424189d]]」を使用する。 ***[[拡張メソッド]] [#q458a6d3] -継承せずにインスタンス・メソッドを追加定義。 -列挙型やインターフェイスにも適用可能。 -[[拡張メソッド]]定義側の名前空間をインポートしないと発見できないのがアレ -定義~ 第一引数のthisに当該インスタンス・メソッドを追加。 public static class StringUtil { public static string Repeat(this string str, int count) { var array = new string[count]; for (var i = 0; i < count; ++i) array[i] = str; return string.Concat(array); } } -利用~ 以下の、どちらの例も "foofoofoofoo" を返す。 // 静的メソッドとしての呼び出し StringUtil.Repeat("foo", 4); // 拡張メソッド(インスタンス・メソッド)としての呼び出し "foo".Repeat(4); ***[[非同期処理]] [#wab3d635] **初期化 [#rb02e6fb] ***配列 [#i9b340b1] -配列 int[] array1 = new int[] { 1, 3, 5, 7, 9 }; -List List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; -Dictionary Dictionary<string, string> openWith = new Dictionary<string, string>() { {"txt", "notepad.exe"}, {"bmp", "paint.exe"}, {"dib", "paint.exe"}, {"rtf", "wordpad.exe"} }; -匿名型の配列~ 型を省略できる(何らかの型に解釈されるが、object型での解釈はされずコンパイル・エラーになる) var a = new[] {"foo", "bar", null}; ***オブジェクト [#dcac4226] -memberの初期化 Point p = new Point{ X = 0, Y = 1 }; -memberのnew var x = new Line { A = { X = 1, Y = 2 }, B = { X = 3, Y = 4 }, }; - var(anonymous type) // anon is compiled as an anonymous type var anon = new { Name = "Terry", Age = 34 }; ***[[自動実装プロパティ>#k72517b2]] [#a901c520] C#6から[[自動実装プロパティ>#k72517b2]]の初期化が可能。 class Class1 { public string Auth { get; set; } = "BlahBlah"; } **演算子 [#e8999189] ***typeof [#n805e9a6] -System.Type型情報を取得する。 System.Type type = typeof(int); -.GetType()メソッドと同じ。 int i = 0; System.Type type = i.GetType(); ***sizeof [#r461c742] -[[アンマネージ型>#m9bee403]]のサイズを(バイト単位、int型で)取得。 -C# 2.0以降は「組み込み型」に対するsizeofに関してのみunsafeが不要 -Marshall.SizeOf メソッドとは違うので注意(こちらはインスタンスのサイズ)。 ***nameof [#af8939df] -変装や、クラス、メソッド、プロパティなどの名前(識別子)を文字列リテラルとして取得 -名前空間やクラス名などで修飾されていない名前(必要ならReflectionで取得可能) **条件分岐 [#o1b4a1c0] ***as, is式と拡張 [#beec3396] -is式 --オブジェクトに指定された型との互換性がある場合、trueと評価される。 --(拡張)後続に変数を宣言し、trueと評価された場合、変数にキャストした値を代入する。 -as式 --互換性のある参照型または null 許容型間で特定の型変換を実行する。 --非互換の場合は、例外ではなく、nullを返す。 --以下の2つのコードは等価 expression as type; expression is type ? (type)expression : (type)null; ***switch文と拡張 [#aba06705] C#では、break;を明記するものの、フォールスルーを禁止されている。 -定数パターン switch(変数) { case 値1: いくつかの文1 // 変数の値 == 値1 のとき実行される break; case 値2: いくつかの文2 // 変数の値 == 値2 のとき実行される break; ・ ・ ・ default: いくつかの文 // 変数の値がどの値とも異なるとき実行される break; } -型パターンとwhen句 void Decide(object obj) { switch (obj) { case int num when num < 0: Console.WriteLine($"{num}は負の数です。"); break; case int num: Console.WriteLine($"{num}を二乗すると{num * num}です。"); break; case "B": Console.WriteLine($"これはBです。"); break; case string str when str.StartsWith("H"): Console.WriteLine($"{str}はHから始まる文字列です。"); break; case string str: Console.WriteLine($"{str}は文字列です。"); break; case null: Console.WriteLine($"nullです"); break; default: Console.WriteLine("判別できませんでした"); break; } } ***三項演算子 [#ma61dd30] 以下の例で、始めにaを評価してその評価値が、 -真である時はbを評価してその評価値を返し、 -偽である時はcを評価してその評価値を返す。 int x = a ? b : c; -参考 --三項演算子?:は悪である。~ https://qiita.com/raccy/items/0b25b2f106e2a813828b --C#の三項演算子をリファクタリングする - PG日誌~ https://takachan.hatenablog.com/entry/2018/04/07/124034 ***null結合演算子 [#h3eca63a] -nullでない最初の値を返す。 object obj1 = null; object obj2 = new object(); object obj3 = new object(); return obj1 ?? obj2 ?? obj3; // obj2 を返す -Nullable型を非Nullable型に代入するときに便利 int? i = null; int j = i ?? -1; // nullをint型に代入することはできない *参考 [#lc4bd41f] -C Sharp - Wikipedia~ https://ja.wikipedia.org/wiki/C_Sharp **[[LINQ]] [#x0c4e8c9] **[[ラムダ式って]] [#a771ccd1] **[[拡張メソッド]] [#x76db9f1] ---- Tags: [[:.NET開発]], [[:プログラミング]]