「[[マイクロソフト系技術情報 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]
単なる「delegate」代替なので、
[[匿名デリゲート>#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で取得可能)

***as, is式と拡張 [#beec3396]
-is式
--オブジェクトに指定された型との互換性がある場合、trueと評価される。
--(拡張)後続に変数を宣言し、trueと評価された場合、変数にキャストした値を代入する。

-as式
--互換性のある参照型または null 許容型間で特定の型変換を実行する。
--非互換の場合は、例外ではなく、nullを返す。
--以下の2つのコードは等価
 expression as type;
 expression is type ? (type)expression : (type)null;

**条件分岐 [#o1b4a1c0]

***as, is式と拡張 [#beec3396]

***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開発]], [[:プログラミング]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS