| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
|*[[プログラミングC Sharp 第7版(2) | プログラミングC# 第7版(2)]] | [[C Sharp]] | [[C Sharp サンプルコード]] | [[Effective C Sharp 4.0]] | [[Universal Windows Platform]] | [[Visual Studio]] |
*[[プログラミングC Sharp 第7版]]
 
==プログラミングC# 第7版(1)==
[言語 まとめ C#][C#][C# サンプルコード][Effective C# 4.0][Universal Windows Platform][Visual Studio]*プログラミングC# 第7版*プログラミングC# Sharp 第7版(2)
{{amazon|4873116503}}
{{amazon|4798153826}}
==C#言語の基礎[[言語]]の基礎======[[.NET ]] Frameworkクラスライブラリ=========ユーティリティ機能([[.NET]])=====
=====Windowの機能をラップ=====
=====フレームワーク=====
====言語スタイル[[言語]]スタイル====
=====結合可能性=====
*小さく組み合わせやすく汎用の機能を重視
=====マネージドコード=====
*CLRに完全に依存するコードCL[[R]]に完全に依存するコード*IL(Intermediate Language) 中間言語中間[[言語]]
**コンパイル済プログラム
**--32bit、64bit問わない
**--別アーキテクチャでも実行可能
=====連続性とWindows体制連続性と[[Windows]]体制=====*[[C#]]4.0**OfficeやCOMオートメーションと簡単に連携[[Office]]やCOMオートメーションと簡単に連携
==基本的なプログラミングテクニック==
===名前空間と型===
**プロジェクトのプロパティで別の名前を指定可能
====推奨====
<&lt;blockquote>&gt;{企業名}.{技術名}.{機能名}.{サブ名前空間}<&lt;/blockquote>&gt;
Microsoft.AspNet.Identity.OWIN
====別名====
<&lt;blockquote>&gt;using 別名 = 名前空間<&lt;/blockquote>&gt;
using Hg = Foo.Bar.Hoge;
var h = new Hg.Hoge();
*単一の出力が生成されるソースファイルの集合
*.csproj 拡張子
*通常XML形式通常[[XML]]形式
*msbuild ツールでコマンドラインからビルドできる
*自動化テストを別プロジェクトへ分離
*.suo
**ユーザーごとの設定バイナリファイル
*[[Visual Studioでは常に1つのソリューションが必要Studio]]では常に1つのソリューションが必要
*テストプロジェクト
**ソリューションにテストプロジェクトを追加
**テスト対象のプロジェクトを設定
===コメントとリージョンと可読性===
=====XMLドキュメントコメント[[XML]]ドキュメントコメント=====
*コードを使用する際にツールチップ表示
*ドキュメントのみを公開することも可能
*@を頭につけることで、予約語を識別子として使用できる
*@は識別子とみなされない
*他言語との連携が主な用途他[[言語]]との連携が主な用途(C#では、eventは予約語だが、@eventとすることで利用できる)
===変数===
====動的型付け(dynamic型)====
*var、objectとは根本的に異なる
*[[.NET ]] Framework 4以降、DLR(Dynamic Language Runtime)が追加され、これに呼応した拡張
===定数===
*const で宣言
|}
<&lt;blockquote>&gt;※1 例えば、dllで宣言された const を exe で参照コンパイル後、dllの const値を変更、dllを差し替えてもexeの値は、元のまま。将来的にも不変な値だけをconstとすべき。読み取り専用の値はreadonly とまずはするとよい<&lt;/blockquote>&gt;
===宣言空間===
=====同じ名前が2つの異なる実体を参照してはいけない範囲=====
#endif
*#error,#warning
#if SILVERLIGHTSILVE[[R]]LIGHT
#error silverlightをサポートしていません
#endif
!分類
!C#エイリアス型
![[.NET ]] Framework型
|-
|論理
|-
|}
<&lt;blockquote>&gt;どちらも利用できるが、一般的にはエイリアスを優先して使用する<&lt;/blockquote>&gt;
=====数値リテラル=====
*StringBuilderは、修正可能な文字の並び
===演算子===
----=====(??) null合体演算子=====----
*string neverNull = s ?? "";
*左式がnullでなければその値、nullあら右式の値を返す
 
=====(?.) null条件演算子=====
----
*オブジェクトがnullでない場合だけメンバーにアクセスし、nullの場合、nullを返す
 
=====sizeof=====
----
*値型のサイズをバイト単位で取得
*sizeof(int)
=====nameof=====
----
*変数、クラス、メンバーなどの識別子を文字列リテラルとして取得
 
===文字列リテラル===
=====逐語的文字列リテラル=====
===クラス===
=====キーワードclassで定義された型はすべて参照型=====
=====Nullable<&lt;T>&gt;=====
*値型に対してもnullを許容するラッパー
*Nullable<&lt;int>&gt;
**int 型だが null を持てる
===構造体===
*すべてのフィールドを0,false,nullで初期化する
*効率化、単純化
====[[C# ]] のデフォルトの == は、object.RefereceEquals と等価====
*値型には意味がない
public static bool operator ==(Hoge x, Hoge y) {...}
public Hoge(int id, string name):this(id) {}
}
=====オブジェクト初期化子=====
<pre>
var p = new Persoin() {
Name = "Yagi",
Age = 49
};
 
</pre>
====静的コンストラクタ====
=====値を返すことを目的としている場合、outキーワードを指定する=====
*出力パラメータであることを指定
public static int DivideDi[[vi]]de(int x, int y, out int remainder) {
remainder = x % y;
return x / y;
*out キーワードを呼び出し側でも使用する
int r;
int q = DivideDi[[vi]]de(10, 3, out r);
*out はメソッドから呼び出し元へ情報が流れることを要請
*渡した値を読みだすとともに変更可能
*メソッドの引数だけが参照を使用できる
=====out呼び出し時にまとめて宣言可=====
int q = DivideDi[[vi]]de(10, 3, out int r);
{
int result = 0;
nums.ToList().ForEach(x => &gt; result += x);
return result;
}
public string Name { get; } = "Yagi";
====プロパティおよび変更可能な値型====
using System.[[Windows]];
public class Hoge {
public Point Location { get; set; }
===インデクサ===
*1つ以上の引数をとるプロパティで配列で用いられるのと同じ構文を使ってアクセス可能
var nums = new List<&lt;int> &gt; { 1,2,3 };
nums[2] += nums[1];
*インデクサのおかげで普通の配列のように利用できる
public string this[int index] {
get {
return index < &lt; 5 ? "Foo":"Bar";
}
}
*特定の演算子ではペアで定義することが必要
**==,!=
**>&gt;,<&lt;
=====カスタム型変換=====
public static explicit operator int(Counter value) {
}
*個々のメンバーにアクセス修飾子は付与することはできない
*[[.NET ]] の大部分のインターフェースは名前は大文字のIで始まりパスカル記法
*実装する場合通常、インターフェースの各メソッドをpublicメンバーとする
====明示的な実装====
public static class HogeTypeExt
{
public static string GetReportDefNameGet[[R]]eportDefName(this HogeType hogeType)
{
string result = null;
====匿名型のリスト====
var list = new List<&lt;dynamic>&gt;();
list.Add(new { Id="123",Name="abc" });
===部分型とメソッド===
*コンパイル時に別の型に置き換えることを可能とする
*プレースホルダー
*List<&lt;T> &gt; の T
====ジェネリック型====
*クラス、構造体、インターフェースはすべてジェネリックになることができる
public class Hoge<&lt;T> &gt; {
public Hoge(T x, string name) {
...
*完全な型となるためには、型パラメータが指定されなければならない
====制約====
*型パラメータで、コンストラクタを使用する
*:型引数が特定の要請を満たさなければならいことを明示できる
public static class Deferred<&lt;T> &gt; where T : new() {
private static T _instance;
public static T Instance {
*プロパティを最初に読みだすまでインスタンスは構築されない
*T は、引数なしのコンストラクタを供給する必要がある
 
/// <summary>
/// モデルからDTOを生成する
/// モデルがnullの場合、nullを返す
/// </summary>
/// <param name="model"></param>
/// <typeparam name="D"></typeparam>
/// <returns></returns>
public static D? FromModel<D>(T model) where D: ModelBaseDto<T>, new()
{
if (model == null)
{
return default(D);
}
var dto = new D();
dto._model = model;
return dto;
}
 
====型制約====
*特定の型と互換
public class Hoge<&lt;T> &gt; : ICompara<&lt;T> &gt; where T : IComparable<&lt;T> &gt; { ... }
====参照型制約====
public class Hoge<&lt;T> &gt; where T : class { ... }
*型引数を参照型に限定
*可能となる
**他のジェネリック型が使用できる
====値型制約====
public class Hoge<&lt;T> &gt; where T : struct { ... }
*型引数を値型に制約
*int など組み込み算術型に対しても有効
*Nullable<&lt;T> &gt; はこの制約を使用している
**通常、int? のように記述する
====複数の制約====
*1つの型引数に対して複数の制約を課したい場合、リストとして並べる
public class Hoge<&lt;T> &gt; where T : IEnumerable<[[IE]]numerable&lt;T>&gt;, IDisposable, new() { ... }
====ゼロ系の値====
*default(型)
*その型のデフォルトの初期値
*ジェネリックな型パラメータに対しても使用できる
static void PrintDefault<&lt;T>&gt;() {
Console.WirteLine(default(T));
}
====ジェネリックメソッド====
public static T GetLast<&lt;T>&gt;(T[] items) {
return item[item.Length -1 ];
}
int[] values = {1,2,3};
int last = GetLast<&lt;int>&gt;(values);
*ジェネリック型の中でも、以外でも定義できる
====型推論====
*C++のテンプレートとは全く異なる
==コレクション==
<&lt;blockquote>&gt;[[C#]]1.0から提供されているSystem.Collections と、System.Collections.Generic に分類できる。前者は古いライブラリで、ジェネリックに対応しておらず、現在ではほぼ利用しない。<&lt;/blockquote>&gt;
===分類===
{|class="wikitable"
**要素探索を行う最も素直な方法
*Array.FindIndex
int x = Array.FindIndex(nums, x=> &gt; x>&gt;0);
*Array.FidAll
**該当する複数要素
=====コピーとサイズ変更=====
*Array.Copy
*Array.Resize[[R]]esize*Array.Reverse[[R]]everse
*Array.Clear
===List<&lt;T>&gt;===
=====インデクサを備える=====
*サイズ可変の配列のようにふるまう
**配列 T[] を期待しているパラメータに List<&lt;T>&gt;は渡せない**IList<&lt;T> &gt; を期待しているパラメータには、配列もList<&lt;T>&gt;も渡すことができる
=====初期化子=====
*var nums = new List<&lt;int> &gt; { 1,2,3 };
===リストインターフェースとシーケンスインターフェース===
=====[[.NET ]] Frameworkのコレクションインターフェース=====*IList<&lt;T>&gt;**ICollection<&lt;T>&gt;,IEnumrable<[[IE]]numrable&lt;T> &gt; も実装する必要がある**List<&lt;T>&gt;,配列 は IList<&lt;T> &gt; を実装している*ICollection<&lt;T>&gt;
**変更可能なコレクションに対する汎用インターフェース
**実装時には、IEnumerable<実装時には、[[IE]]numerable&lt;T> &gt; も提供する必要がある*IEnumerable<[[IE]]numerable&lt;T>&gt;
**実装者に対する要求が最も少ない
**列挙子を返す
**LINQ to Objects の核心を占める
<&lt;blockquote>IEnumerable<&gt;[[IE]]numerable&lt;T>&gt;を実装し、GetEnumeratorメソッドを定義するとクラスそのものを列挙可能にできる<&lt;/blockquote>&gt;
====リストとシーケンスを実装する====
*IEnumerable<[[IE]]numerable&lt;T> &gt; または、IList<&lt;T> &gt; のどちらかの形式で情報を提供すると便利なことが多い*LINQ to Objects が提供する演算はすべて IEnumerable<[[IE]]numerable&lt;T>&gt;で動く
===イテレータ===
*yield を使って列挙可能なシーケンスを生成
*IEnumerable<&lt;T> を実装する言語サポート&gt; を実装する[[言語]]サポート public static IEnumerable<[[IE]]numerable&lt;int> &gt; Numbers(int start, int count) { for (int i=0; i<&lt;count; i++) {
yield return start + i;
}
}
}
===Collection<&lt;T>&gt;===*List<&lt;T> &gt; にと似ているがAPIがずっと小さい
*リストが分かる方法を提供
*IList,IList<&lt;T>&gt;を実装===ReadOnlyCollection<[[R]]eadOnlyCollection&lt;T>&gt;===
*変更不要なコレクションを提供
*リストのラッパーとして利用できる
===ディクショナリ===
=====Dictionay<&lt;TKey,TValue>&gt;=====*IDictionay<&lt;TKey,TValue> &gt; インターフェースを実装
=====TryGetValue=====
*データをディクショナリから探す
====初期化====
*IEnumerable<[[IE]]numerable&lt;KeyValuePair<&lt;TKey,TValue>>&gt;&gt;
=====コレクション初期化構文を利用できる=====
var dic = new Dictionary<&lt;string,int> &gt; {
{"One",1},
{"Two",2}
};
=====インデックス初期化子=====
*[[C#]]6から下記の初期化記法が追加されているこちらを推奨 var dic = new Dictionary<&lt;string,int> &gt; {
["One"] = 1,
["Two"] = 2
*大文字小文字を区別しないディクショナリ
var dic = new Dictionary<&lt;string, int>&gt;(StringComparer.InvariantCultureIgnoreCase);
=====ソート済みディクショナリ=====
*SortedDictionary<&lt;TKey,TValue>&gt;*SortedList<&lt;TKey,TValue>&gt;
===集合===
=====ISet<&lt;T>&gt;=====
*実装
**HashSet<&lt;T>&gt;**SortedSet<&lt;T>&gt;
===キューとスタック===
=====Queue<&lt;T>&gt;==========Stack<&lt;T>&gt;========リンクリスト[[リンク]]リスト========LinkedList<&lt;T>&gt;=====
=====利点=====
*要素の挿入削除が安価
===並行コレクション===
=====並行プログラミングの課題を解くよう設計=====
*ConcurrentQueue<&lt;T>&gt;*ConcurrentStack<&lt;T>&gt;*ConcurrentDictionary<&lt;TKey,TValue>&gt;*ConcurrentBag<&lt;T>&gt;*BlockingCollection<&lt;T>&gt;
===タプル===
*固定個数の要素を含むデータ構造
*各要素は異なる型でもよい
*8つの型引数を取る8タプルまで準備されている
Tuple<&lt;T1,T2>&gt;
*Item1,Item2 など読み取り専用プロパティで内容にアクセス
var four = Tuple.Create(1,"One",new[] {1,2}, 3.4);
int max = initial;
int min = max;
nums.ToList().ForEach(x => &gt; { max = (x > &gt; max) ? x : max; min = (x < &lt; min) ? x : min; });
return (max, min);
}
=====ジェネリッククラスから派生させる場合、型引数を渡さなければならない=====
*派生クラスがジェネリックではない
**public class NonGenericDerived : GenericBase<&lt;string> &gt; {}
**具体的な型を渡す
*派生クラスがジェネリック
**public class GenericDerived<&lt;T> &gt; : GenericBase<&lt;T> &gt; {}
**自身の型パラメータを渡す
*組み合わせ
**public MixedDerived<&lt;T> &gt; : GenericBase2<&lt;string, T> &gt; {}
**複数の型パラメータがある場合、2つの手法を組み合わせられる
=====共変性と反変性=====
*共変性(covariance)
**共変性型パラメータ
**--public interface IEnumrable<[[IE]]numrable&lt;out T> &gt; : IEnumrable[[IE]]numrable**[[.NET ]] Framework 4 以降には、共変の型パラメーターを持つジェネリック インターフェイス**--IEnumerable<[[IE]]numerable&lt;T>、IEnumerator<&gt;、[[IE]]numerator&lt;T>&gt;、IQueryable<&lt;T>&gt;、IGrouping<&lt;TKey,&#8194;TElement> &gt;
**--すべての型パラメーターは共変のみであるため、型パラメーターはメンバーの戻り値の型だけに使用
*反変性(contravariance)
**反変性型パラメータ
**--public interface ICompara<&lt;in T>&gt;**[[.NET ]] Framework 4 以降には、反変の型パラメーターを持つジェネリック インターフェイス**--IComparer<&lt;T>&gt;、IComparable<&lt;T>、IEqualityComparer<&gt;、[[IE]]qualityComparer&lt;T> &gt; など
**--型パラメーターは反変のみであるため、これらの型パラメーターは、インターフェイスのメンバーのパラメーター型としてのみ使用
*数学の圏論[[数学]]の圏論(category theory) から来ている
*一般に、共変の型パラメーターはデリゲートの戻り値の型として使用でき、反変の型パラメーターはパラメーター型として使用できます。
===System.Object(object)===
*宣言された型内部からのみ
=====private protected=====
*([[C# ]] 7.2 以降)包含クラス、または包含クラスから派生した型
====省略された場合のデフォルト====
===Virtual メソッド とオーバーライド===
*派生型で置き換えできるメソッド
*デフォルトでは virtual [[vi]]rtual ではない
*どのメソッドを呼び出すかは実行時に決定される
*オーバーライドする場合、override キーワードで明示する
*抽象メソッド(abstract method)
*virtual [[vi]]rtual メソッドはデフォルトの実装を提供せずに定義できる
*クラスも抽象クラスとなる
*一度公開されたインターフェースは変更してはいけない
**すべてのコードを完全に管理できている場合許される
*あらたな virtual [[vi]]rtual メソッドはほとんど問題をおこさない
===メンバーの隠蔽===
*public new void SomeMethod() {}
*newキーワードで明示しコンパイラ警告を抑制
<&lt;blockquote>&gt;プロパティにも適用される<&lt;/blockquote>&gt;
<&lt;blockquote>オーバーライドは、virtual&gt;オーバーライドは、[[vi]]rtual/override のセットが前提だが、隠蔽は、派生クラスでnewするだけで利用可能。ただし、隠蔽ではポリモーフィズムは動作しない。<&lt;/blockquote>&gt;
===sealedメソッドとクラス===
*sealed メソッドは virtual [[vi]]rtual の逆でオーバーライドができないようにシールする
*newで隠蔽することは可能
*メソッドはデフォルトでシールされている
===基底メンバへのアクセス===
=====base キーワード=====
*virtual [[vi]]rtual メソッドのディスパッチメカニズムを無効化
*オーバーライドされる元のメソッドを呼び出す
*base.OriginalMethod();
=====インスタンスフィールド初期化子は基底クラスの構築が行われるよりも先に行われる=====
===特別な基底型===
=====[[.NET ]] Framework 特別な基底型をいくつか定義=====
*System.Object
*System.ValueType
*GCは弱参照を追跡しない
*オブジェクトが弱参照からしか到達できないなら、GCはそれが到達不能なオブジェクトであるかのように扱う
*WeakReference<Weak[[R]]eference&lt;T>&gt;
=====メモリの回収=====
*CLRはヒープを世代で管理CL[[R]]はヒープを世代で管理
**世代
**--オブジェクトが何回GCを生き延びたか
**非常に短い生存期間のオブジェクトと非常に長い生存期間のオブジェクトは効率的に扱える
=====GCモード=====
*[[カテゴリ]]
**ワークステーション
**--デフォルト
**------複数の論理プロセッサ時デフォルト
**------意図的に無視したい場合
**--------<&lt;gcConcurrent enabled="fales”/>&gt;
**------GC間でのスレッドの停止時間を最小限に抑える
**------GCが発生している間でも、コードが実行し続けられるようにすることが目的
**------非並行モードより多くのメモリを必要とし、全体としてスループットを落とす
**------バックグラウンドGC
**--------[[.NET ]] 4.0 並行GCの欠点に対する拡張
**--------フルGC中も、短命世代GC、ヒープ拡張を可能にする
**----非並行モード
**----web.config
**----App.config
<&lt;runteme>&gt; <&lt;gcServer enabled="true">&gt; <&lt;/runtime>&gt;
**--論理プロセッサが複数ある場合にのみ利用可能
**--スループットはワークステーションより優れる
**--GCの間はすべてのCPUコアを同時に使用する
**----ワークステーションよりかなり多くのメモリを使用する
**--[[.NET4NET]]4.5 からは、バックグラウンドGCも利用可能
=====コンパクションの不慮の死=====
*CLRはヒープブロックの再配置を選択的に行わないようにするCL[[R]]はヒープブロックの再配置を選択的に行わないようにする
**GCはI/O操作の途中でも可能
**一部のヒープブロックは固定できる
**----フィールドや配列要素といった記憶域の位置への生ポインタを取得することができる
**--相互運用性を介す
**----COMコンポーネントやWin32 [[COM]]コンポーネントやWin32 API のようなアンマネージドコード
**----ポインタを必要とするAPIは自動的にブロックを固定
**--I/Oベースのストリーム実装
====デストラクタとファイナライゼーション====
=====ファイラナライゼーション=====
*CLRがもうすぐ削除されようとしていることをオブジェクトに告げるCL[[R]]がもうすぐ削除されようとしていることをオブジェクトに告げる
=====デストラクタ=====
public class Hoge {
*Finalize メソッドをオーバーライドしてコンパイルされる
*デストラクタ内部から他のオブジェクトを利用することは保証されない
*ハンドラによって表現されたエンティティが使われなくなったことをCLRに関係ないものに伝えるコードを置く場所ハンドラによって表現されたエンティティが使われなくなったことをCL[[R]]に関係ないものに伝えるコードを置く場所
=====重大なファイナライザ=====
*CriticalFinalizerObject から派生したクラスのファイナライザ
**2つの保証
**--有効な時間制限を超えていてもファイナライザに実行機会を与える
**--到達不能であることを同時に発見したオブジェクト群に対してCLRは重大なファイナライザを行う前に通常のファイナライザを実行到達不能であることを同時に発見したオブジェクト群に対してCL[[R]]は重大なファイナライザを行う前に通常のファイナライザを実行
**----自分自身のファイナライズでそのオブジェクトを使用することは安全
**SafeHandle クラス
**--[[.NET ]] にハンドルをラップするのに好ましい
**--CreticalFinalizeObject から派生している
====IDisosable====
**IDisposable を実装したオブジェクトを使い終わったらDisposeを呼び出す
**複数のリソースを使用するにはusingを重ねる
using(Stream src=File.OpenReadOpen[[R]]ead(@"C:\work\test.txt"))
using(Stream dst=File.Create(@"C:\work\out.txt"))
{ ... }
=====型オブジェクトの変数に値型を参照できるようにする=====
=====オブジェクト変数はヒープ上のものの参照を保持するだけ=====
=====[[概念]]===== public class Box<&lt;T> &gt; where T : struct {
public readonly T Value;
public Box(T v) {
=====object 型に box 化された int を取り出すのに、(int)o と書ける=====
=====組み込みの値型だけではなく、すべての構造体に対して自動的に利用できる=====
=====Nullable<&lt;T> &gt; のボックス化=====*Nullable<&lt;int> &gt; の代わりに、int? と書ける
*すべて成功
object boxed = 42;
===チェック例外===
*Javaでのチェック例外に相当するものはC[[Java]]でのチェック例外に相当するものはC#にはない
*メソッドが投げる例外をメソッド宣言には書けない
*Exceptionの派生クラス
====throw式====
*[[C#]]7以降では、式としてthrowを利用できる
=====条件演算子=====
*i < &lt; 0 なら例外 Console.WriteLine(i >&gt;= 0 ? i : throw new Exception("minus"));
=====null合体演算子=====
*strがnulllなら例外
=====式形式のラムダ式/メソッド=====
*例外をスローするだけ
void Hoge() => &gt; throw new NotSupportedException("not implemented");
====例外を再スロー====
*間違った例
*アプリケーションが絶望的に破壊された場合
*例外は処理されてしまう可能性がある
*EnvironmentEn[[vi]]ronment.FailFast**CLRはメッセージをイベントログに書き込みWER([[Windows ]] Error Reporting)に詳細を提供しアプリケーションを終了
===例外型===
=====[[.NET ]] Frameworkには非常に多くの例外型を定義=====
*独自の例外を定義できるが、多くの場合既存から選ぶ
=====知っておくべき重要な例外型=====
**不適切な引数の基底クラス
**ArgumentNullException
**ArtgumentOutOfRangeExceptionArtgumentOutOf[[R]]angeException
**CultureNotFoundException
*AggregateExcepition
*NotSupportedException
**インターフェースが要求したときにスロー
**例えばIList<&lt;T> &gt; はコレクションを変更するメソッドを定義しているが、コレクションが変更可能である必要はない
**読み取り専用の場合、変更するメンバからスローする
===カスタム例外===
**アプリケーションによって生成される例外
*SystemException
**[[.NET ]] Framework によって生成される例外
*これらのどちらからの派生も避けるべき
*もともとの意図に反し効果的な区別ではない
*既存の例外を特殊化したものは除く
*Exceptionはエラーのテキストで説明すべき
*直接記述する代わりに Sytem.Resource [[R]]esource 名前空間の機能でローカライズするようにもできる=====[[.NET ]] Framework のクラスライブラリ設計ガイドライン=====
*例外はシリアライズ可能にすべき
*シリアライズ化は継承されない
*クラス宣言の前に[Serializable] 属性を追加する
*ISerializable のメンバーだけをオーバーライドする
*HResultプロパティを設定するかどうかH[[R]]esultプロパティを設定するかどうか
*相互運用性の境界に到達すると重要な意味を持つ
*[[.NET ]] の例外はアンマネージコードに伝搬できない*例外を表すエラーに最も相当するCOMエラーコードを返すべき例外を表すエラーに最も相当する[[COM]]エラーコードを返すべき*FileNotFoundException の HResultH[[R]]esult=0x80070002*Win32 SDK ERROR_FILE_NOT_FOUND E[[R]][[R]]O[[R]]_FILE_NOT_FOUND に相当
===未処理例外===
=====CLRは未処理例外がスタックの最上位に到達したことを発見する方法を提供するCL[[R]]は未処理例外がスタックの最上位に到達したことを発見する方法を提供する=====
static void Main(string[] args)
{
*ログを置く場所の提供
=====フレームワークで未処理例外を処理=====
*[[ASP.NET]]
**globa.aspx
**--Application_Error メソッド
*[[WPF]]
**Application クラス
**--DispatcherUnhandleException イベント
*Windowsフォーム[[Windows]]フォーム
** Application クラス
**--ThreadException メンバ
=====デバッグと例外=====
*デフォルトではVisual デフォルトでは[[Visual Studio ]] のデバッガは未処理例外にステップイン
*デバッガの例外設定ダイアログで動作を設定できる
===非同期例外===
===デリゲート型===
====デリゲートパラメータを持つメソッド====
*public static int FindIndex<&lt;T> &gt; (T[] arry, Predicate<&lt;T> &gt; match)
*predicate(述語、プレディケート)
**あるものが真か偽を判断する機能
**Predicate<&lt;T>&gt;デリゲート型 public delegate bool Predicate<&lt;T>&gt;(T obj)
====アクセシビリティ====
*他の型同様
**--bool Hoge(object o)
**----いずれとも互換
**------Predicate<&lt;object>&gt;**------Predicate<&lt;string>&gt;
====生成====
=====new キーワード=====
*通常コンストラクタへの引数を渡す個所に互換性を持つメソッドの名前を指定できる
var p = new Predicate<&lt;int>&gt;(IsGreaterThanZero);
*実際には new をデリゲートに使用することはほとんどない
*コンパイラが推論できない場合のみ
=====暗黙的作成=====
Predicate<&lt;int> &gt; p =IsGreaterThanZero;
*他のクラスのメソッドへのデリゲート
Predicate<&lt;int> &gt; p = OtherClz.IsGreaterThanZero;
*インスタンスメソッドも参照できる
*スコープ内で名前によって参照
====マルチキャストデリゲート====
*2つ以上のメソッドを参照出来る
*[[.NET ]] Framework 以外で自分で定義したデリゲートの基底型
*マルチキャストの機能は、Combine 静的メソッドを通して利用出来る
*2つのデリゲートをとり、1つのデリゲートを返す
*戻り値は最後に実行されたメソッドのものが返される
*実際はCombineメソッドではなく、「+」「+=」 を利用
Predicate<&lt;int> &gt; p = gereaterThanZero;
p += greaterThanTen;
p +=greaterThanOneHundred;
*Remove [[R]]emove ではなく、「-」「-=」 が利用出来る
*GetInvocationList
**メソッドを順に呼び出せる
====呼び出し====
*メソッドパラメータ、プロパティとして使うことも可能
public static int Hoge(Predicate<&lt;int> &gt; userCallback) {
return userCallback(42);
}
====共通デリゲート型====
*[[.NET ]] Framework
**有用なデリゲート型を提供
**--汎用デリゲート型
**------戻り値 void
public delegate void Action();
public delegate void Action<&lt;in T1>&gt;(T1 arg1); public delegate void Action<&lt;in T1, in T2>&gt;(T1 arg1, T2 arg2);
:
**----Func
**------Actionとよく似るが、戻り値を返す
public delegate TResult T[[R]]esult Func<&lt;out TResult>T[[R]]esult&gt;(); public delegate TResult T[[R]]esult Func<&lt;in T1, out TResult>T[[R]]esult&gt;(T1 arg1); public delegate TResult T[[R]]esult Func<&lt;in T1, in T2, out TResult>T[[R]]esult&gt;(T1 arg1, T2 arg2);
:
**--ほとんどは特殊化されている
**------シリアルポートに対する処理を行うときにのみ用いられる
====型互換性====
*[[C#]]で定義するデリゲートはすべてMulticastDelegateから直接派生
*反変性
**反変 (contravariant) : 狭い型(例:float)から広い型(例:double)へ変換すること。
*共変性
**共変 (covariant): 広い型(例:double)から狭い型(例:float)へ変換
Predicate<&lt;object> &gt; po =IsLongString; Predicate<&lt;string> &gt; ps = po;
*不変性
**不変 (invariant): 型を変換できないこと。
delMethod.EndInvoke(res); // 実行が遅延される
**--非同期デリゲート呼び出し
**----[[.NETの初期は一般的だったNET]]の初期は一般的だった
**----現在ではあまり広く使われない
**------[[.NET4NET]]4.0 で導入
**--------タスク並列ライブラリ(Task Parallel Library :TPL)の導入
**--------これを用いれば、スレッドプールのサービスを柔軟かつ強力に抽象化できる
**------非同期プログラミングモデル(Asynchronous Programming Model)という古い形式
**--------C#の新しい非同期言語機能にうまく適合していないの新しい非同期[[言語]]機能にうまく適合していない**------[[C#]]2.0 でインラインメソッドが導入された
**--------1スレッドから別スレッドへ値の集合を簡単に渡す方法の優れた手段
====インラインメソッド====
**--引数リストを完全に省略できる利点
EventHandler clickHandler = delegate { Debug.Writeline("Clicked");};
*[[.NET ]] 3.5
====標準ライブラリで用意されているデリゲート====
{|class="wikitable"
|-
|Func
|TResult型の値を返すメソッドT[[R]]esult型の値を返すメソッド
|-
|Comparision
|}
===ラムダ式===
*delegateキーワードは書かずに、=> &gt; で引数とメソッド本体とをつなぐ int idx = Array.FindIndex(ary, x => &gt; x == 5);
====バリエーション====
*本体が1文の場合、ブロック {} を省略可能
*引数が1つの場合、引数の括弧も省略可能
*引数がない場合の括弧は省略できない
Predicate<&lt;int> &gt; p1 = value => &gt; value > &gt; 0; Predicate<&lt;int> &gt; p2 = (value) => &gt; value > &gt; 0; Predicate<&lt;int> &gt; p3 = (int value) => &gt; value > &gt; 0; Predicate<&lt;int> &gt; p4 = value => &gt; { return value > &gt; 0; }; Predicate<&lt;int> &gt; p5 = (value) => &gt; { return value > &gt; 0;}; Predicate<&lt;int> &gt; p6 = (int value) => &gt; { return value > &gt; 0;};
*引数のないラムダ
Func<&lt;bool> &gt; isAfternoon = () => &gt; DateTime.Now.Hour &gt;= 12;  <pre>Func<string, string> normalizeField = field =>field?.Trim().ToUpper();var compareHeaders = 12headerFields.Select(normalizeField).ToList();</pre> 
====キャプチャされた変数====
*インラインメソッドからその外側のメソッドの変数参照ができる
public static Predicate<&lt;int> &gt; IsGreaterThan(int threshold) { return value => &gt; value > &gt; threshold;
}
Predicate<&lt;int> &gt; greaterThanTen = IsGreaterThan(10);
bool result = greaterThanThen(200);
====ラムダと式ツリー====
*他にも隠れた機能
*データ構造を作成できる
*Expression<&lt;T>&gt;
*Tはデリゲート型
*Expression 自体はデリゲートではない
*Entity Framework
var expensiveProducts = dbCOntext.Products.Where(p => &gt; p.ListPrice > &gt; 3000);*SQLクエリを生成[[SQL]]クエリを生成 WHERE [Extent1].[ListPrice] > &gt; cast(3000 as decimal(18))
====ラムダ式を伴うListクラスのメソッド====
[[Category:ラムダ]]
 
*Listクラスでは、引数に対してラムダ式を指定できるメソッドが多く用意されている。
{|class="wikitable"
|すべての要素が指定された条件に合致するか
|-
|RemoveAll[[R]]emoveAll
|指定された条件に合致する要素を削除
|-
|}
 
===イベント===
=====基本=====
*宣言
public class Eventful {
public event Action<&lt;string> &gt; Announcement;
public void Announce(string message) {
if (Announcement != null) {
*扱い
var souce = new Eventful();
source.Annoucement += m => &gt; Console.WriteLine("msg:" + m);
=====標準的なイベントデリゲートパターン=====
*最もシンプルで広く利用
**----対応するUI要素が使われなくなったら削除する
**----イベントソースがターゲットへの参照をもつ唯一のものであれば、弱参照を利用できる
**----[[WPF ]] では、WeakEventManager を提供
===イベントvs.デリゲート===
*新しい非同期機能に対応させてたい
**ハンドラを削除する必要がある場合
**--イベントは最良の選択肢
**高度な機能を必要とする場合、IObsevable<&lt;T> &gt; が最良の選択肢となる
**ターゲットメソッドが1つだけであることが明白
**--メソッドまたはコンストラクタへの引数としてデリゲートを渡すのが一般的
**複数の関連するコールバックを提供する必要がある
===非同期機能===
----
====async と await====
----
=====async=====
*指定すると、このメソッド内で非同期機能を使用する予定であることをコンパイラに通知
=====await=====
*asyncが指定された場合のみ指定できる
*asyncを指定しない、非同期メソッドから、非同期メソッドを使用する場合、.GetAwaiter().GetResult(); を使用する
<pre>
public ContentResult Hoge(HttpRequestMessage request)
{
var json = request.Content.ReadAsStringAsync().GetAwaiter().GetResult();
return Content(json);
}
</pre>

案内メニュー