カテゴリー
Cシャープ

デストラクタについて知ろう

この章ではデストラクタについて説明します。
コンストラクタはオブジェクトを作成する時に呼ばれていましたが、デストラクタはオブジェクトを破棄する時に自動的に呼び出されます。
「new」を使用して、今までオブジェクトを作ってきましたが、これはオブジェクトのメモリを確保することを意味します。
メモリを確保しているので、どこかでメモリを開放しなくてはいけません。
どこでメモリを解放するかと言いますとデストラクタの中で行います。1
クラス名の前に1を付けます。
では簡単な例で確認してみましょう。11111111111 結果は以下の通りです。1 「デスト1」「デスト2」と出力されている箇所でメモリが解放されているのが分かります。

カテゴリー
Cシャープ

クラスの継承について知ろう

この章ではクラスの継承について説明します。
クラスの継承とは親クラス(元のクラス)の他に、もう1つの関連したクラスを作ろうとした時に、親クラスのフィールド変数やメソッドを引き継ぐことを言います。
もう1つの関連したクラスのことを子クラスもしくはサブクラスと言います。
親クラスと同じフィールド変数やメソッドを子クラスで定義しなくてはいけない時、同じフィールド変数やメソッドを子クラスで再度記述する必要はありません。
また、子クラスには独自のフィールド変数やメソッドも追加することもできます。
では例を見てみましょう。1111111111111Banksystemクラスが親クラスで、Securitiesクラスが子クラスになります。
SecuritiesクラスはBanksystemクラスを継承しているので、Banksystemクラスのフィールド変数やメソッドを使用することが出来ます。11子クラスの中で親クラスのフィールド変数を使うことができると言いましたが、それが以下の箇所です。他にもstockbuyメソッドやstocksellメソッドの中でも使われています。1また、子クラス独自のフィールド変数やメソッドを書くことができると言いましたが、それがcompany変数やstockbuyメソッドやstocksellメソッドやresultメソッドです。
改めて親クラスのメソッドやフィールドを子クラスで書く必要はありませんが、この例では1つだけ親クラスと共通のメソッドを書いています。それはresultメソッドです。11このように子クラスと親クラスで名前が同じで、内容だけが違うメソッドを作ることが出来ます。
つまり、メソッド名は変えずに、子クラス独自の内容に変えることが出来ます。
これをオーバーライドと言います。1次にprivate とprotectedについて説明します。
親クラスでprivateが付いているフィールド変数やメソッドは子クラスからはアクセスすることはできません。
例の親クラスのフィールド変数を以下のようにprivateに書き換えると子クラスのメソッドから使用することは出来なくなります。1ですので、この例では以下のようにprotectedを付けて、子クラスでも使えるようにしています。
protectedは子クラスから親クラスにアクセスできることを意味します。1結果は以下の通りです。1次は子クラスから親クラスのコンストラクタを呼び出す例です。11111111111結果は以下の通りです。1では子クラスから親クラスのコンストラクタを呼び出す方法について説明します。
Mainメソッド内で子クラスのオブジェクトを作成し、ここで親クラスや子クラスのフィールド変数にデータを入れています。1上のように子クラスであるUsedクラスのオブジェクトが作られた時にはまず初めに自動的に親クラスの引数の無いコンストラクタが呼ばれます。1つまり親クラスに引数のあるコンストラクタだけで、引数の無いコンストラクタが無い場合はエラーになります。
親クラスの引数の無いコンストラクタが呼ばれた後に子クラスのコンストラクタが呼ばれることになります。
この例の場合にはコンストラクタの中でさらにsetfieldメソッドを呼び出して値のチェックをしています。
このような書き方も出来ますので覚えておいてください。11自動的に親クラスの引数の無いコンストラクタが呼ばれると書きましたが、では親クラスに引数の無いコンストラクタが無い場合エラーになるのだとしたら、どう対処したらいいでしょうか?
方法は2つありますが、1つ目はこの例のように親クラスに引数の無いコンストラクタを作っておくことです。
2つ目は子クラスのコンストラクタの中で親クラスの引数のあるコンストラクタを呼び出す方法です。1子クラスコンストラクタの中の引数には親クラスと子クラスのコンストラクタの引数を型も含めて記述します。
baseの中にある引数は親クラスの引数のあるコンストラクタに渡しますが、ここの引数には型名を入れる必要はありません。
では先ほどの例を2つ目の方法で書き換えてみましょう。111111111111オブジェクトを作成した時にコンストラクタが実行されますが、n, a, bが親クラスのコンストラクタの引数に入ります。
そしてs, fが子クラスのsetfieldメソッドの引数に代入されることになります。
図にすると以下のようにデータが入ります。1結果は以下の通りです。1

