cmatome @ ウィキ

11_列挙型 名前空間


列挙型Enum

Enumの基本的な書き方

特定のものしか代入できなくした型
enum Toho{Marisa, Reimu, Nitori, Chirno}
これで、Toho型の変数にはMarisa~Chirnoの4つ以外は代入無理。
動画のプログラム
using System;

class Test13{
    enum Toho{Marisa, Reimu, Nitori, Chirno};    //ここのセミコロンはつけなくてもおk

    public static void Main(){
        Toho toho = Toho.Marisa;    //Toho.Marisaが○。Marisaだけ×
        if(toho==Toho.Marisa)
            Console.WriteLine("やっぱり魔理沙!");
        else if(toho==Toho.Reimu)
            Console.WriteLine("やっぱり霊夢!");
        }
}
動画の説明だけでenumはどんな風に使うのかわかると思います。
この程度ならifでもいいけど、列挙型や条件が多くなるとうざいから
switch~case を使うほうがオススメ。
switch(toho){
    case Toho.Marisa : Console.WriteLine("やっぱり魔理沙!");break;
    case Toho.Reimu : Console.WriteLine("やっぱり霊夢!");break;
C言語だとtoho==Marisa;みたいに書いてもエラーにならなかったけど
C#ではエラーになります。C言語から来た人いるのか知らないけど注意。
enumの書き方ですが、クラスの外においても問題なし
enum Toho{Marisa, Reimu, Nitori, Chirno}
class Test13{
//enum部分以外同じなので省略
}
あたりまえですが、クラスの中でenumを書くとそのクラス内でしかそのenumは使えません。
class Test{
    //enum定義
}
class Test2{
    //この部分ではTestのenumは使えない
}
Testの外にだして置けば複数のクラスで同じenumを使えます。
あと、enum Toho{Marisa, Reimu, Nitori, Chirno, }
のようにChirnoの次にもコンマ(,)をつけられる。機能はつけてもつけなくても全く同じですがつけておけば、後でもうひとつ定数を付け足したいとき等にほんのちょっとだけ便利。ささいなことだけど知っとくと役に立つかも・・・。

列挙型は数にキャストできる

実は列挙型はただの数値の集合に名前をつけたようなもの。
列挙型の最初から0,1,2,3・・・ってなってます。(Toho型ならMarisaが0, Reimuが1,Nitoriが2)
さすがにint x=Toho.Marisa;みたいに直接は代入できませんが
キャスト すればおk
int x=(int)Toho.Marisa;魔理沙の番号は0だからこれでxには0が入ります。
逆に、数値をtoho型に直すときは
toho=(Toho)1; 霊夢の番号は1なので1を(Toho)すると、霊夢になります。
0とか1とか順番につくなんて嫌だ!自分で決めたいって人はこんな風にすればおk
enum Toho{Marisa=3535, Reimu=0, Nitori=210, Chirno=9}
最後のコード
using System;

class EnumToho{
    public enum Toho{Marisa, Reimu, Nitori, Chirno};
    public Toho toho;
}

class Test13{
    public static void Main(){
        EnumToho et = new EnumToho();
        et.toho = EnumToho.Toho.Marisa;
        
        if(et.toho == EnumToho.Toho.Marisa)
            Console.WriteLine("やっぱり魔理沙!");
    }
}

ifの上とifの括弧の中がちょっと新鮮な書き方ってだけ。列挙型おしまい。

名前空間namespace

でっかいプログラムを複数のファイルに分けたり
クラスを分類するときに役に立つ。
System.Drawing名前空間には描画に関するクラスが入ってるんだな
System.Windows.Forms名前空間にはWindowっぽいGUIプログラムに関するクラスが入ってるんだな
みたいに大量のクラスを名前空間で分類して使いやすくしてます。
あとは名前が重複しないとか。
たとえばTimerクラスはSystem.Threading名前空間
System.Timers名前空間とSystem.Web.UI名前空間とSystem.Windows.Forms名前空間の4つあります。それぞれのタイマーは違うものだけど名前空間が違うから区別できます。
では動画のコード
using System;

namespace CarTest{
    class Car{
        int gas;
        string number;

        public Car(int g, string n){
            gas = g;
            number = n;
        }

        public void Show(){
            Console.WriteLine("燃料 : " + gas.ToString());
            Console.WriteLine("ナンバー : " + number);
        }
    }

    class Test13{
        public static void Main(){
            Car car = new Car(9, "3535-06");
            car.Show();
        }
    }
}
これを複数のファイルに分割!
一個目
 using System;
 namespace CarTest{
    class Car{
        int gas;
        string number;

        public Car(int g, string n){
            gas = g;
            number = n;
        }

        public void Show(){
            Console.WriteLine("燃料 : " + gas.ToString());
            Console.WriteLine("ナンバー : " + number);
        }
    }
   }
二個目
   /* 
      直接System名前空間のクラスは使ってないので
      using System;は不要。あってもいいけど。
   */
   namespace CarTest{
    class Test13{
        public static void Main(){
            Car car = new Car(9, "3535-06");
            car.Show();
        }
    }
   }

これを、コマンドプロンプトで
csc Test13.cs Car.cs
みたいにやればいい。簡単だね。

using

いままでusing System;
ってかいてきたね。だからConsole.WriteLineって書けた。
いちいちSystem.Console.WriteLineなんて書いてたら面倒だからね。
usingは名前空間にしか使えないから
using System.Console;
ってやってから途中でWriteLineはダメ。Consoleは名前空間じゃなくクラスだから省略できません。
あと、さっきのTimerみたいにたくさんの名前空間に同じクラスがあったら
usingで省略した名前空間のどのTimerなのか不明になるから
そんな場合はちゃんと書かないとダメ。
さらにusingはクラスに別名をつけられます。
using Marisa = System.Console;
って書いておけば
Marisa.WriteLine("魔理沙")はSystem.Console.WriteLine("魔理沙")と同じになります。長い名前のときにわかりやすい名前で省略すると便利。

MSDNライブラリ

クラスライブラリを見るのは
.NET開発→.NET Framework 3.5→同じ→.NET Frameworkクラスライブラリ
C#を良く使うなら、クラスライブラリを「お気に入り」とか「ブックマーク」に登録しておこう!
Consoleクラスを調べてみよう。System名前空間のConsoleクラスを調べるとか、検索ボックスにConsoleとか入力して検索すればでてくる。
これは、動画を見たほうが良いね。いう事なし!

おまけ Windowアプリケーション

ほんの少しやってみよう。
using System.Windows.Forms;

class MainClass{
    static void Main(){
    Form frm = new Form();
    frm.Text = "はじめてのWindowsアプリケーション!";
    frm.Click += (sender, e) => { MessageBox.Show("クリックされますた");};
    Application.Run(frm);
    }
}
Click += の部分が見たことねー形ですが気にしないw
「イベント」ってやつです。

これを保存して適当なファイル名.csにして
コマンドプロンプトで
csc /target:winexe ファイル名.cs (cscと/targetの間とwinexeとファイルの間は半角スペース)
でWindowsアプリケーションができる!
/targetはなくてもいいけど、コマンドプロンプトが起動してなんかダサイ。
できたexeを実行して、クリックしてみよう。
とりあえずこれで終了だけど 二週間後に続編が来るらしい!