C#の勉強記録5

前回は構造体まで。

今回は少し多めにいくぞ(土曜日で夜更かしできたから

列挙体

enumを使って定義する。
複数の定数を一つの変数を基にして呼び出せる。チームを作るような感じ。

例えば鍛えたい部位によって筋トレ方法をコンソールに出力させるメソッドを定義するとする(何それ?)
このとき、以下のように書くと可読性が上がる

enum muscles{
    hukkin,
    haikin,
    daikyokin 
}
class kintore{
    static void Main(){
    muscles bui = muscles.hukkin
        switch(bui){
            case muscles.hukkin:
            {
                Console.WriteLine("腹筋ローラー");
            }
            case muscles.haikin:
            {
                Console.WriteLine("懸垂");
            }
            case muscles.daikyokin:
            {
                Console.WriteLine("腕立て");
            }
        }
    }
}

みたいに書くとどんな処理をしようとしているか分かりやすい。

ちなみに、列挙体は内部でそれぞれの定数に数値を振っている。
上記だと各定数にこちらで値を振っていないので、勝手に上から0,1,2の数値が振られる。
最初の一つ目(この場合hukkin)だけに数値を与えるとそれ以降は1ずつプラスした値が割り振られる。
hukkin = -1,haikin,daikyokin と書いたら
hukkin = -1,haikin = 0,daikyokin=1 って感じ。

冒頭でこの手の定数を一つ一つバラで定義するとあとで読む人が「これ何のために使う定数?」って分からないし、書いてる最中に自分も「この定数は何て名前にしてたっけ?」みたいなことになりかねないので、単純でも割と便利かも。

例外

めっちゃ使うやつ~~~~!!!
エラーログがイミフなツール作ると後で困るやつ~~~~!!!
try{’例外が発生しそうなコード’}catch(’例外の種類’){’例外に対して行う処理’}ってのは今更細かく書かなくてもいいな。

自分でこの例外を作ろう。

class MyExceprion: Exception {
    public MyException(string msg): base(msg) {
    //完全に忘れてたけどこれ↑はコンストラクタ(インスタンス作成時に絶対実行させるメソッド)の書き方。Exceptionクラスにあらかじめ書かれてるんだね!
    }
}

~中略~
try {
    if (b<0) {
        throw new MyException("errordayo");
    }
}
catch(MyException e){
    Console.WriteLine(e.Message);
}finally{
    Console.WriteLine("end")
}

これで「b<0なら自分で定義したMyExceptionて例外出して「エラーだよ」て書くぞ!」になる。なんか一回業務で使った気がするなこれに関しては。

delegate

後から振り返るとこいつの重要さがめちゃくちゃ分かる…
delegateは簡単に言うと「メソッドを格納できる変数を作るためのやつ」だ。

delegate void yoisho();

例えばこのように書くと「戻り値ナシ、引数ナシのメソッドを格納できる変数の型」ができあがる。型名はyoisho。だっせ。

yoisho some = sayhello(){
    Console.Writeline("Hello");
};

みたいにyoisho型を使って作った変数にはメソッドを直接記入したり、よそで定義したメソッドを格納できる。ただし、delegateのルールに従わなくてはならない。この場合は戻り値ナシ、引数ナシのメソッドじゃないとダメ。

例えばConsole.Writeline()みたいに文字列を引数として渡さないといけない奴は渡せない。

さらにこの引数、複数のメソッドも格納できる。すっごい。

some += sayhi();

とかいう風に加筆して(sayhiはよそで定義したということにする)実行すると、sayhello()とsayhi()を続けて実行してくれる。
ただし、さっきも書いたようにdelegateのルールに従わないといけない。

このdelegateが次のラムダ式にばり重要だった。

匿名メソッドとラムダ式

例えば、処理の中で一度しか使わないメソッドがあったりすると、その一回のためにわざわざ定義するのはちょっとめんどくさい。一回しか使わないなら名前定義してそれ呼び出して...っていうのはちょっと大げさ。

そこで使えるのが①匿名メソッド。名前の通り「名前を必要としない」

さっきdelegateのとこで定義したdelegate yoishoを引き続き使う

yoisho = delegate {Console.WriteLine("yoisho");};  //この最後のセミコロン忘れないように。あくまで変数への格納だから。

こんな感じで使う。

delegateで作った変数に、delegate {処理}を代入するとこの処理を直接変数にしまい込める。めっちゃ楽。

次に②ラムダ式。なんかよく聞く。

これを使うとさっきのyoisho=~~は以下のように書く。

yoisho = () =>{
Console.WriteLine("yoisho");
};

いや、楽~

つまりラムダ式の記法は(変数) = (引数) =>{その引数で行う処理};←こういうこと。しかも、処理が一行の場合は

yoisho = () => Console.WriteLine("yoisho");

これでいい。

いや、楽~~~~~~~~~~~!!!

 

今日はここまで。