カテゴリー
Cシャープ

静的変数、静的メソッドについて知ろう

この章では静的変数、静的メソッドについて説明します。
静的変数・静的メソッドはオブジェクトを作成してから使用するのではありません。
つまり、静的変数・静的メソッドはオブジェクトに属しているのではなくクラスに属していると言えます。
詳しい説明は例の後で行ないます。
では例を見てみましょう。111111 フィールド変数やメソッドを宣言する時に「static」を付けると静的変数、静的メソッドになります。1 これまで使用してきたフィールド変数やメソッドはオブジェクトを作ってから使用しましたが、「static」を付けた変数やメソッドはオブジェクトを作成しなくても使用することが出来ます。
つまり、静的変数、静的メソッドはオブジェクトに属しているのではなく、クラスに属しているのです。
ですので、静的変数にアクセスするにはクラス名を使って1(クラス名と変数名の間にはドットがあります)という形式で書きます。1 ではこの静的変数をカウントしている箇所はどこかと言いますと以下で静的変数をカウントしています。
つまり、コンストラクタが呼び出されるたびに静的変数であるcount1に1を足しています。1 もう一か所静的変数を出力している箇所があるのですが、それがresultメソッドです。ここでもcount1変数がカウントしているのが分かります。
静的変数も変数の一種ですので、普通のメソッドの中で使う事が出来ます。1 結果は以下の通りです。1 次は静的メソッドの例をみてみましょう。1111111 静的変数の例ではコンストラクタで静的変数に足していましたが、この例では静的メソッドで静的変数に値を足しています。1 静的メソッドを実行する場合には1という構文で書きます。
この例では以下の箇所です。
Ginkou.count();
この例では2回静的メソッドを実行しているので実行するごとに1が足されます。
静的メソッドで気を付けなければいけないことは静的メソッド内ではthisを使う事ができませんし、フィールド変数も使う事ができません。
結果は以下の通りです。11

カテゴリー
Cシャープ

プロパティについて知ろう

この章ではプロパティについて説明します。
クラスの中でフィールド変数の値を代入するsetメソッドと値を返すだけのgetメソッドについて説明しました。
それが以下のようなメソッドです。11 この2種類のメソッドをフィールド変数ごとに書くのは可読性が悪くなる可能性があります。
これをプロパティを使うことによって書き換えると1種類のプロパティで済みます。
このプロパティはメソッドのようでもあり、フィールド変数のようでもあります。つまり、メソッドとフィールド変数の中間の存在です。プロパティの構文は以下の通りです。1 この構文の中のvalueにはプロパティに入れたデータが入りますが、どのように入れるのかと言いますと1という構文で入れます。
次の例では以下の箇所です。1 では例をみてみましょう。1111111 結果は以下の通りです。1

カテゴリー
Cシャープ

コンストラクタについて知ろう

この章ではコンストラクタについて説明します。
コンストラクタはオブジェクトを作成すると同時に自動的にフィールド変数にデータを入れる特殊なメソッドです。
詳しい説明は例の後に行います。
では例をみてみましょう。1111 これまでは以下のように1つ1つデータを入れていましたが、実際の銀行のシステムではこの中のどれか1つでもデータを入れ忘れたら大変なことになります。1 しかし、コンストラクタと呼ばれる特殊なメソッドを使うことによって、オブジェクトを作成すると同時に自動的にフィールド変数にデータを入れることができます。
以下がコンストラクタの基本構文です。1 コンストラクタには戻り値の型を書きません。
例では以下の箇所がコンストラクタです。11 11次にコンストラクタを呼び出す方法について説明します。
オブジェクトを作成するとコンストラクタが自動的に実行されるのですが、渡したいデータはオブジェクトの引数に入れます。
この例では以下の箇所です。1 つまり、オブジェクトの作成の過程で1のデータがコンストラクタの1にそれぞれ自動的にセットされることになります。
図にすると以下の通りです。1
次は引数のあるコンストラクタと引数のないコンストラクタを両方作った例をみてみましょう。1111111 結果は以下の通りです。1 前の例では引数のあるコンストラクタだけでしたが、この例では引数のないコンストラクタも同時に作成しています。
このように引数の数や引数の型が違うならば、同じ名前のコンストラクタを定義することが出来ます。
この例では上のコンストラクタは引数がなく、下のコンストラクタは引数が3つあり、引数の数が違いますので同じ名前のコンストラクタでも定義することが出来ます。これをオーバーロードと言います。
コンストラクタの実行はオブジェクトの引数に応じて呼び出されます。
1 =>ここでは引数のあるコンストラクタを呼び出しています。

