この章では例外処理について説明します。
例外とは、プログラムの実行過程で発生するエラーのことを言います。
0による除算や配列の添え字の数を超えて実行しようとするとエラーが起こります。
例外が起こったときに、予想外の動きをしないためには例外処理を行う必要があります。
例外処理をすることで プログラムが途中で中断されることなく続けることができるメリットがあります。
では例をみてみましょう。 C#には例外を処理するためのクラスが備わっているのですが、それがExceptionクラスです。
このクラスを基本として、様々な例外処理が行われます。
例えばこの例のDivideByZeroExceptionクラスは Exception クラスの子クラスですが、0で除算した際の例外処理を行います。 この例の処理の場合はcatchの引数にと記述し、次にcatchのブロック内にという形式で記述します。
Messageはプロパティですが、ここに例外の文字列が格納されています。
結果は以下の通りです。 例外クラスはDivideByZeroExceptionだけではないので、他の例外も紹介します。 この例では配列の要素数が3なのに4つ入れようとしているので、例外が発生します。
この例外を扱うクラスはIndexOutOfRangeExceptionです。
配列の要素数を超えてデータを入れようとすると、この例外クラスが実行されます。 結果は以下の通りです。 今まで2つの例外 を見てきましたが、catchは1つだけしか書くことができないわけではなく、何個でも書くことが出来ます。 以下のように複数のcatch文を書く事が出来ます。 では次の説明に移ります。
今までは2つの例外 を別個に書いていましたが、
これらに代わって
「Exception」を使うことで
どの例外でも補足することが
可能になります。
Exceptionクラスは今まで説明してきた例外クラスの親クラスに当たります。
では例をみてみましょう。 結果は以下の通りです。 次は例外をプログラマが明示的に投げる方法について説明します。
明示的に例外を投げるにはtryのブロック内にという構文で書きます。 では例をみてみましょう。 この例は変数がnullであればthrowで例外をcatchに送っています。
throw 文は例外が起こる箇所に挿入します。
ArgumentNullExceptionクラスは値がnullである可能性があるプログラムに使用されます。
結果は以下の通りです。
カテゴリー: Cシャープ
DateTime構造体について知ろう
この章ではDateTime構造体について説明します。
DateTime構造体は日付や時刻関係の出力や取得に役立つ構造体の一種です。
では例をみてみましょう。 現在の日付と時間を得たいのであれば以下の構文で書きます。 この例では以下の箇所です。 例えば
2012/05/30 22:30:55
と現在の日付と時間が出力されます。
次は今日の日付を取得する方法について説明します。 今日の日付を取得する構文は以下の通りです。 例えば
2012/05/30 0:00:00
と、出力されます。
現在の日付と時間を協定世界時(世界標準の時刻)で得たいのならば以下の形式で書きます。 協定世界時と日本の時刻との時差は9時間です。
日本時間の方が9時間進んでいます。 次は個別に年や時間を取得する方法について説明します。 次はDateTimeオブジェクトをフォーマット形式の文字列に変換するToStringメソッドについて説明します。
他にも似たようなメソッドが多数存在します。 では例をみてみましょう。 この章の最後にまとめて標準日時書式指定文字列の表を載せます。
次の例をみてみましょう。 スペースの都合でToStringを2行で書いていますが、1行で書いても結構です。
列挙型について知ろう
この章では列挙型について説明します。
「列挙型」は結びつきがある要素をひとまとめにして、新しい型として定義することを言います。
詳しい説明は例の後に行います。 列挙型は宣言を行うことが必要ですが、構文は次のようになります。 以下の箇所がこの例の列挙型の定義ですが、配列のようにデータのまとまりを作ります。
そして、列挙型のリストには先頭からと順番に値が与えられます。
数値だけをと与えられても何がなんだかわかりません。
そこでcatsが0,dogsが1,tigerが2と数値を割り当てるわけです。 列挙型の宣言をした後は列挙型の変数を宣言し、データを入れます。 この例では以下の箇所です。 この例では列挙型の変数に値を入れた後にswitch文で判定を行なっています。
列挙型のリストには先頭から順番に値が与えられると言いましたが、出力するには以下のように書きます。
この例は0が出力されます。この中に「(int)」という箇所がありますが、これをキャストと呼ぶことは説明しました。
この例の場合には整数型にキャストして列挙型に割り当てられている数値を出力しています。
構造体について知ろう
この章では構造体について説明します。
構造体はバラバラの異なる型のデータを持つ複数の変数を1つの型として扱うことが出来ます。
それに対して配列は単一のデータ型しかまとめて扱う事はできません。
例えば、学生の情報をデータに残したい時に、成績はint型,身長はdouble型,名前はchar型など様々なデータ型を1つにまとめて扱いたい時に構造体は便利です。 構造体型を宣言する時はstructを使います。
構造体の中には変数、メソッド、プロパティ、コンストラクタなどを書くことが出来ます。
しかしデストラクタは書けません。
では例をみてみましょう。 構造体を基本構文の通りのように作って、そのブロックの中に変数やメソッドなどを記述します。
変数やメソッドにアクセスするにはMainメソッドの中でと宣言してから、という形式で値を代入します。
構造体のメソッドに値を渡す場合にはという形式でデータを渡します。
引数は省略できます。 結果は以下の通りです。 次は構造体にコンストラクタを使用した例です。 構造体でコンストラクタを使うためにはnewが必要です。 この例ではです。
占いプログラムを作ろう
この章では占いプログラムを作成します。 このプログラムはランダムな数を生成して、その数を基に占いを行います。
乱数を導き出すためにRandomクラスを使用します。
今までは自身でクラスを作成してきましたがRandomクラスはC#で定義されているクラスです。
Randomクラスのオブジェクトは以下のように作成します。 その後にという構文で書きますと0以上のランダムな整数を生成します。
以下の例を見るとNextの引数がカラですが、このように引数に何も書かないと「1394375729」のようなランダムな乱数を生成します。 のように引数に数値が入っている場合にはその数までの乱数を生成します。
気を付けないといけないのはの場合には1から7ではなくて0から6までの乱数を生成することです。
その他に「ここからここまで」と指定したい場合にはのようにカンマを挟んで数値を記述します。
この例の場合には「1から100」です。
「1から101」ではありません。
名前空間について知ろう
インターフェイスについて知ろう
抽象クラスについて知ろう
この章では抽象クラスについて説明します。
抽象クラスとは親クラスで大まかなことだけを定義するクラスのことを言います(だから抽象と言う名前が付いています)。
具体的なことはその抽象クラスを引き継いだ各クラス内で決めます。
抽象クラスは親クラス名の前にが付いたクラスであり、抽象クラスの中のメソッドは名前だけ決めて(中身は何も書きません)、メソッドの内容はこれを継承したクラスに書きます。
このようなメソッドを抽象メソッドといいます。
では例をみてみましょう。 抽象クラスの基本構文は以下の通りです。 抽象クラスにしたいクラスには「abstract」を「class」の前に付けます。
さらに中身が決まっていない抽象メソッドの宣言にも「abstract」を付けます。
この例の中では以下の2行が抽象メソッドになります。 抽象メソッドが1つでも含まれているクラスは抽象クラスになります。
また、抽象クラスには普通のメソッドも記述出来ます。
つまり、抽象クラスには抽象メソッドでないメソッドも書くことができます。
抽象メソッドでない普通のメソッドは継承するクラスでもわざわざクラスごとに内容を変える必要が無いメソッドなので、普通のメソッドにしているわけです。
この例ではsleepメソッドを抽象メソッドにしないで、普通のメソッドにしていますが、「夜に寝る」は継承されたクラスで変える必要が無いので普通のメソッドにしています。
抽象メソッドのeatは動物ごとに食べるものが違うので、eatと言うメソッド名だけ決めて、後の具体的な内容は抽象クラスを継承したクラスの中で書くという形を取ります。
抽象クラスを継承したクラスは、この抽象メソッドを必ずオーバーライドしなければなりません。オーバーライドしないとコンパイルエラーとなります。
ですので のように抽象メソッドの宣言をしましたら、以下のように継承したクラスで実際の具体的な内容を記述してください。 抽象メソッドを受け継いだメソッドにoverrideを付けるのを忘れないでください。また、抽象メソッドにvirtualを付ける必要はありません。 抽象クラスについて補足します。
この例の場合 Animalクラスを継承してCatsクラスやDogクラスを定義していますが、この他にもTigerクラスなど他にもクラスが増える可能性もあります。
このように拡張する可能性があるのでAnimalクラスですべてメソッドの中身などを決める必要はないわけです。
つまり、それぞれ動物には特色があるのでAnimalクラスですべての具体的な動きなどを決められないわけです。
Animalクラスで抽象的な名前だけ決めて、後の具体的なことは継承したクラスに任せるとした方が大きいプログラムの場合には使い勝手が良くなります。
他の例を挙げますが、ゲームのプログラムを作るとします。
その時に魔法メソッドを抽象メソッドにして、具体的な魔法の動きは抽象クラスを受け継いだクラスに書くという使い方も出来ます。
結果は以下の通りです。
デストラクタについて知ろう
クラスの継承について知ろう
この章ではクラスの継承について説明します。
クラスの継承とは親クラス(元のクラス)の他に、もう1つの関連したクラスを作ろうとした時に、親クラスのフィールド変数やメソッドを引き継ぐことを言います。
もう1つの関連したクラスのことを子クラスもしくはサブクラスと言います。
親クラスと同じフィールド変数やメソッドを子クラスで定義しなくてはいけない時、同じフィールド変数やメソッドを子クラスで再度記述する必要はありません。
また、子クラスには独自のフィールド変数やメソッドも追加することもできます。
では例を見てみましょう。Banksystemクラスが親クラスで、Securitiesクラスが子クラスになります。
SecuritiesクラスはBanksystemクラスを継承しているので、Banksystemクラスのフィールド変数やメソッドを使用することが出来ます。子クラスの中で親クラスのフィールド変数を使うことができると言いましたが、それが以下の箇所です。他にもstockbuyメソッドやstocksellメソッドの中でも使われています。また、子クラス独自のフィールド変数やメソッドを書くことができると言いましたが、それがcompany変数やstockbuyメソッドやstocksellメソッドやresultメソッドです。
改めて親クラスのメソッドやフィールドを子クラスで書く必要はありませんが、この例では1つだけ親クラスと共通のメソッドを書いています。それはresultメソッドです。このように子クラスと親クラスで名前が同じで、内容だけが違うメソッドを作ることが出来ます。
つまり、メソッド名は変えずに、子クラス独自の内容に変えることが出来ます。
これをオーバーライドと言います。次にprivate とprotectedについて説明します。
親クラスでprivateが付いているフィールド変数やメソッドは子クラスからはアクセスすることはできません。
例の親クラスのフィールド変数を以下のようにprivateに書き換えると子クラスのメソッドから使用することは出来なくなります。ですので、この例では以下のようにprotectedを付けて、子クラスでも使えるようにしています。
protectedは子クラスから親クラスにアクセスできることを意味します。結果は以下の通りです。次は子クラスから親クラスのコンストラクタを呼び出す例です。結果は以下の通りです。では子クラスから親クラスのコンストラクタを呼び出す方法について説明します。
Mainメソッド内で子クラスのオブジェクトを作成し、ここで親クラスや子クラスのフィールド変数にデータを入れています。上のように子クラスであるUsedクラスのオブジェクトが作られた時にはまず初めに自動的に親クラスの引数の無いコンストラクタが呼ばれます。つまり親クラスに引数のあるコンストラクタだけで、引数の無いコンストラクタが無い場合はエラーになります。
親クラスの引数の無いコンストラクタが呼ばれた後に子クラスのコンストラクタが呼ばれることになります。
この例の場合にはコンストラクタの中でさらにsetfieldメソッドを呼び出して値のチェックをしています。
このような書き方も出来ますので覚えておいてください。自動的に親クラスの引数の無いコンストラクタが呼ばれると書きましたが、では親クラスに引数の無いコンストラクタが無い場合エラーになるのだとしたら、どう対処したらいいでしょうか?
方法は2つありますが、1つ目はこの例のように親クラスに引数の無いコンストラクタを作っておくことです。
2つ目は子クラスのコンストラクタの中で親クラスの引数のあるコンストラクタを呼び出す方法です。子クラスコンストラクタの中の引数には親クラスと子クラスのコンストラクタの引数を型も含めて記述します。
baseの中にある引数は親クラスの引数のあるコンストラクタに渡しますが、ここの引数には型名を入れる必要はありません。
では先ほどの例を2つ目の方法で書き換えてみましょう。オブジェクトを作成した時にコンストラクタが実行されますが、n, a, bが親クラスのコンストラクタの引数に入ります。
そしてs, fが子クラスのsetfieldメソッドの引数に代入されることになります。
図にすると以下のようにデータが入ります。結果は以下の通りです。