- 追加された行はこの色です。
- 削除された行はこの色です。
「[[マイクロソフト系技術情報 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]
値型を参照型として扱う。
**初期化 [#rb02e6fb]
// ref戻り値をref変数で受け取る
ref int max = ref Max(ref x, ref y);
// limitとmaxは同じ値を参照する
ref int limit = ref max;
***配列 [#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 };
**クラス定義 [#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開発]], [[:プログラミング]]