C#文法メモ

<h2>配列</h2>
配列の宣言
`型名[] = 変数名;`

要素数の指定
`変数名　= new 型名[要素数];`

配列の宣言と要素数の指定
`型名[] 変数名　= new 型名[要素数];`

配列の初期化（配列の宣言と値代入）
`型名[] 変数名 = {値,　値 , 値};`

<h2>foreach文</h2>
```
foreach (型名　変数名　in 配列変数名) 
{
}
```

```
foreach (KeyValuePair<型名,　型名> 変数名 in Dictionary型の変数名)
{
//変数名.Key、変数名.ValueでKey、Valueを取得できる
}
```

<h2>List</h2>
List型の変数をつくる
`List<型名>　変数名  = new List<型名>();`

Listに要素を追加
`変数名.Add(追加する値);`

Listの要素数取得
`変数名.Count;`

Listから要素を削除
`変数名.RemoveAt(インデックス)`
`変数名.RemoveAt(削除したい値)`　
　　＊同じ値を持つ要素が複数ある場合、インデックスが一番小さい要素が削除される

Listを昇順に並び替える
`変数名.sort();`

<h2>Dictionary</h2>
Dictionary型の変数を作る
`Dictionary<キーの型、値の型>　変数名 = new Dictionary<キーの型、値の型>();`

Dictionaryに要素を追加
`変数名.Add(キー、値);`

Dictionaryからキーに対応する値を取得
`変数名[キー]`

<h2>int型</h2>
<h3>TryParse(string型の値、変換後の値が代入される変数)メソッド</h3>
string型をint型に変換し、正しく変換できればtrueを返す。
<h3>Parse(文字列型の値)メソッド</h3>
string型からint型に変換する。

<h2>string型</h2>
<h3>Split('文字')メソッド</h3>
引数に与えた文字で区切り、string型の配列にする。
<h3>Contains('文字')メソッド</h3>
判定する文字列の中に、引数で指定した文字が含まれてるか判定
<h3>StartsWith('文字')メソッド</h3>
判定する文字列の先頭に、引数で指定した文字が含まれてるか判定
<h3>EndWith('文字')メソッド</h3>
判定する文字列の末尾に、引数で指定した文字が含まれてるか判定

<h2>StreamReader型のメソッド</h2>
<h3>ReadLineメソッド</h3>
ファイルから一行読み取り文字列として返す。

<h2>DataSet型</h2>
<h3>データセット名（※小文字始まり）.データテーブル名.Addデータテーブル名Row(登録する１行分のデータ)メソッド</h3>
DataTableに値を追加

<h2>値型の引数を参照型として渡す</h2>
ref修飾子・・引数に渡す変数に予め値を代入すべし
out修飾子・・引数に渡す変数に予め値を代入せんでいい

<h2>DataGridView型</h2>
<h3>currentRow.Indexプロパティ</h3>
選択している行のインデックスを取得

<h2>プロパティ</h2>
アクセサ（getter, setter）を作る仕組み
アクセサを直接使うよりも簡潔にコードが書ける

```
public プロパティの型名　プロパティ名
{
  set
  {
    変数名 = value;
  }
  get
  {
    return 変数名;
  }
}
```

<h2>LINQ</h2>
配列やコレクションの中から条件を満たす値だけ取り出したり、各データに特定の処理をしたりできる。

配列やコレクションの中からラムダ式の条件に合うデータだけを取り出す
` var 変数名 = 配列やコレクションの変数名.Where(ラムダ式)`
※var・・代入された値によってコンパイラが自動的に型を判断

配列やコレクションのデータにラムダ式の処理を加えて新しいデータを作る
`var 変数名 = 配列やコレクションの変数名.Select(ラムダ式)`

要素数を取得する
`var 変数名 = 配列やコレクションの変数名.Count()`

<h2>オーバーロード</h2>
引数の型と個数が違うとき同じ名前のメソッドを複数定義できる

<h2>オーバーライド</h2>

オーバーライドされる基本クラスのメソッドの書き方

```
virtual　戻り値の型　メソッド名()
{
  メソッドの処理内容
}
```

オーバーライド（override）する派生クラスのメソッド書き方

```
override 戻り値の型　メソッド名()
{
  メソッドの処理内容
}
```

<h2>抽象クラスと抽象メソッド</h2>
抽象メソッド・・メソッドの処理は派生クラスで実装することを前提とした中身のないメソッド
抽象クラス・・抽象メソッドを１つ以上もつクラス

基本クラス


```
abstract class クラス名 //abstarctをつけるとこのクラスのインスタンスは生成できない
{
  public abstract 戻り値の型　メソッド名();　
}
```

派生クラス

```
class クラス名 : 基本クラス名
{
//抽象メソッドの中身を書かないとエラー
  public override 戻り値の型　メソッド名()
  {
    処理内容
  }
}
```

<h2>static</h2>
static・・クラスのメンバ変数やメンバメソッドにつけると、それらはインスタンスを作らずに呼び出せる

```
class Employee
{
public static string companyName;
}
```

```
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Employee.companyName);
        }
    }
```

<h2>partial</h2>
2つのファイルに分けてクラスを記述する場合、クラスの前につける。

```
public partial class Form1 : Form
{
  省略
}
```


<h2>構造体</h2>
構造体：値型　↔︎　クラス：参照型
ex）2次元座標を表すPoint型、ベクトルを表すVector型、色を表すColor型

```
struct 構造体名
{
  メンバ変数
　メンバメソッド
}
```

<h2>usingステートメント</h2>
usingのブロックを抜けるタイミングでそのクラスのDisposeメソッドを呼ぶ。
以下の場合は、Disposeメソッドによってファイルを閉じている。

```
            using (System.IO.StreamReader file =
                new System.IO.StreamReader(@"..\..\data.txt"))
            {
                while (!file.EndOfStream)
                {
                    string line = file.ReadLine();
                    string[] data = line.Split(',');
                    this.phonebook.Add(data[0], data[1]);
                }
            }

//＠をつけた文字列は、特殊な記号（エスケープシーケンス\ｎなど）を使っていない文字列として扱われる
```