クラスは、JSやスクラッチにはない概念(がいねん)なので、頭を柔らかくして、ゆっくり進んでいきましょう。※ちなみにCSSの【class】とは別物です。
クラス
(設計図)
class Reizouko {
//ここにクラスの中身を書く。
}
ということになります。
クラス
フィールド
(変数)
メソッド
(処理)
宣言だけ
初期化
(宣言+代入)
※メソッドと関数
もう少し詳しくと言うと、クラスの中で作られる処理(多態性をもつ事の出来る処理)は、【メソッド(メンバ関数)】で、それ以外は【関数】です。
ただし、結構色んな意見があったりするので、一般的な解釈と考えてください。
色々な単語について
(例:false→フォルス・フォールス・ファルス ,width→ウィドゥス・ウィトス・ウィズ・ワイズ)
(false→ファルスとかは完全に英語を読み間違えてるだけ)
作り方
冷蔵庫の
設計図
冷やせない
冷やせる
クラスから作られたオブジェクトは、そのクラスのインスタンス(実体)と言います。
インスタンスとオブジェクトは、同じ意味合いと考えて大丈夫です。
Reizouko rei = new Reizouko();
冷蔵庫の
設計図
newする
reiという名前の
冷蔵庫が出来上がり!
クラス
つまり、こんな感じの流れ
オブジェクト(インスタンス)
青枠は、paiza.ioに最初から記入されている部分
※後で使うので消さない
赤枠が、追記するクラスの定義部分
インスタンスの作成を追加する
クラス定義は
変更なし
メソッドの呼び出し
クラス定義は
変更なし。
フィールドを表示させる
クラス定義は
変更なし。
両方にpublicを追加する
尚、「アクセス修飾子を何も記入しなければ、自動的にprivate(プライベート)になる」というのは、C#の話で、プログラミング言語によっては、まったく逆だったりします。(自動的にpublicになるなど)一応覚えておきましょう。
①メソッド呼び出し
②メソッド実行
③処理結果を返す(戻り値)
1+1は?
2やで
1+1
戻り値がアルとき
戻り値がナイとき
③2になったけど、教えずに終わり
作り方
※Reizoukoクラス以外は省略してます。
つまり上画像の②のosirase()メソッドは、
「ただいまの温度は4度です!」という文字列を返すメソッド」という事がわかるでしょうか?
①戻り値ナシ&引数ナシ
②戻り値アリ&引数ナシ
①戻り値ナシ&引数ナシ
②戻り値アリ&引数ナシ
public void ondoUp(){
ondo++;
}
public void ondoUp(int num){
ondo = ondo + num;
}
劇的ビフォー
アフター
public void ondoUp(){
ondo++;
}
public void ondoUp(int num){
ondo = ondo + num;
}
劇的ビフォー
アフター
Reizouko rei = new Reizouko();
rei.ondoUp(2);
public void ondoUp(float num, float num2){
ondo = ondo + num;
ondo = ondo + num2;
}
Reizouko rei = new Reizouko();
rei.ondoUp(1.8f, 2.0f);
Reizouko rei = new Reizouko();
rei.ondoUp(1.8f);
public string osirase(){
string a = "ただいまの温度は"+ondo+"度です!";
return a;
}
劇的ビフォー
アフター
public string osirase(string str, string str2){
string a = str+"の温度は"+ondo+"度"+str2;
return a;
}
Reizouko rei = new Reizouko();
rei.ondoUp(2.8f, -1.0f);
System.Console.WriteLine(rei.osirase("1時間前","やで"));
[rei.osirase("1時間前","やで") ]で呼び出した時、戻り値が返ってきます。
設計図
変数ondo
変数ondoは冷蔵庫の温度
設計図の温度ではない
商品名とは例えば【iPhone】とかのことです。工場で【iPhone】を作るごとに
別の商品名(iケイタイ、iテレフォンとか)を考えていては頭が狂いますよね。
※次のページに続く
class Reizouko{
static int syouhinmei = hiehiekun;
}
class Reizouko{
public static int syouhinmei = hiehiekun;
}
class Reizouko{
static void ondoUp();
}
class Reizouko{
public static void ondoUp();
}
Reizouko.ondoUp();
人間クラス
staticメンバ
人間クラス
の学名
インスタンスA
(トム)
トムの【身長】
トムの【体重】
トムの{ジャンプ}
インスタンスC
(りん)
りんの【身長】
りんの【体重】
りんの{ジャンプ}
インスタンスB
(哲夫)
哲夫の【身長】
哲夫の【体重】
哲夫の{ジャンプ}
基本メンバ
【身長】
【体重】
{ジャンプ}
new!
new!
new!
あるプログラマーが言っていた事ですが、[なぜ大事な人が死ぬと悲しいのか?]ということを「オブジェクト指向的に」説明することも出来ます。
※もちろん科学的に証明されてるわけじゃなく、ただの思考遊びです。
変数(一つの箱)
配列(複数の箱)
箱の数分だけ、値を入れられる
箱が一つなので、入れられる値は一つだけ
家族4人の体重を管理したいと思います。
4人分なので、4つの要素を持つ配列を作りました。
毎月体重を測っては、前月と比較してから最新の体重に更新をするなど、良い感じに管理できていましたが、ある日突然、新しい家族が増えました。
当然、家族が増えたので配列の要素を増やしたいですが、①の【普通の配列】だと、後から増やせないので非常困りますよね?
③の【便利な配列】で作っておけば、問題なく増やす事が出来ます。
つまりは、【後から要素が増える可能性がある場合】は③、【増える可能性は0】の場合だけ①の配列にするべきですね。
例
int[] abc;
abc = new int[5];
宣言
代入
型名(例ではint)の後に[]をつける。
それ以外は変数と同じ。
配列名と=までは、変数と同じ。
右側で、new 型名[要素数]のように指定する。
この時、決めた要素数(例では5個)が後から変更できない。
int[] abc = new int[5];
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin urna odio, aliquam vulputate faucibus id, elementum lobortis felis. Mauris urna dolor, placerat ac sagittis quis.
宣言+代入
ちなみに上記では、配列abcに5つの要素(箱)を作っただけですが、実はそれぞれの要素(箱)には、すでに0という整数が入っています。
このように配列の場合は、要素(箱)を作ると、勝手に初期値を入れて初期化してくれます。
(int型なので、0ですが初期値は型によって変わります)
abc[0] = 100;
abc[0] = 100;
abc[1] = 50;
abc[2] = abc[0] + abc[1];
System.Console.WriteLine(abc[2]);
int[] abc = {50,100,150,0,0};
ちなみに【new】は、クラスからオブジェクト(インスタンス)を作る際に使ったのを覚えているでしょうか?
その事から、実は【配列を作る】というのは【「配列クラス」のオブジェクト(インスタンス)を作る】という事がわかりますね。
int[] abc = new int[5];
abc[0] = 100;
abc[1] = 50;
abc[2] = 150;
これと同じ
List<int> abc;
配列
abc = new List<int>();
宣言
代入
List<型名>という見慣れない書き方ですが、 【型名[]】が【List<型名>】に変わっただけです。
ちなみに【List<型名>】は【list<型名>】だとエラーなので注意。(大文字)
<>がHTMLぽくて、ちょっとキモいですね。
こちらも基本は宣言と同じで、【型名[]】の部分が【List<型名>()】に変わっただけです。※()が増えてることに注意!
大きな違いは「要素数を指定しない」ところです。(int[5]みたいに)
これは後で増やせるから、最初に作っておく必要がないって事ですね。
int[] abc;
abc = new int[5];
リスト
配列
リスト
int[] abc = new int[5];
宣言+代入
List<int> abc = new List<int>();
配列
リスト
※注意
リスト(List<>)をpaiza.ioで動かすには、一番上の行に
using System.Collections.Generic;
と追加してください。(説明はそのうち)
なんか「とりあえず後ろに引っ付けた感」があってキモいですね…
List<int> abc = new List<int>{50,100,150,0,0};
int[] abc = {50,100,150,0,0};
abc[0] = 100;
abc[1] = 50;
abc[2] = abc[0] + abc[1];
System.Console.WriteLine(abc[2]);
abc[0] = 100;
abc[1] = 50;
abc[2] = abc[0] + abc[1];
System.Console.WriteLine(abc[2]);
配列
リスト
配列
リスト
List<int> abc = new List<int>(){50,100,150,0,0};
省略版
abc.Add(123);
List<int> abc = new List<int>{50,100,150,0,0};
abc.Add(123);
System.Console.WriteLine(abc[5]);
[.Add()]という書き方から分かる通り(?)
これはC#で最初から用意されている【組み込みメソッド】です。
「末尾に加える」以外にも、
指定した場所に挿入する→【.Insert()】(インサート)
削除するメソッド→【.Remove】(リムーブ)
検索するメソッド→【.Contains】(コンテインズ)
並び替えるメソッド→【.Sort】(ソート)
その配列の長さを取得する→【.Count】(カウント)
など、便利に使えるメソッド(機能)が用意されています。
要素の数を変えるようなメソッドは、リストにしか使えない(配列は要素数を後から変更できない)ですが、普通の配列でも使用できるメソッドもあります。
特によく使うのが「その配列の長さを取得する.Length」メソッドというのもあります。
これを使うと要素数を返してくれます。(戻り値のあるメソッドってことですね)
int[] abc = {0,1,2,3,4,5};
System.Console.WriteLine(abc.Length);
こんな感じです。当然、結果は6ですね。
ただし【.Length】は配列用のメソッドで、リストの場合は【.Count】になります。(ややこしい)
他にも、C#というプログラミング言語一つだけでも非常に多くの機能が用意されています。
ただ、学校の勉強と違って「暗記しよう」なんて思う必要はありません。(てか無理)
大事なのはどんなことが出来るか「理解する事」です。「覚える事」は重要ではありません。
例えば何かプログラムを作る時に、「そういやあんなメソッドあったな」または「たぶん、こんなメソッドあるんちゃうかな?」と自然に考えられるようになる事が大事です。
それが思い浮かぶ知恵があれば、実際の使い方は調べれば良いだけですから。
(目の前にパソコンがあるやろ?精神です)
「コンピュータのやるべき事」はコンピュータにさせて、人間は「人間のやるべき事」に集中することが大事です。
それが正しいITの使い方ですよね。(最近は、「コンピュータに振り回されている」人間が多いように思えます)
List<string> name = new List<string>(){"トム","虎鉄","サーシャ","エルドラド"};
List<int> seiseki = new List<int>(){80,78,92,100};
for(int i=0; i<name.Count ; i++){
System.Console.WriteLine(name[i]+"の成績は"+seiseki[i]+"点です。");
}
string[] name = {"トム","虎鉄","サーシャ","エルドラド"};
int[] seiseki = {80,78,92,100};
for(int i=0; i<name.Length ; i++){
System.Console.WriteLine(name[i]+"の成績は"+seiseki[i]+"点です。");
}
リスト
配列
ステージという
ネームスペース
Clear
魔法という
ネームスペース
Clear
「名前空間ステージのClearのことな」
「なんやソッチかいな」
using System.Collections.Generic;
namespace abc{
class Test{
//省略
};
};
←クラスを包むように書くだけ
名前空間.クラス
名前空間1.名前空間2.クラス
[ System.Collections.Generic ]部分を短縮でき、【List<>】だけで動くようになったのです。
using System.Collections.Generic;
public class Hello{
public static void Main(){
List<int> w = new List<int>(){0,1,2};
System.Console.WriteLine(w.Count);
}
}
ちなみに「別名をつける」というのはalias(エイリアス)と言います。
IT業界ではよく使われる単語です。