この章では静的変数、静的メソッドについて説明します。
静的変数・静的メソッドはオブジェクトを作成してから使用するのではありません。
つまり、静的変数・静的メソッドはオブジェクトに属しているのではなくクラスに属していると言えます。
詳しい説明は例の後で行ないます。
では例を見てみましょう。 フィールド変数やメソッドを宣言する時に「static」を付けると静的変数、静的メソッドになります。 これまで使用してきたフィールド変数やメソッドはオブジェクトを作ってから使用しましたが、「static」を付けた変数やメソッドはオブジェクトを作成しなくても使用することが出来ます。
つまり、静的変数、静的メソッドはオブジェクトに属しているのではなく、クラスに属しているのです。
ですので、静的変数にアクセスするにはクラス名を使って(クラス名と変数名の間にはドットがあります)という形式で書きます。 ではこの静的変数をカウントしている箇所はどこかと言いますと以下で静的変数をカウントしています。
つまり、コンストラクタが呼び出されるたびに静的変数であるcount1に1を足しています。 もう一か所静的変数を出力している箇所があるのですが、それがresultメソッドです。ここでもcount1変数がカウントしているのが分かります。
静的変数も変数の一種ですので、普通のメソッドの中で使う事が出来ます。 結果は以下の通りです。 次は静的メソッドの例をみてみましょう。 静的変数の例ではコンストラクタで静的変数に足していましたが、この例では静的メソッドで静的変数に値を足しています。 静的メソッドを実行する場合にはという構文で書きます。
この例では以下の箇所です。
Ginkou.count();
この例では2回静的メソッドを実行しているので実行するごとに1が足されます。
静的メソッドで気を付けなければいけないことは静的メソッド内ではthisを使う事ができませんし、フィールド変数も使う事ができません。
結果は以下の通りです。
カテゴリー: Cシャープ
プロパティについて知ろう
この章ではプロパティについて説明します。
クラスの中でフィールド変数の値を代入するsetメソッドと値を返すだけのgetメソッドについて説明しました。
それが以下のようなメソッドです。 この2種類のメソッドをフィールド変数ごとに書くのは可読性が悪くなる可能性があります。
これをプロパティを使うことによって書き換えると1種類のプロパティで済みます。
このプロパティはメソッドのようでもあり、フィールド変数のようでもあります。つまり、メソッドとフィールド変数の中間の存在です。プロパティの構文は以下の通りです。 この構文の中のvalueにはプロパティに入れたデータが入りますが、どのように入れるのかと言いますとという構文で入れます。
次の例では以下の箇所です。 では例をみてみましょう。 結果は以下の通りです。
コンストラクタについて知ろう
この章ではコンストラクタについて説明します。
コンストラクタはオブジェクトを作成すると同時に自動的にフィールド変数にデータを入れる特殊なメソッドです。
詳しい説明は例の後に行います。
では例をみてみましょう。 これまでは以下のように1つ1つデータを入れていましたが、実際の銀行のシステムではこの中のどれか1つでもデータを入れ忘れたら大変なことになります。 しかし、コンストラクタと呼ばれる特殊なメソッドを使うことによって、オブジェクトを作成すると同時に自動的にフィールド変数にデータを入れることができます。
以下がコンストラクタの基本構文です。 コンストラクタには戻り値の型を書きません。
例では以下の箇所がコンストラクタです。 次にコンストラクタを呼び出す方法について説明します。
オブジェクトを作成するとコンストラクタが自動的に実行されるのですが、渡したいデータはオブジェクトの引数に入れます。
この例では以下の箇所です。 つまり、オブジェクトの作成の過程でのデータがコンストラクタのにそれぞれ自動的にセットされることになります。
図にすると以下の通りです。
次は引数のあるコンストラクタと引数のないコンストラクタを両方作った例をみてみましょう。 結果は以下の通りです。 前の例では引数のあるコンストラクタだけでしたが、この例では引数のないコンストラクタも同時に作成しています。
このように引数の数や引数の型が違うならば、同じ名前のコンストラクタを定義することが出来ます。
この例では上のコンストラクタは引数がなく、下のコンストラクタは引数が3つあり、引数の数が違いますので同じ名前のコンストラクタでも定義することが出来ます。これをオーバーロードと言います。
コンストラクタの実行はオブジェクトの引数に応じて呼び出されます。
=>ここでは引数のあるコンストラクタを呼び出しています。
クラスについて知ろう
この章ではクラスについて説明します。
今までのプログラムでは変数とメソッドを扱ってきましたが、クラスと言う機能を使うことで、多くの変数とメソッドを1つの機能体として働かせてデータを処理することが出来ます。
クラスとは何かしらの物を作る設計図に例えられます。
設計図は車や家や鉛筆をつくる場合に必要ですが、この設計図に当たるものがクラスです。
車や家や鉛筆の中には色々な部品が含まれていますが、それらの部品には「状態」や「ふるまい」があります。
例えば、鉛筆であれば、「状態」は鉛筆の形、芯、線の濃さなどで、「ふるまい」は線を引く、削るなどの動作です。
その「状態」や「ふるまい」をクラスと言う設計図に書いていきます。
「状態」を「変数」で書き、「ふるまい」をメソッドで書くことになります。
どのような「状態」や「ふるまい」を作りたいかはオブジェクトの役割です。
例えば「線を引く」「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。
クラスの構文は以下の通りです。 クラスの中に変数やメソッドを書いていきます。
クラスの中の変数をフィールド変数と言います。
次にアクセスレベルについて説明します。
アクセスレベルとは変数やメソッドで使われますが、それらの変数やメソッドに対して、どこからアクセスできて、どこからアクセスできないかを決める修飾子です。
次はオブジェクトについて説明します。
オブジェクトはnew演算子を使って作成します。
オブジェクトとはクラスの中の「状態」を表す変数や「ふるまい」を表すメソッドに指示を出す役割があります。
例えば「線を消す」など具体的な指示をオブジェクトと言う司令塔から出します。 オブジェクトを作る過程をインスタンス化と言います。
ではクラスで作ったプログラムの例を見てみましょう。 このプログラムは銀行でのお金の入金や出金のシステムを簡潔に作っています。2つのクラスがありますが、1つはMainメソッドのあるProgramクラスで、もう1つはGinkouクラスです。
初めにプログラムが実行されるMainメソッドのあるProgramクラスが司令塔になって、他のクラスに指示を出していくことになります。 クラスのフィールド変数には以下の構文でデータを入れます。 クラスのメソッドを実行するためには以下の構文で行います。 その結果、それぞれ以下のメソッドが実行されます。 これらのメソッドはインスタンス化(オブジェクトが作られてから)されてから実行されるのでインスタンスメソッドと呼ばれています。
それぞれのフィールド変数にデータが入ったところで、最後にresultメソッドで出力しています。
結果は以下の通りです。 この例ではProgramクラスを消して、Ginkouクラスにまとめています。
次はアクセスレベルのprivateについて説明します。
これまでのクラスのフィールド変数はpublicにしていますが、これは本来はよろしくありません。
クラスの外側から直接値を入れることが出来てしまうからです。
そこで、フィールド変数はprivateにして、メソッドからこれらのフィールド変数に値を入れる方が最良です。
そして、メソッドはpublicにするのが基本です。
例を見てみましょう。 この例ではすべてのフィールド変数にthisを付けていますが、前の例のように省略が出来ます。
この章では文字列を操作するメソッドについて説明します。
これまでは自身でメソッドを作成してきましたが、C#には初めから機能が定義されているメソッドが複数あります。 =>CompareToメソッドは2つの文字列のデータを比べて、等しければ0を返し、aがbより大きければ0より大きい整数を返し、aがbより小さければ0より小さい値を返します。
では例をみてみましょう。 この例ではaとbは等しいので、0が返ってきますので、結果は「等しい」が出力されます。 =>IndexOfメソッドは文字列aの中から文字列bの位置を先頭から検索して、見つかった場合にはその文字列の位置番号を返します。
その文字列が見つからない場合には-1が返されます。 =>LastIndexOfメソッドは文字列aの中から文字列bの位置を後ろから検索して、見つかった場合にはその文字列の位置番号を返します。
その文字列が見つからない場合には-1が返されます。
では例をみてみましょう。 =>Containsメソッドは文字列aの中に文字列bの文字列が含まれている場合には「TRUE」が返されます。
では例をみてみましょう。 =>IsNullOrEmptyメソッドは文字列がnullかどうか もしくは文字列に何も入っていないかどうかを調べるメソッドです。
nullもしくは文字列に何も入っていない場合にはTRUEを返します。
nullは何のデータもないと言う意味です。
カラの文字列を表現するにはダブルクォートを連続して2つ書きます。
では例をみてみましょう。 結果はaには何も入っていないので「yes」が出力されます。
星座判定をメソッドで作ろう
「if文で星座を判定をしよう」の章ではif文で星座判定のプログラムを作成しましたが、これをメソッドを使って書き換えます。 例えばmonthに1が入り、dayに19が入っているとします。
そうするとの箇所はiが0の時にifの条件式がtrueになりますので、以下の入れ子のif文の条件式の判定に入ります。 「day <= day1[i]」の中のdayには19が入り、「day1[i]」にはday1の0番目の要素である19が入っていますので、条件式はtrueになり、nameにはnames配列の0番目の要素であるやぎ座が入ります。
例えばdayに19ではなく23が入っていると仮定するとはFALSEになるので、の条件式の判定に入ります。
ここで「day2[i]」にはday2の0番目の要素である31が入っていますのでTRUEになり、nameにはに該当する星座が入ります。
1周目ではのiには0が入っていますのでとなり、nameにはみずがめ座が入ることになります。
ここで の説明をします。
「i +1」の箇所の説明をしますと例えばmonthが1で、day が23の場合には
が「23<=19」になり FALSEになるので elseifのブロックに入りますが、 1月はやぎ座と水瓶座しかなく、 やぎ座ではないのならば水瓶座 しかないのでnames配列を 1つ進めるために「i +1」で1を 足しています。
「%12」を記述している理由はの中のiに11が入ると「(i +1)」の箇所が 12になりますが、「%12」の箇所が 無いと仮定するとnames[12]となってしまいますが、実際にnames[12]という 要素はありません。
そこで「%12」で余りを0(12割る12で余り0)にして
「やぎ座」が出るようにしています。
つまり、該当する以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。 結果は以下の通りです。
メソッドについて知ろう4
メソッドについて知ろう3
この章では配列をメソッドに渡す方法について説明します。
では例をみてみましょう。 配列をメソッドに渡すにはという形式で書きます。
この例ではnumber配列をmaxメソッドに渡すのでと書きます。
配列を渡したら、メソッドの仮引数ではのように配列で受け取ります。
maxメソッドの機能は受け取った配列の要素の中で一番大きい数の添え字を返します。
for文の中のifで以下のような順番で大きさを比べています。 そして最後に以下の箇所で出力されます。 number[world1]のworld1には一番大きい配列のインデックス番号が入っているので、となり89が出力されます。
次の例では配列の要素をメソッドに渡して、その配列の値をメソッド内で変更した時に元の配列はどうなるのかについて説明します。 配列は値渡し(変数をメソッドに渡すことを値渡しと言います)ではなく、参照渡しという方法で渡されます。
参照渡しと言いましても特別なことをするわけではなく、配列をメソッドに渡すだけです。
参照渡しでメソッドに配列を渡して、メソッド側でその配列のデータを書き換えると元の配列のデータまでが書き換わります。
普通の変数を値渡しでメソッドに送ってもメソッド側で書き換えることは出来ません。
例では配列の要素であるがkakikaeメソッドのの箇所ですべて4に変えていますが、このようにメソッド側で配列の値を変えることで、呼び出し元の配列の要素も4に変更されます。
結果は以下の通りです。
次の例で呼び出し元の変数を値渡しで渡して、メソッド側でその変数の値を書き換えることができるのか見てみましょう。 では説明を始めます。
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」と言うキーワードを付けます。
では例をみてみましょう。 実引数と仮引数に「ref」を付けるとkakikaeメソッド 内で変数 a,bに値を代入した場合、 Mainメソッド内の変数x,yの値も書き換わります(スペースの都合でkakikaeメソッドの引数を2行で書いていますが1行で書いてもいいです)。
結果は以下の通りです。
refの付いた変数を渡す場合はその変数には何かしらの値が入っていないといけません。
しかし、値の入っていない変数をメソッドに渡したい場合はrefの代わりにoutを使用してください。outもrefと同じで参照渡しです。 結果は以下の通りです。
メソッドについて知ろう2
メソッドについて知ろう1
この章ではメソッドについて 説明します。
メソッドとは「引数」というデータ を受け取って「ある一定の処理」を行い、「戻り値」を返す機能のことを 言います(戻り値を返さないメソッドもあります)。
「引数」とはメソッドを実行するときに使われるデータのことで、「戻り値」とはメソッドを実行した結果 返される値です。
簡単に言いますと 「データ (引数)を 渡すので、この作業をやってくださいね」 と言うとメソッドが作業をしてくれて、 その結果(戻り値)を返してくれるというのがメソッドの機能です。
この一連の流れをメソッドに書いていくわけです。
今までParseメソッドなど幾つかのメソッドを紹介しましたが、これらは初めからC#で用意されているメソッドです。
例えばParseメソッドは文字列を他の型に変換するメソッドです。
この章で紹介するメソッドはユーザー定義メソッドと呼ばれていまして、Parseメソッドのような機能を持つメソッドを自分で作っていきます。
ではメソッドを使う例とメソッドを使わない例を比べてみましょう。
初めはメソッドを使わない例からみてみましょう。 ではメソッドを使わない例の説明をします。 これは2つの数値の平均値を求めるプログラムです。
上記のように同じ内容の処理を3回書くのは面倒ですし、プログラムの可読性が悪くなります。
これをメソッドで書き換えれば処理部分の記述は1か所で済みますので、プログラムの可読性が良くなります。
結果は以下の通りです。
では先ほどの例をメソッドを使って書き直してみましょう。 何度も同じ動きをする文を1つにまとめるのがメソッドの役割の1つなので、先ほどの3か所ある同じような文を1つのメソッドにまとめると以下のようになります。
このようにメソッドの中には機能の部分を書いていきます。 ではメソッドの作成方法について説明します。
メソッドを使うためにはメソッドの定義を行わなくてはいけません。
それが以下の構文です。
このブロックの中にメソッドの具体的な内容を書いていきます。 引数が複数ある場合は「,」を使って、データ間を区切りますが、この引数を仮引数と言います(この構文ではスペースの都合で仮引数の部分を2行目に書いていますが、通常は1行で書きます)。
「戻り値型」についてはこの章の後半で、「アクセスレベル」「static修飾子」については「クラスについて知ろう」で詳しく説明しますので、今の時点では形だけ覚えて頂くだけで結構です。
次はメソッドを実行する方法について説明します。
メソッドは定義しただけでは何も動きません。
メソッドを使いたい時にはメソッドを呼び出さなくてはいけません。
以下の基本構文でメソッドを呼び出します。 カッコの中にある引数を実引数と言います。
この実引数をメソッドに渡して、メソッドに処理をしてもらいます。
この例では引数をheikinメソッドに渡して、平均値を求める作業をしてもらいます。 この渡されたデータを元にメソッド内では平均値を求める処理を実行します。
その他の以下のメソッドも先ほど説明した原理で実行されますので、結果的に3回メソッドが実行されて、結果も3回出力されます。 しかし、仮引数と実引数の型が違っても 小さい型の実引数から大きい型の仮引数への自動変換は出来ます。 この例の場合はint型の「99と96」を「99.0と96.0」に自動変換 してくれます。
次はreturnについて説明します。
先ほどのheikinメソッドはメソッドを実行した時に発生した値を呼び出し元に返していませんでしたが、今度はメソッドを実行した時に発生した値を呼び出し元に返す方法について説明します。
では例をみてみましょう。 結果は以下の通りです。 return文のあるメソッドの構文は以下の通りです。 この例ではheikinメソッドを実行した結果が変数dに代入されていますが,この計算結果を呼び出し元に返したい時にはメソッド内にと記述します。
return文のその他の書き方として、戻り値の箇所に変数を指定する代わりにのように計算式を書くこともできます。
そして、計算結果dの値が呼び出し元に戻されて、そのdの値が変数gに代入されます。
そして、そのgの値を で出力しています。 次に基本構文の中の戻り値の型について説明します。
最初の例の戻り値の型は「void」でしたが、戻り値を返す必要がない場合には戻り値の型を「void」にします。 先ほどの例での戻り値の型は「int」ですが、これは返す値の型に合わせます。 つまり、返す値であるd変数はint型なので、戻り値の型は「int」にします。
次にメソッドでの注意点について説明します。
メソッドの中で宣言される変数はそのメソッドの中でしか使用できないので注意してください。
例えば以下の例のMainメソッドやheikinメソッドの中にある変数は各メソッド内でしか使用することは出来ませんので、他のメソッド内で使うとエラーになります。
以下の例はMainメソッドの中でheikinメソッド内のd変数を使っているのでエラーになります。 また、Mainメソッドとheikinメソッドの中で同じ名前の変数名を使っていますが(変数aと変数b)、メソッド内で宣言をした変数は例えメソッド間で同じ名前の変数を使っても全く違う変数として使うことが出来ます。
つまり、同じ名前の変数ではありますが、まったく違う変数としてみなされます。