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 yoishoを引き続き使う
yoisho = delegate {Console.WriteLine("yoisho");}; //この最後のセミコロン忘れないように。あくまで変数への格納だから。
こんな感じで使う。
delegateで作った変数に、delegate {処理}を代入するとこの処理を直接変数にしまい込める。めっちゃ楽。
次に②ラムダ式。なんかよく聞く。
これを使うとさっきのyoisho=~~は以下のように書く。
yoisho = () =>{
Console.WriteLine("yoisho");
};
いや、楽~
つまりラムダ式の記法は(変数) = (引数) =>{その引数で行う処理};←こういうこと。しかも、処理が一行の場合は
yoisho = () => Console.WriteLine("yoisho");
これでいい。
いや、楽~~~~~~~~~~~!!!
今日はここまで。