[[CSharp講座第四回]] #markdown{{ # 関数2 ## デリゲート 関数を変数のように扱う機能をデリゲート(委譲)といいます。 まずデリゲートの型を作ります。 ``` アクセシビリティ delegate 戻り値の型 デリゲート名(引数リスト); ``` 変数の作り方は他と同じです。 変数を関数のように呼び出すと登録された関数を呼び出すことができます。 #### 演習1 デリゲート LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。 ``` void Main() { A a = f; a(); } delegate void A(); void f() { 1.Dump(); } ``` ### マルチキャストデリゲート デリゲートは複数の関数を登録することができます。 #### 演習2 マルチキャストデリゲート LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。 ``` void Main() { A a = f; a+=f2; a(); a-=f; a(); } delegate void A(); void f() { 1.Dump(); } void f2() { 2.Dump(); } ``` ## ラムダ式 関数を簡単に書く方法がラムダ式です。ラムダ式はデリゲートを返します。 ``` (引数リスト)=>式; ``` ラムダ式の戻り値は式の戻り値と同じです。 #### 演習3 ラムダ式 LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。 ``` void Main() { A a = ()=>1.Dump(); a(); } delegate void A(); ``` ## イベント イベントとは外部から関数の登録と解除のみできるデリゲートです。 デリゲートの呼び出しはクラス内からのみ可能です。 #### 演習4 イベント LinqPadのLanguageをC#Programにしておきましょう。 以下の文字を入力し実行しましょう。 ``` void Main() { F f=new F(); f.a+=()=>2.Dump(); f.f(); } delegate void A(); class F { public event A a; public void f() { a(); } } ``` # ジェネリック ジェネリック(総称)とは型を引数にできる機能です。この機能が使えるのはクラスと関数です。 #### 演習5 ジェネリック LinqPadのLanguageをC#Programにしておきましょう。 ``` void Main() { F<int> f=new F<int>(); f.a=10; f.f(); F<double> f2=new F<double>(); f2.a=10.22; f2.f(); } class F<T> { public T a; public void f() { a.Dump(); } } ``` ジェネリックを使うのはコンテナという複数のデータを扱う時です。 #### 演習6 コンテナ LinqPadのLanguageをC#Programにしておきましょう。 ``` void Main() { List<int> l=new List<int>(); l.Add(10); l.Add(20); l.Add(30); l.Dump(); l.[2].Dump(); l[2].Dump(); Dictionary<int,double> d = new Dictionary<int,double>(); d[1]=1.1; d[5]=444; d.Dump(); d.[1].Dump(); d[1].Dump(); } ``` # 配列 コンテナの一つに配列があります。 配列は格納できる個数が固定です。また専用の構文があります。 ``` 型[] 変数名 = new 型[個数] ``` 配列にアクセスするには配列内の番号を指定します。番号は0から始まります。 #### 演習7 配列 LinqPadのLanguageをC#Statement(s)にしておきましょう。 ``` int[] i = new int[2]; i.Dump(); i[0]=9; i[1]=8; i.Dump(); ``` # foreach コンテナ複数の値を扱うことができますがコンテナの中を順に処理したいことがあります。ここで使えるのがforeachです。 ``` foreach(型 変数名 in コンテナの変数名) { 処理 } ``` #### 演習8 foreach LinqPadのLanguageをC#Programにしておきましょう。 ``` void Main() { List<int> l=new List<int>(); l.Add(10); l.Add(20); l.Add(30); foreach(var i in l) { i.Dump(); } } ``` var は型を推測してくれます。 # 文字列 C#では文字列をstring型として扱います。 また幾つかの便利な構文があります。 #### 演習9 文字列 LinqPadのLanguageをC#Statement(s)にしておきましょう。 ``` string s = ”Hello”; s.Dump(); s=$”Say {s}”; s.Dump(); s=@” a b c d ”; s.Dump(); ``` # コマンドライン引数 C#のプログラムはstaticなMain関数から始まります。その引数としてstring[]を指定するとコマンドライン引数を受け取ることができます。 ``` void Main(string[] args) ``` }}