基礎からしっかり学ぶC#の教科書　健忘録

# 概要
https://www.amazon.co.jp/%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E5%AD%A6%E3%81%B6C-%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E6%94%B9%E8%A8%82%E6%96%B0%E7%89%88-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E9%96%A2%E9%80%A3%E6%9B%B8-WINGS%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88/dp/4822286533

の内容まとめになります
基礎的な内容がメインになります

# クラス
**・静的メンバ**
```
class Car{
    public int num;
    public static int seats;
}
```
役割　複数のインスタンス内で同じ変数を共有する
説明　クラスをインスタンス化することなくアクセスすることができる　
例)　Console.WriteLine();　はConsoleクラス内に静的メンバWriteLine()が宣言されているためConsole con = new Console(); とかしてインスタンスを生成する必要は無い
注意点
静的メンバはseatsでクラス内に宣言されているが, インスタンスは独立でなく変数の変更はすべてのインスタンスに反映される（インスタンスでseatsを共有する考えかた）
アクセスはクラス.seats　と記述する　→　特定のクラスに属していないため

**・静的コンストラクタ**
役割　静的メンバを初期化する
説明　静的メンバはインスタンス同士で共有されるためコンストラクタにより初期化する場合, インスタンスするたびにすべてのクラスの性的メンバが初期化される. そのため初めてのインスタンス　と　初めて値を参照する場合のみに初期化する処理を行う必要がある. その役割を静的コンストラクタが担う　
通常のコンストラクタは静的コンストラクタの後に呼び出される
```
class Car {
    static Car(){
        seats = 3;
    } 
}
```


**・静的クラス**
役割　クラスから複数のインスタンスを生成できるが, インスタンスを複数作成可能ということと, インスタンスを複数個作るかは別の問題. それぞれのクラスで都度インスタンスを生成するのではなく, 1つのインスタンスを生成しておいて, 複数クラスでそれを使い回せばよい場合が存在すする　 例)Console クラス
他の開発者に必要以上にインスタンスすることを防ぐことができる. 

説明　静的メンバしか含めることはできない　また, 静的クラスのインスタンスを作成しようとするとエラーになる　プログラム実行時に自動でインスタンスが生成される.　
```
static class Sample
{
    // 静的コンストラクタ
    static Sample() { }
    // 静的フィールド
    static public int X;
    // 静的メソッド
    static public void Method() { }
}
```

# 継承
**・概要**
継承する際に　基本クラスと派生クラスで同じ役割のメソッドが被るときに処理がどうなるかまとめた

**・継承の記述法**
継承の記述法は以下
派生クラスでは基本クラスのメンバを使用できる　
```
    class 派生クラス : 基本クラス{    
    }
```

**・継承とコンストラクター**
説明　派生クラスのインスタンス生成時に基本クラスのコンストラクタと派生クラスのコンストラクタが呼び出される　そのときに呼び出される順番は　
派生クラスのフィールド初期化　→　基本クラスのコンストラクタ　→　派生クラスのコンストラクタ
ただしここで呼び出されるコンストラクタはパラメータの無い規定のコンストラクタであるため, 引数を渡したい場合, 明示的に行う必要がある

**・コンストラクタ初期化子**
役割　基本クラスで定義されたパラメータつきコンストラクタを派生クラスインスタンス時に呼び出す
説明　Derivedをインスタンスした場合, 派生クラスのコンストラクタと基本クラスの引数1のコンストラクタが呼び出される

```
class 基本クラス {
    //引数のあるコンストラクタ
    public 基本クラス(string s){
    } 
}
class 派生クラス: 基本クラス{
    //コンストラクタ初期化子
    派生クラス(string s1 , string s2) : base (string s2)   {

    }
}
    
```

**・隠蔽**
役割　継承した基本クラスのメンバーを隠す　これにより基本クラスの一部のメソッドを派生クラスで独自に再定義できる
説明　newを使用し再定義する

```
class 基本クラス {
    public int type = 1;
    public void Info(){}
}
class 派生クラス: 基本クラス{
    //基本クラスのメソッドを隠蔽する
    new public int type = 2;
    new public void Info(){}
}
    
```

**・this　と　base**
役割　基本クラスのメンバーにアクセス
説明　this で自身のクラスのメンバにアクセスでき, base で基本クラスのメンバにアクセスできる
```
class 基本クラス {
    public int type = 1;
}
class 派生クラス: 基本クラス{
    //基本クラスのメソッドを隠蔽する
    new public int type = 2;
    new public void Info(){ 
        Console.WriteLine(this.type);//2
        Console.WriteLine(base.type);//1
        
    }
}
```

**・override **
役割　基本クラスのメソッドを派生クラスで書き換える
説明　基本クラスのvirtualキーワードを付加したメンバをoverride できる　条件は名前,パラメータリスト ,戻り値の型が同じ場合　 
```
class 基本クラス {
    virtual public void Info(){ 
        Console.WriteLine("a");
    }
}
class 派生クラス: 基本クラス{
    //基本クラスのメソッドを隠蔽する
    public override void Info(){ 
        Console.WriteLine("b");
    }
}
class MainClass{
    static void Main(){
        派生クラス s = new 派生クラス();
        //overrideしたため　b　が表示される
        s.Info();//b
    }
}
```


# カプセル化
private protected public でアクセスできるクラスを制限すること

**・プロパティ**
役割　フィールドをカプセル化しメソッドでのみアクセスできるように制限する場合(この時のメソッドをアクセサという)簡潔に書くためにプロパティを使用する

説明　
```
class TypeClass{
    private type = 0;
    public int Type{
        set{
            this.type = value;
        }
        get{
            return this.type;
        }
    }
}
class MainClass{
    static void main(){
        TypeClass m = new TypeClass();
        m.Type = 1;//setが呼び出される
        Console.WriteLine(m.type);//getが呼び出される
    } 
}
```
**・自動プロパティ**
上記は長くget set に代入以外の意味を持たせていない　→　同じ役割をもつ簡潔な書き方は以下
Typeを変数のように使用できる　←　カプセル化する意味あるのか
```
class TypeClass{
    public int Type{get; set;}
}
class MainClass{
    static void main(){
        TypeClass m = new TypeClass();
        m.Type = 1;//setが呼び出される
        Console.WriteLine(m.type);//getが呼び出される 1
    } 
}
```

**・オブジェクト初期化子**
役割　パラメータつきのコンストラクタを持ちいずに複数のメンバに値を割り当てれる
説明　インスタンス時に初期化子を指定する.  コンストラクタ　→　オブジェクト初期化子の順に呼び出される
```
class SampleClass{
    public int v1 = 1;
    //コンストラクタ
    SampleClass(){Console.WriteLine(this.v1);}
}
class MainClass{
    static void Main(){
        //オブジェクト初期化子設定
        SampleClass s = new SampleClass{v1 = 2;}//1
        Console.WriteLine(s.v1);//2
}
```


**・パーシャルクラス**
役割　クラスを複数のファイルに分割して記述できる

説明　宣言とメソッドを別に分けることができ, どちらかだけでもコンパイルエラーは起きない
```
partial class TypeClass{
    public int a = 1;
}
partial class TypeClass{
    public void Test(){
        Console.WriteLine(a);
    }
}
class MainClass{
    static void main(){
        TypeClass m = new TypeClass();
        m.Test();//1
    } 
}
```


**・**
役割　

説明　
```
    
```


**・**
役割　

説明　
```
    
```


**・**
役割　

説明　
```
    
```




**・**
役割　

説明　
```
    
```




# 

#