1 =>ここでは引数のないコンストラクタを呼び出しています。1

カテゴリー
Cシャープ

クラスについて知ろう

この章ではクラスについて説明します。
今までのプログラムでは変数とメソッドを扱ってきましたが、クラスと言う機能を使うことで、多くの変数とメソッドを1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る設計図に例えられます。
設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば、「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を「変数」で書き、「ふるまい」をメソッドで書くことになります。
どのような「状態」や「ふるまい」を作りたいかはオブジェクトの役割です。
例えば「線を引く」「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
クラスの構文は以下の通りです。1 クラスの中に変数やメソッドを書いていきます。
クラスの中の変数をフィールド変数と言います。
次にアクセスレベルについて説明します。
アクセスレベルとは変数やメソッドで使われますが、それらの変数やメソッドに対して、どこからアクセスできて、どこからアクセスできないかを決める修飾子です。111
次はオブジェクトについて説明します。
オブジェクトはnew演算子を使って作成します。
オブジェクトとはクラスの中の「状態」を表す変数や「ふるまい」を表すメソッドに指示を出す役割があります。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。1 オブジェクトを作る過程をインスタンス化と言います。
ではクラスで作ったプログラムの例を見てみましょう。111 このプログラムは銀行でのお金の入金や出金のシステムを簡潔に作っています。2つのクラスがありますが、1つはMainメソッドのあるProgramクラスで、もう1つはGinkouクラスです。
初めにプログラムが実行されるMainメソッドのあるProgramクラスが司令塔になって、他のクラスに指示を出していくことになります。11 クラスのフィールド変数には以下の構文でデータを入れます。111 クラスのメソッドを実行するためには以下の構文で行います。1 その結果、それぞれ以下のメソッドが実行されます。1 これらのメソッドはインスタンス化(オブジェクトが作られてから)されてから実行されるのでインスタンスメソッドと呼ばれています。
それぞれのフィールド変数にデータが入ったところで、最後にresultメソッドで出力しています。
結果は以下の通りです。1 11111111この例ではProgramクラスを消して、Ginkouクラスにまとめています。
次はアクセスレベルのprivateについて説明します。
これまでのクラスのフィールド変数はpublicにしていますが、これは本来はよろしくありません。
クラスの外側から直接値を入れることが出来てしまうからです。
そこで、フィールド変数はprivateにして、メソッドからこれらのフィールド変数に値を入れる方が最良です。
そして、メソッドはpublicにするのが基本です。
例を見てみましょう。1111111111111111 この例ではすべてのフィールド変数にthisを付けていますが、前の例のように省略が出来ます。1111

カテゴリー
Cシャープ

文字列を操作しよう

この章では文字列を操作するメソッドについて説明します。
これまでは自身でメソッドを作成してきましたが、C#には初めから機能が定義されているメソッドが複数あります。1 =>CompareToメソッドは2つの文字列のデータを比べて、等しければ0を返し、aがbより大きければ0より大きい整数を返し、aがbより小さければ0より小さい値を返します。
では例をみてみましょう。11 この例ではaとbは等しいので、0が返ってきますので、結果は「等しい」が出力されます。1 =>IndexOfメソッドは文字列aの中から文字列bの位置を先頭から検索して、見つかった場合にはその文字列の位置番号を返します。
その文字列が見つからない場合には-1が返されます。1 =>LastIndexOfメソッドは文字列aの中から文字列bの位置を後ろから検索して、見つかった場合にはその文字列の位置番号を返します。
その文字列が見つからない場合には-1が返されます。
では例をみてみましょう。11111 =>Containsメソッドは文字列aの中に文字列bの文字列が含まれている場合には「TRUE」が返されます。
では例をみてみましょう。1111 =>IsNullOrEmptyメソッドは文字列がnullかどうか もしくは文字列に何も入っていないかどうかを調べるメソッドです。
nullもしくは文字列に何も入っていない場合にはTRUEを返します。
nullは何のデータもないと言う意味です。
カラの文字列を表現するにはダブルクォートを連続して2つ書きます。
では例をみてみましょう。11 結果はaには何も入っていないので「yes」が出力されます。

カテゴリー
Cシャープ

星座判定をメソッドで作ろう

