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

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
編集の要約なし
==プログラミングC# 第7版(1)==
[[言語 まとめ C Sharp]] | [[C Sharp]] | [[C Sharp サンプルコード]] | [[Effective C Sharp 4.0]] | [[Universal Windows Platform]] | [[Visual Studio]] |
*[[プログラミングC# 第7版]]
*プログラミングC# 第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オートメーションと簡単に連携
==基本的なプログラミングテクニック==
===名前空間と型===
*単一の出力が生成されるソースファイルの集合
*.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 で宣言
#endif
*#error,#warning
#if SILVERLIGHTSILVE[[R]]LIGHT
#error silverlightをサポートしていません
#endif
!分類
!C#エイリアス型
![[.NET ]] Framework型
|-
|論理
*すべてのフィールドを0,false,nullで初期化する
*効率化、単純化
====[[C# ]] のデフォルトの == は、object.RefereceEquals と等価====
*値型には意味がない
public static bool operator ==(Hoge x, Hoge y) {...}
=====値を返すことを目的としている場合、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);
public string Name { get; } = "Yagi";
====プロパティおよび変更可能な値型====
using System.[[Windows]];
public class Hoge {
public Point Location { get; set; }
}
*個々のメンバーにアクセス修飾子は付与することはできない
*[[.NET ]] の大部分のインターフェースは名前は大文字のIで始まりパスカル記法
*実装する場合通常、インターフェースの各メソッドをpublicメンバーとする
====明示的な実装====
public static class HogeTypeExt
{
public static string GetReportDefNameGet[[R]]eportDefName(this HogeType hogeType)
{
string result = null;
====複数の制約====
*1つの型引数に対して複数の制約を課したい場合、リストとして並べる
public class Hoge<T> where T : IEnumerable[[IE]]numerable<T>, IDisposable, new() { ... }
====ゼロ系の値====
*default(型)
*C++のテンプレートとは全く異なる
==コレクション==
<blockquote>[[C#]]1.0から提供されているSystem.Collections と、System.Collections.Generic に分類できる。前者は古いライブラリで、ジェネリックに対応しておらず、現在ではほぼ利用しない。</blockquote>
===分類===
{|class="wikitable"
=====コピーとサイズ変更=====
*Array.Copy
*Array.Resize[[R]]esize*Array.Reverse[[R]]everse
*Array.Clear
===List<T>===
*var nums = new List<int> { 1,2,3 };
===リストインターフェースとシーケンスインターフェース===
=====[[.NET ]] Frameworkのコレクションインターフェース=====
*IList<T>
**ICollection<T>,IEnumrable[[IE]]numrable<T> も実装する必要がある
**List<T>,配列 は IList<T> を実装している
*ICollection<T>
**変更可能なコレクションに対する汎用インターフェース
**実装時には、IEnumerable実装時には、[[IE]]numerable<T> も提供する必要がある*IEnumerable[[IE]]numerable<T>
**実装者に対する要求が最も少ない
**列挙子を返す
**LINQ to Objects の核心を占める
<blockquote>IEnumerable[[IE]]numerable<T>を実装し、GetEnumeratorメソッドを定義するとクラスそのものを列挙可能にできる</blockquote>
====リストとシーケンスを実装する====
*IEnumerable[[IE]]numerable<T> または、IList<T> のどちらかの形式で情報を提供すると便利なことが多い*LINQ to Objects が提供する演算はすべて IEnumerable[[IE]]numerable<T>で動く
===イテレータ===
*yield を使って列挙可能なシーケンスを生成
*IEnumerable<T> を実装する言語サポートを実装する[[言語]]サポート public static IEnumerable[[IE]]numerable<int> Numbers(int start, int count) {
for (int i=0; i<count; i++) {
yield return start + i;
*リストが分かる方法を提供
*IList,IList<T>を実装
===ReadOnlyCollection[[R]]eadOnlyCollection<T>===
*変更不要なコレクションを提供
*リストのラッパーとして利用できる
====初期化====
*IEnumerable[[IE]]numerable<KeyValuePair<TKey,TValue>>
=====コレクション初期化構文を利用できる=====
var dic = new Dictionary<string,int> {
};
=====インデックス初期化子=====
*[[C#]]6から下記の初期化記法が追加されているこちらを推奨
var dic = new Dictionary<string,int> {
["One"] = 1,
=====Queue<T>=====
=====Stack<T>=====
===リンクリスト[[リンク]]リスト===
=====LinkedList<T>=====
=====利点=====
*共変性(covariance)
**共変性型パラメータ
**--public interface IEnumrable[[IE]]numrable<out T> : IEnumrable[[IE]]numrable**[[.NET ]] Framework 4 以降には、共変の型パラメーターを持つジェネリック インターフェイス**--IEnumerable[[IE]]numerable<T>、IEnumerator、[[IE]]numerator<T>、IQueryable<T>、IGrouping<TKey, TElement>
**--すべての型パラメーターは共変のみであるため、型パラメーターはメンバーの戻り値の型だけに使用
*反変性(contravariance)
**反変性型パラメータ
**--public interface ICompara<in T>
**[[.NET ]] Framework 4 以降には、反変の型パラメーターを持つジェネリック インターフェイス**--IComparer<T>、IComparable<T>、IEqualityComparer、[[IE]]qualityComparer<T> など
**--型パラメーターは反変のみであるため、これらの型パラメーターは、インターフェイスのメンバーのパラメーター型としてのみ使用
*数学の圏論[[数学]]の圏論(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() {}
<blockquote>プロパティにも適用される</blockquote>
<blockquote>オーバーライドは、virtualオーバーライドは、[[vi]]rtual/override のセットが前提だが、隠蔽は、派生クラスでnewするだけで利用可能。ただし、隠蔽ではポリモーフィズムは動作しない。</blockquote>
===sealedメソッドとクラス===
*sealed メソッドは virtual [[vi]]rtual の逆でオーバーライドができないようにシールする
*newで隠蔽することは可能
*メソッドはデフォルトでシールされている
===基底メンバへのアクセス===
=====base キーワード=====
*virtual [[vi]]rtual メソッドのディスパッチメカニズムを無効化
*オーバーライドされる元のメソッドを呼び出す
*base.OriginalMethod();
=====インスタンスフィールド初期化子は基底クラスの構築が行われるよりも先に行われる=====
===特別な基底型===
=====[[.NET ]] Framework 特別な基底型をいくつか定義=====
*System.Object
*System.ValueType
*GCは弱参照を追跡しない
*オブジェクトが弱参照からしか到達できないなら、GCはそれが到達不能なオブジェクトであるかのように扱う
*WeakReferenceWeak[[R]]eference<T>
=====メモリの回収=====
*CLRはヒープを世代で管理CL[[R]]はヒープを世代で管理
**世代
**--オブジェクトが何回GCを生き延びたか
**非常に短い生存期間のオブジェクトと非常に長い生存期間のオブジェクトは効率的に扱える
=====GCモード=====
*[[カテゴリ]]
**ワークステーション
**--デフォルト
**------非並行モードより多くのメモリを必要とし、全体としてスループットを落とす
**------バックグラウンドGC
**--------[[.NET ]] 4.0 並行GCの欠点に対する拡張
**--------フルGC中も、短命世代GC、ヒープ拡張を可能にする
**----非並行モード
**--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<T> where T : struct {
public readonly T Value;
===チェック例外===
*Javaでのチェック例外に相当するものはC[[Java]]でのチェック例外に相当するものはC#にはない
*メソッドが投げる例外をメソッド宣言には書けない
*Exceptionの派生クラス
====throw式====
*[[C#]]7以降では、式としてthrowを利用できる
=====条件演算子=====
*i < 0 なら例外
*アプリケーションが絶望的に破壊された場合
*例外は処理されてしまう可能性がある
*EnvironmentEn[[vi]]ronment.FailFast**CLRはメッセージをイベントログに書き込みWER([[Windows ]] Error Reporting)に詳細を提供しアプリケーションを終了
===例外型===
=====[[.NET ]] Frameworkには非常に多くの例外型を定義=====
*独自の例外を定義できるが、多くの場合既存から選ぶ
=====知っておくべき重要な例外型=====
**不適切な引数の基底クラス
**ArgumentNullException
**ArtgumentOutOfRangeExceptionArtgumentOutOf[[R]]angeException
**CultureNotFoundException
*AggregateExcepition
**アプリケーションによって生成される例外
*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 ]] のデバッガは未処理例外にステップイン
*デバッガの例外設定ダイアログで動作を設定できる
===非同期例外===
====マルチキャストデリゲート====
*2つ以上のメソッドを参照出来る
*[[.NET ]] Framework 以外で自分で定義したデリゲートの基底型
*マルチキャストの機能は、Combine 静的メソッドを通して利用出来る
*2つのデリゲートをとり、1つのデリゲートを返す
p += greaterThanTen;
p +=greaterThanOneHundred;
*Remove [[R]]emove ではなく、「-」「-=」 が利用出来る
*GetInvocationList
**メソッドを順に呼び出せる
}
====共通デリゲート型====
*[[.NET ]] Framework
**有用なデリゲート型を提供
**--汎用デリゲート型
**----Func
**------Actionとよく似るが、戻り値を返す
public delegate TResult T[[R]]esult Func<out TResultT[[R]]esult>(); public delegate TResult T[[R]]esult Func<in T1, out TResultT[[R]]esult>(T1 arg1); public delegate TResult T[[R]]esult Func<in T1, in T2, out TResultT[[R]]esult>(T1 arg1, T2 arg2);
:
**--ほとんどは特殊化されている
**------シリアルポートに対する処理を行うときにのみ用いられる
====型互換性====
*[[C#]]で定義するデリゲートはすべてMulticastDelegateから直接派生
*反変性
**反変 (contravariant) : 狭い型(例:float)から広い型(例:double)へ変換すること。
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
*Entity Framework
var expensiveProducts = dbCOntext.Products.Where(p => p.ListPrice > 3000);
*SQLクエリを生成[[SQL]]クエリを生成
WHERE [Extent1].[ListPrice] > cast(3000 as decimal(18))
====ラムダ式を伴うListクラスのメソッド====
|すべての要素が指定された条件に合致するか
|-
|RemoveAll[[R]]emoveAll
|指定された条件に合致する要素を削除
|-
**----対応するUI要素が使われなくなったら削除する
**----イベントソースがターゲットへの参照をもつ唯一のものであれば、弱参照を利用できる
**----[[WPF ]] では、WeakEventManager を提供
===イベントvs.デリゲート===
*新しい非同期機能に対応させてたい

案内メニュー