「if文で星座を判定をしよう」の章ではif文で星座判定のプログラムを作成しましたが、これをメソッドを使って書き換えます。111111111 1例えばmonthに1が入り、dayに19が入っているとします。
そうすると1の箇所はiが0の時にifの条件式がtrueになりますので、以下の入れ子のif文の条件式の判定に入ります。1 「day <= day1[i]」の中のdayには19が入り、「day1[i]」にはday1の0番目の要素である19が入っていますので、条件式はtrueになり、nameにはnames配列の0番目の要素であるやぎ座が入ります。
例えばdayに19ではなく23が入っていると仮定すると1はFALSEになるので、1の条件式の判定に入ります。
ここで「day2[i]」にはday2の0番目の要素である31が入っていますのでTRUEになり、nameには1に該当する星座が入ります。
1周目では1のiには0が入っていますので1となり、nameにはみずがめ座が入ることになります。
ここで1 の説明をします。
「i +1」の箇所の説明をしますと例えばmonthが1で、day が23の場合には
1
が「23<=19」になり FALSEになるので elseifのブロックに入りますが、 1月はやぎ座と水瓶座しかなく、 やぎ座ではないのならば水瓶座 しかないのでnames配列を 1つ進めるために「i +1」で1を 足しています。
「%12」を記述している理由は1の中のiに11が入ると「(i +1)」の箇所が 12になりますが、「%12」の箇所が 無いと仮定するとnames[12]となってしまいますが、実際にnames[12]という 要素はありません。
そこで「%12」で余りを0(12割る12で余り0)にして
「やぎ座」が出るようにしています。
つまり、該当する以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。11 結果は以下の通りです。1

カテゴリー
Cシャープ

メソッドについて知ろう4

この章ではparamsについて説明します。
これまでは実引数の数と仮引数の数は一致させないといけませんでしたが、params と言うキーワードを使うと引数の数を臨機応変に変えることが出来ます。
では例をみてみましょう。11 これまでは複数の実引数のデータをメソッドの仮引数に渡すには実引数と仮引数の数を合わせなくてはいけませんでした。1paramsを「配列である仮引数の前」 に付けると実引数の数が何個であろうと 仮引数の数を増やす必要がなくなります。
結果は以下の通りです。1

カテゴリー
Cシャープ

メソッドについて知ろう3

この章では配列をメソッドに渡す方法について説明します。
では例をみてみましょう。11 配列をメソッドに渡すには1という形式で書きます。
この例ではnumber配列をmaxメソッドに渡すので1と書きます。
配列を渡したら、メソッドの仮引数では1のように配列で受け取ります。
maxメソッドの機能は受け取った配列の要素の中で一番大きい数の添え字を返します。
for文の中のifで以下のような順番で大きさを比べています。11 そして最後に以下の箇所で出力されます。1 number[world1]のworld1には一番大きい配列のインデックス番号が入っているので、1となり89が出力されます。
次の例では配列の要素をメソッドに渡して、その配列の値をメソッド内で変更した時に元の配列はどうなるのかについて説明します。11 配列は値渡し(変数をメソッドに渡すことを値渡しと言います)ではなく、参照渡しという方法で渡されます。
参照渡しと言いましても特別なことをするわけではなく、配列をメソッドに渡すだけです。
参照渡しでメソッドに配列を渡して、メソッド側でその配列のデータを書き換えると元の配列のデータまでが書き換わります。
普通の変数を値渡しでメソッドに送ってもメソッド側で書き換えることは出来ません。
例では配列の要素である1がkakikaeメソッドの1の箇所ですべて4に変えていますが、このようにメソッド側で配列の値を変えることで、呼び出し元の配列の要素も4に変更されます。
結果は以下の通りです。1
次の例で呼び出し元の変数を値渡しで渡して、メソッド側でその変数の値を書き換えることができるのか見てみましょう。11 では説明を始めます。
int x = 99;
int y = 90;
kakikae (x, y) ;の箇所でkakikaeメソッドに送っています。 そして、kakikaeメソッドでは 以下のように4を代入しています。
a=4;
b=4;
ここで変数に4を代入しても、 呼び出し元のint x 、int y の値は変更されずにそれぞれ 99、90のままです。

つまり呼び出し元から渡した変数の値をメソッド内で変更しても呼び出し元の変数の値は変化しません。
これが値渡しです。
しかし、値渡しを参照渡しに変更する方法がC#には備わっています。
実引数と仮引数に以下の例のように「ref」と言うキーワードを付けます。
では例をみてみましょう。11 実引数と仮引数に「ref」を付けるとkakikaeメソッド 内で変数 a,bに値を代入した場合、 Mainメソッド内の変数x,yの値も書き換わります(スペースの都合でkakikaeメソッドの引数を2行で書いていますが1行で書いてもいいです)。
結果は以下の通りです。1
refの付いた変数を渡す場合はその変数には何かしらの値が入っていないといけません。
しかし、値の入っていない変数をメソッドに渡したい場合はrefの代わりにoutを使用してください。outもrefと同じで参照渡しです。11 結果は以下の通りです。1