C#入門

もくじ

  • C#入門2では、下記の項目を勉強します。
  • 項目は少ないですが、ボリュームはガッチリなので、焦らず気長に行きましょう。
    • ※下の項目を押せばそのページが開きます。

1.クラス

  • クラスとは【設計図のこと】、と思えば理解しやすいです。
  • 例えば、【冷蔵庫の設計図】があるとします。
  • その設計図には、「素材」「大きさ」というデータや、「冷やす機能」「凍らす機能」などが書いてあります。
  • その設計図があれば、同じ冷蔵庫が簡単に作れますよね?
    • 設計図として一つにまとめておけば、いちいち調べる必要がなく、効率が良いという事です。
  • また、その設計図を【金庫】に閉まっておけば、特定の人しか触れないようにも出来ます。
  • つまり【設計図】としてまとめておく事は、セキュリティ対策としても良いわけです。(安全である)
  • そのための【金庫】のような仕組みも「クラス」にあります。
  • C#においては、クラスがないプログラムはありません(動きません)ので、ちゃんと理解しておきましょう。

クラスは、JSやスクラッチにはない概念(がいねん)なので、頭を柔らかくして、ゆっくり進んでいきましょう。※ちなみにCSSの【class】とは別物です。

クラス

(設計図)

クラス

  • クラスを作る事を「クラスを定義(ていぎ)する」という言い方をします。
  • 一番シンプルな形のクラスの定義方法は以下です。
class Reizouko {
    //ここにクラスの中身を書く。
}
  • このように、クラスは自分で作る事も出来ますし、最初から用意されているクラスも多数あります。
  • 初めのうちは、クラスを自分で作る事は少なく、大体の場合、用意されているクラスを使う事が多くなります。
  • このように[ class ]とその後に、クラス名を書きます。
  • クラス名(上では[ Reizouko ])は、必ず最初の文字を大文字にするようにしましょう(rは✕、Rは◯)(小文字でもプログラムは動きますが、大文字にしておけば見やすいコードになります。また、【クラス名の頭文字は大文字】と業界の常識になっていますので、絶対に大文字にしておきましょう)
  • if文などと同じように、"{" から "}"までの範囲が、そのクラスの中身になります。
    • ※これをブロックと言うのでしたね。

クラス

  • では、実際のクラスには何が書かれているのでしょうか?
  • クラスには、以下の2つが書かれます。
    • 値(変数)
    • 機能(処理)
  • これは、【設計図】で言うと、
    • 素材」「大きさ」 == 値(変数)
    • 「冷やす機能」「凍らす機能」 == 機能(処理)

ということになります。

  • また、クラスの中の値(変数)の事を「フィールド」と、機能(処理)のことを「メソッド」と呼びます。
  • クラスに含まれるのは基本的にこの2つだけです。

クラス

フィールド

(変数)

メソッド

(処理)

フィールド

  • クラスの中身、まずはフィールドについて説明です。
  • フィールドはカンタンです。単純に「クラス内で作られる(宣言される)変数の事」です。
  • 下の赤枠がフィールドです。
  • もちろん宣言だけでも、初期化(宣言+代入)しても良いです。
    • ※基本的に初期化しておく方がミスは減らせます。
  • 数に制限はありませんので、いくつでも作る事が可能です。
  • また、フィールドは【メンバ変数】という言い方もします。
  • クラスのメンバーの変数だから[メンバ変数]と覚えてください。

宣言だけ

初期化

(宣言+代入)

メソッド

  • メソッドとは、処理(命令)のことです。
  • 他のプログラミング言語では[関数]という言葉も使われますが、基本的に【メソッドと関数は同じ】と考えても問題ありません。
  • ちなみに、C#には関数は出てこず、メソッドしかありません。
  • ただし、メソッドの事を【メンバ関数】という言い方もしますので、【メソッド==メンバ関数】とも覚えておきましょう。

※メソッドと関数

もう少し詳しくと言うと、クラスの中で作られる処理(多態性をもつ事の出来る処理)は、【メソッド(メンバ関数)】で、それ以外は【関数】です。

ただし、結構色んな意見があったりするので、一般的な解釈と考えてください。

  • プログラミングにおいて、一番重要なのがメソッドです。
  • メソッドを使いこなせれば、ほとんどマスターしたも同然ですので、がんばって使いこなせるようになりましょう。

ちょっと寄り道

色々な単語について

  • これまでに[クラス]やら[オブジェクト]やら、難しい単語が色々出てきました。
  • そんな英語は習ってないからわからない!」とか言いたくなる気持ちはわかりますが、安心してください。
  • プログラミング業界(てかIT業界)での使い方と普通の英語としての使い方はかなり違うので、元々習ってるかどうか大して関係ありません。
  • 特に日本の場合、同じ単語でも、人によって読み方がまったく違うものも多かったりします。

(例:false→フォルス・フォールス・ファルス ,width→ウィドゥス・ウィトス・ウィズ・ワイズ)

  • この内、半分ぐらいは英語の「読み間違え・聞き間違え」が定着してしまったパターンです。

false→ファルスとかは完全に英語を読み間違えてるだけ)

  • また、それ以外にも同じ言葉でありながら「プログラミング言語」の違いや、「文脈(ぶんみゃく:英語でいうとコンテキスト)の違い」によって、意味が変わる物も多いです。
  • 例えば日本語でも「めちゃ美味いアメ舐めてたら、突然アメが降ってきた」と言われた時、最初の”アメ”はアメちゃんの飴だけど、次の”アメ”は天気の雨だとわかりますよね?
  • このような「文脈(コンテキスト)によって意味が変わる」ことがプログラミングにも沢山あります。
  • つまり他人に何かを伝える時や、きく時は、「◯◯にしたいので△△をしたら□□になってしまったどうすれば◯◯になるのか?」など、ちゃんとした文章で伝えなければ伝わりません。
  • □□になるー!バグってる!とか言われてもエスパーじゃないのでわかりません。そこんとこ要注意です。

メソッド

  • メソッドには様々なパターンがありますが、まずは一番カンタンな形を例に、メソッドの作り方と、使いかたを見ていきましょう。

作り方

  • 赤線部分がメソッドです。
  • 最初に【void(ボイド)】というを指定しています。
  • void】とは[戻り値の無いメソッド]に付ける型です。(「戻り値」は後で詳しくやります)
  • その次にメソッド名で、その後に()をつけます。(上ではOndoUp()※基本的になんでも良い
    • メソッドは必ず名前の後に()が付きますので、覚えておきましょう。
  • 続いて{}の中に、処理の中身を書きます。
  • 上の処理は【変数ondoを1足す】だけなのがわかるでしょうか?インクリメントですね。
    • つまりは[ ondoUp ]は温度を上げるメソッドという事です。
  • ここまでが、メソッドの作り方です。

オブジェクト

  • 次は、作ったメソッドの使い方ですが、実はそのまま使えません。
  • 最初に言った通り、クラスはただの【設計図】でしたね。
  • いくら【設計図】に機能(メソッド)が書いても、【設計図】が「温度を上げる(ondoUp)」わけでも、冷やしてくれるわけではありません。
  • そう、冷やしてくれるのは当然【冷蔵庫】本体です。【冷蔵庫の設計図】ではありません。
  • クラスも同じで、クラスを定義しているだけでは、ただの設計図です。
  • その設計図から本物の【冷蔵庫】を作らないと、機能(メソッド)は使えません。
  • この時、【冷蔵庫本体のことをオブジェクト(ものという意味)と呼びます。
  • クラスを定義して→②オブジェクトを作る」という構造でプログラムを組み立てていきます。
  • このようなプログラミング方法を「オブジェクト指向」と呼びます。
  • C#では、必ずオブジェクト指向でプログラミングをします。
    • オブジェクト指向の正しい定義はもうちょっと複雑ですが、とりあえずはこの理解でOKです。

冷蔵庫の

設計図

冷やせない

冷やせる

オブジェクト

クラスから作られたオブジェクトは、そのクラスのインスタンス(実体)と言います。

インスタンスオブジェクトは、同じ意味合いと考えて大丈夫です。

  • という事で、メソッドを使うにはオブジェクトを作る必要があります。
  • 作り方は以下です。
  • 最初にクラス名(上ではReizouko)、次にオブジェクト名(上ではrei)、次に(代入)を書いて、次にnew(ニュー)、最後にクラス名に()をつけたヤツ(上ではReizouko())、
  • ちょっとわかりにくいですが、オブジェクトの作り方は上の一種類なので、覚えちゃいましょう。
Reizouko rei = new Reizouko();

冷蔵庫の

設計図

newする

reiという名前の

冷蔵庫が出来上がり!

クラス

つまり、こんな感じの流れ

オブジェクト(インスタンス)

メソッド

  • それでは、今までの流れをpaiza.ioに入力し、実際に動かしていきましょう。
    • ​※ここから先はpaiza.ioにコードを追加しながら、学んでいきます。もし次回に持ち越す場合などは自分のファイルを作り、コードを保存しておきましょう。やり方は聞いてください。
  • まず最初に、クラスの定義からです。
  • 下のように足りない部分を追記してください。

青枠は、paiza.ioに最初から記入されている部分

※後で使うので消さない

赤枠が、追記するクラスの定義部分

メソッド

  • 次に、インスタンス(オブジェクト)の生成です。
  • インスタンスの生成は「クラスの外で行います。(今はMain(メイン)メソッド)
  • これでインスタンスが生成されました。

インスタンスの作成を追加する

クラス定義は

変更なし

メソッド

  • インスタンスが出来たので、後はメソッドを呼び出してあげるだけです。
  • メソッドを呼び出すには、【オブジェクト名(今回はrei).メソッド名(ondoUp())】とします。
  • メソッドは、呼び出されてから動きます。※呼び出さない限り動きません。
  • 予想では、この時点で変数ondoが5になっているはずです。(まだ試さない)

メソッドの呼び出し

クラス定義は

変更なし。

メソッド

  • では、変更されたはずの変数ondoを表示させてみましょう。
  • 表示させるためのメソッド【System.Console.WriteLine()】は、すでに何度か使っていますよね。
  • フィールド呼び出す時も、メソッドと同じ感じです。
    • オブジェクト名(今回はrei).フィールド名(ondo)
  • 出来たら試してみましょう。※まだ、今はエラーになるはずなので、次のページへ

フィールドを表示させる

クラス定義は

変更なし。

メソッド

  • まだ大事な事を伝えてませんでした。[金庫]機能のことです。
  • 実は今の状態は「金庫が閉まっている」状態で、クラスの外からメソッド(フィールド)を呼びだそうとしても、拒否されてしまいます。
  • そのため、呼び出し方が正しくてもエラーになったわけです。
  • メソッドを使えるようにするには、カギを開けておく必要があります。
  • その「カギを開ける」を表すものが[public](パブリック)というものです。
  • フィールドとメソッドの一番先頭に[public](パブリック)つけてあげましょう。

両方にpublicを追加する

  • 実際に動かして試してみましょう。
  • 5が表示されればOKです。

メソッド

  • [public](パブリック)とは 【どこからでもアクセス(使うこと)が出来る】ということを表すもので、セキュリティ的にノーガード(金庫が空いている)を表すものです。※日本語で言うと「公衆の」「大衆の」みたいな意味で「誰でも使ってOK!」って事です。
  • その逆に、何も記入しなかった場合は、自動的にprivate(プライベート)というものになり、【同じクラスの内からのアクセスのみ可能】(金庫が閉まっている)を表します。※これは当然「私的な」という意味です。
  • 自分でprivate(プライベート)とつけても同じです。
  • これは【アクセス修飾子(しゅうしょくし)】という物で、アクセス出来る範囲を指定するためのものです。​​
    • このアクセス範囲の事を【アクセシビリティ】といいます。

尚、「アクセス修飾子を何も記入しなければ、自動的にprivate(プライベート)になる」というのは、C#の話で、プログラミング言語によっては、まったく逆だったりします。(自動的にpublicになるなど)一応覚えておきましょう。

色々なメソッド

  • メソッドには様々なパターンがあると言いましたが、大きくわけて、以下のパターンがあります。
    • 戻り値ナシ引数ナシ  ※さっき作ったondoUp()メソッド
    • 戻り値アリ引数ナシ
    • 戻り値ナシ引数アリ
    • 戻り値アリ引数アリ
  • つまりは戻り値引数がそれぞれアリナシか?の違いです。
  • 今度は他のパターンも見ていきたいと思いますので、まずは「②戻り値アリ引数ナシ」からいきましょう。
  • 戻り値とは、そのメソッドの呼び出し元に、返す値の事です。(返り値とも言われます)
  • これだけでは、意味不明だと思うので、実際にそれをどう使うのかをみていきましょう。

①メソッド呼び出し

②メソッド実行

③処理結果を返す(戻り値)

1+1は?
2やで
1+1

戻り値がアルとき

戻り値がナイとき

③2になったけど、教えずに終わり

メソッド(戻り値アリ)(引数ナシ)

作り方

  • 青枠が前に作ったメソッドで、①戻り値ナシ&引数ナシです。
  • 赤枠②戻り値アリ&引数ナシメソッドです。
  • まず[ void ]がなくなって、その変わりに[ string ]がついています。戻り値の「アリか?ナシか?」を区別するのがココです。
  • 実は、[ void ]というのは【戻り値がナイ】という事を表す型の一種です。
  • 反対に、戻り値があるメソッドは、その戻り値の型を入力します。
    • (上の例ではstringですが、floatの場合はfloatintintなど、その戻り値によって変わります
  • そして、メソッドの最後にある[ return ](リターン)とは、「コレが戻り値やで」と、戻り値を指定している部分で、returnの右側が戻り値になります。(上の場合だと、変数aが戻り値ですね)

※Reizoukoクラス以外は省略してます。

つまり上画像の②のosirase()メソッドは、

ただいまの温度は4度です!」という文字列を返すメソッド」という事がわかるでしょうか?

戻り値ナシ引数ナシ

戻り値アリ引数ナシ

メソッド(戻り値アリ)(引数ナシ)

  • じゃあとりあえず試してみましょう。
  • paiza.ioで、右の感じにして実行してみましょう。

戻り値ナシ&引数ナシ

戻り値アリ引数ナシ

  • 上の結果になればOKです。
  • osiraseメソッドには戻り値がありますので、ちゃんと表示されましたね。
  • ※このコードは次も引き続き使いますので、消さないようにしておきましょう。

メソッド(戻り値ナシ)(引数アリ)

  • さて、では次のメソッドに行ってましょう。
    • 戻り値ナシ&引数ナシ(前の前のヤツ)
    • 戻り値アリ&引数ナシ(前のヤツ)
    • 戻り値ナシ引数アリ(☆今からやるヤツ)
    • 戻り値アリ引数アリ
  • 次は引数(ひきすう)がアリなメソッドです。
  • 正直、こっからがメソッドと言っても良いぐらい、ほとんどのメソッドには引数があります。
  • で、引数とは何かというと「メソッドの中に値を渡すもの」で、ざっくり言えば「一つのメソッドを、色んな状況で使える」ようにする仕組みです。
  • 試しに、以前作った【ondoUp()メソッド】を改良して、引数アリにしてみましょう。
    public void ondoUp(){
        ondo++;
    }
    public void ondoUp(int num){
        ondo = ondo + num;
    }

劇的ビフォー

アフター

  • メソッドの()の中に[ int num ]というのが増えていますね。これが、引数アリのメソッドの作り方です。
  • つまり()の中が引数で、[型名(上ではint)]と[引数名(上ではnum)]という指定の仕方になります。※名前は何でもOK
  • 見た感じで気づくかも知れませんが、変数の宣言とまったく同じです。というか「引数とはメソッドに値を渡すための変数」なのです。

メソッド(戻り値ナシ)(引数アリ)

  • 一応メソッドの中身も説明しておきましょう。
  • 「ビフォー」の[ ondo++ ]というのは、インクリメントというもので、意味は「1ずつ足す」でしたよね?つまりは、[ ondo = ondo + 1 ]と同じ意味です。
  • そして改良後のメソッドでは、それが[ ondo = ondo + num ]になっています。
  • つまりは「1が引数numに変わっただけ」という事です。
  • とりあえず、ここまでが「戻り値ナシ&引数アリ」のメソッドの作り方例です。
    public void ondoUp(){
        ondo++;
    }
    public void ondoUp(int num){
        ondo = ondo + num;
    }

劇的ビフォー

アフター

   Reizouko rei = new Reizouko();
   rei.ondoUp(2);
  • 次はメソッドの呼び出し方ですが、引数がアリの場合は呼び出し方も少し変わります。
  • 上記が引数アリのメソッドの呼び出し方です。
  • rei.ondoUp(2) ]が変わっていますね。
  • ()中にint型の数字(上では2)を入れていますが、これが先程のnumに代入されます。※重要
  • つまり【numが2に変化する】という事なので、[ondo = ondo + 2;]という事になります。
  • この時2.0fや"こんにちは"など、int型以外の値を指定すると、エラーになります。(これも変数と同じ)
  • では、実際に試してみましょう。
  • メソッドの呼び出し側も変わっている事に注意しながら、paiza.ioで、右の感じにして実行してみましょう。
  • 上の結果になればOKです。

メソッド(戻り値ナシ)(引数アリ)

メソッド(戻り値ナシ)(引数アリ)

  • さて、終わったと見せかけて、引数についてはもう少し続きます。
  • 先程までのメソッドの引数は一つだけでしたが、実際には引数はいくつでも用意できます。(普通は多くても、3つぐらいまでにしますが)
  • 複数の引数は以下のように指定します。
    public void ondoUp(float num, float num2){
        ondo = ondo + num;
        ondo = ondo + num2;
    }
  • 一つ目の引数の後に,(カンマ)で区切って、二つ目の引数を作ってますね。
  • 次に呼び出し方です。
    Reizouko rei = new Reizouko();
    rei.ondoUp(1.8f, 2.0f);
  • このように呼び出す時も,(カンマ)で区切って、それぞれの引数に渡す(代入する)値を指定します。
    • 上記の場合であれば、引数numには1.8が、引数num2には2.0が渡されます。
  • 当然同じ型でないとエラーとなります。(引数が一つの場合と同じ)
  • さらに、メソッドの定義で引数を2つ作っているのに、呼び出す時に一つだけの値しか指定せずに呼び出してもエラーになります。
  • この点は注意が必要です。
    Reizouko rei = new Reizouko();
    rei.ondoUp(1.8f);
  • では最後のパターンに行ってましょう。
    • 戻り値ナシ&引数ナシ(前の前の前のヤツ)
    • 戻り値アリ引数ナシ(前の前のヤツ)
    • 戻り値ナシ&引数アリ(前のヤツ)
    • 戻り値アリ引数アリ(☆これからやるヤツ)
  • 最後は戻り値も、引数も両方アリなメソッドです。でも今までとそんなに変わりません。
  • 今回も以前作った戻り値アリのosirase()メソッドに、引数を追加してみましょう。
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時間前","やで"));
  • あまり、新しい部分はありませんね。実際に動かしてみましょう。
  • メソッドの呼び出し方は③戻り値ナシ引数アリと変わりません。
    • (呼び出し方法は引数アリナシかだけで変わるので、戻り値は関係ないという事)
  • ここまで進んできたキミなら、このコードの結果もうわかるよね!

メソッド(戻り値アリ)(引数アリ)

  • 現時点のコードは右です。
  • 同じにしておいてください。
  • 上の結果になればOKです。
  • 今回は戻り値がありましたので、

rei.osirase("1時間前","やで") ]で呼び出した時、戻り値が返ってきます。

  • つまりrei.osiraseメソッド自体が[1時間前の温度は1.8度やで]に変化するということです。

メソッド(戻り値アリ)(引数アリ)

メソッド(戻り値アリ)(引数アリ)

  • 戻り値引数の動きを表すとこんな感じです。
    • 黄色が戻り値、は引数
  • 処理の動きをつかめば、難しい事はありません。
  • さて、ここまででクラス(設計図)に含まれる【フィールド(値)】、【メソッド(処理)】の関係と、そこから生まれる【インスタンス(オブジェクト)】をなんとなく理解出来たでしょうか?
  • 今までの話は基本メンバ(フィールド・メソッドのこと)の話でしたが、もう一つ特殊なメンバの話をします。
  • そいつは【インスタンス】ではなく、【クラス自体】に所属するメンバの事です。
  • 例えば、先ほど冷蔵庫クラスを思い出してください。
  • 温度(変数ondo)は設計図(クラス)の温度ではなく、設計図から作られた冷蔵庫(インスタンス)の温度ですよね?

staticメンバ

設計図

変数ondo

  • つまり設計図(クラス)から、冷蔵庫(インスタンス)を5台作ったとしたら、変数ondoも冷蔵庫ごとに別々に、5個作られるということです。

変数ondoは冷蔵庫の温度

設計図の温度ではない

商品名とは例えば【iPhone】とかのことです。工場でiPhone】を作るごとに

別の商品名(iケイタイ、iテレフォンとか)を考えていては頭が狂いますよね。

※次のページに続く

  • こんな時に使うのがstatic(スタティック)です。
  • 以下のように型名の前に【static】を付けるだけで、staticメンバになります。

staticメンバ

class Reizouko{
    static int syouhinmei = hiehiekun;
} 
class Reizouko{
    public static int syouhinmei = hiehiekun;
} 
  • アクセス修飾子がある場合も、型名の1つ前です。
  • メソッドの場合も同じです。
  • 以前作った[ondoUp]メソッドも、どの冷蔵庫でもある機能なのでstaticでも良いかも知れません。
class Reizouko{
    static void ondoUp();
} 
class Reizouko{
    public static void ondoUp();
} 
  • さて、staticメンバの意味が分かったところで、次は重要な使い方の話です。
  • インスタンスではなくクラスに所属する】ということからわかるように、staticメンバは【インスタンスを作らなくても使えます
  • つまりnewしなくても良くて、クラス名とメソッド名を.(ドット)で引っ付けるだけで使えます。
  • 下の感じです。

staticメンバ

Reizouko.ondoUp();
  • 「じゃあ基本staticの方を使えば良いってこと?」かというと、そういう事ではありません。
  • static非static(普通ってこと)のメンバの役割は、はっきりと違うのです。
  • 冷蔵庫以外で例えてみましょう。
  • 「人間」というクラスがあるとします。
  • そのクラス「人間」のインスタンスが、これを見ているアナタですし、コレを書いてるです。
  • アナタの名前や身長や体重など、基本的なデータ(フィールド)はそれぞれ違います。
  • また、「出来る事」(メソッド)も違うでしょう。
  • でも「人間」という生物は、生物学的に言うとアナタも、みんな「ホモ・サピエンス」という【学名】は共通しています。
  • 仮に、もしこの【学名】が変更になったとしても、「人間」みんな変更されなければいけません。
  • 「人間なのに一人だけ学名が違う人」は存在しません。
  • つまり【学名】は「人間」クラス自体に所属するstaticメンバということです。
  • 一応、図にしてみるとこんな感じですかね。

staticメンバ

人間クラス

staticメンバ

人間クラス

の学名

インスタンスA

(トム)

トムの【身長】

トムの【体重】

トムの{ジャンプ}

インスタンスC

(りん)

りんの【身長】

りんの【体重】

りんの{ジャンプ}

インスタンスB

(哲夫)

哲夫の【身長】

哲夫の【体重】

哲夫の{ジャンプ}

基本メンバ

【身長】

【体重】

{ジャンプ}

new!

new!

new!

  • オブジェクト指向において「何をクラスにして、何をインスタンスにするのか?」や「何を基本メンバにして、何をstaticにするのか?」を、考えてプログラミングを作り始める必要があります。
  • これを【設計】といいます。
  • 例えば銀行などの管理システムなどの大きなプログラムの場合、「正しい設計を出来る人は極少数」と言われるほど難しいのですが、ちっさいプログラム(ゲーム)でも、全体の設計を意識するのは非常に大事です。
  • staticメンバの事を【クラス変数】や【グローバル変数】などとも呼びます。
  • 尚、staticメンバの内、
    • フィールドの事を【クラス変数(またはクラスフィールド)】や【グローバル変数】、
    • メソッドのことを【クラスメソッド】とかも言います。

staticメンバ

  • オブジェクト指向は言わば考え方です。なのでプログラミング以外でも「オブジェクト指向的に」考える事が出来ます。

ちょっと休憩

あるプログラマーが言っていた事ですが、[なぜ大事な人が死ぬと悲しいのか?]ということを「オブジェクト指向的に」説明することも出来ます。

  1. 人間は誰かと接する時に【自分クラス】からインスタンス(オブジェクト)を生成してから[話す]メソッドなどを使っていると考えられます。
    • ​どういうことかと言うと、​みんな[教師の前での態度]と[友達の前での態度]は違いますよね?
    • それはインスタンスが別だからと考えられるという事です
    • [親に対する自分]、[友達に対する自分]、[先生に対する自分]、[おばあちゃんに対する自分]、[コンビニ店員に対する自分]などなど、別のインスタンスが作られているわけです。
  2. そして、もし仮に【おばちゃんが亡くなった】とすると、[おばあちゃんに対する自分]のインスタンスも消えてしまう、つまりは自分の一部も消えてしまうということです。
    • これが「悲しみの正体」とも考えられます
  3. 大事な人であればあるほど、その相手用の自分オブジェクトも大きくなる(色んな顔を見せる)ので、いなくなった時の悲しみが大きい(消滅するインスタンスが大きい)、という事も説明できます。

※もちろん科学的に証明されてるわけじゃなく、ただの思考遊びです。

  • このように色々な物を「オブジェクト指向的に」考えると、楽しくオブジェクト指向を考えられるので、ぜひやってみてください。
  • ちなみネット上でもオブジェクト指向を何かに例える系」は色々ありますので調べてみても面白いです。(間違ってるのも多いけど)個人的にオススメは「ドラゴンボール」に例えているコレです。※まだやってない要素も出てくるので、ちょっと難しいですが、これが理解出来ればオブジェクト指向を正しく理解出来ています。

3,配列(と、その仲間達)

  • さて、オブジェクト指向はとりあえず終わって、次は、まだ学んでいなかったプログラミングの基本1つ、【配列(はいれつ)】(とその仲間たち)を学びましょう。
  • 配列とは、一言で言うと【変数の集まり】です。
  • 複数の値をまとめておきたい時などに使います。

変数(一つの箱)

配列(複数の箱)

箱の数分だけ、値を入れられる

箱が一つなので、入れられる値は一つだけ

  • 配列に中には、変数と同じように数字、文字、変数など何でも代入できます。
  • 配列のそれぞれの箱のことを、要素(ようそ)と呼びます。
  • また、その要素(箱)は、番号順に並んでおり、その番号の事をインデックス番号と呼びます。
    • (インデックスとは日本語で”見出し”という意味です)
  • ちなみにインデックス番号は、[1]からでなく、[0]から数えます。
  • つまり10個の要素があるとしたら、0−9番のインデックス番号になります。

配列の種類

  • C#には[配列的な機能]を持つ仕組みが3つあり、それぞれ特徴が違います。
    • ①【普通の配列】早いけど使いづらい速度10使いやすさ3
    • ②【遅い配列】使いやすいけど遅い速度3使いやすさ9)​※今は使わない風潮
    • ③【便利な配列】使いやすいし、かなり早い速度8使いやすさ8) 
      • ​​​※()の数字はテキトウです。
  • ②番に関しては、あまり使わない(使わない方が良い)感じなので、説明は除きます。①と③だけ覚えましょう。
  • では、具体的になぜ①【普通の配列】が使いにくいかと言うと、配列を作る際【初めに要素数を決めておかないといけない】という事です。つまり後から要素数を増やせないのです。
  • 逆に③の【便利な配列】は、【要素数を後から自由に増やせる】のです。
  • これが①と③の違いです。

家族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には5つの要素があり、すべて0が入っている状態でした。
  • この内、最初の要素に100を代入したい、そんな場合は以下のように指定します。
  • 配列名[インデックス番号]という感じで指定します。
  • インデックス番号は0から数えるのでしたね。つまり最初の要素の番号は[0]になります。
  • 同じように【特定の要素を表示させたい】【計算に使いたい】などの場合は下の感じです。
abc[0] = 100;
abc[0] = 100;
abc[1] = 50;
abc[2] = abc[0] + abc[1];
System.Console.WriteLine(abc[2]);
  • まぁ変数と同じですね。(ちなみに上記のコードは150が表示される)

普通の配列

  • 先程、int型の配列の要素(箱)を作ったら勝手に0が代入されている(0で初期化されている)事は言いましたが、最初から好きな値を入れておく書き方もあります。
  • 上の例の場合、abc[0]には50、abc[1]には100と、左から順番に要素に入ります。
  • 意味的には、下のコードと同じになります。
int[] abc = {50,100,150,0,0};

ちなみに【new】は、クラスからオブジェクト(インスタンス)を作る際に使ったのを覚えているでしょうか?

その事から、実は【配列を作る】というのは【「配列クラス」のオブジェクト(インスタンス)を作る】という事がわかりますね。

int[] abc = new int[5];
abc[0] = 100;
abc[1] = 50;
abc[2] = 150;

これと同じ

  • newとか書かなくて良いし、イチイチ代入しなくて良いし、非常にラクですね。
  • 入れる数字が決まっていない要素は、0を入れておけば良いので、使い勝手も良いです。
  • あえて遠回りしましたが、基本はこの書き方を使うのが良いかと思います。

便利な配列

  • 次は「便利な配列」です。
  • これは正確には配列ではなく【List(リスト)】という名前なので、以後は「リスト」と呼びます。
  • では、配列との違い比べながら、リストについて理解していきましょう。
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(値)】と書くと、リストの末尾に、()の中の値が入った要素が追加されます。
  • 続けて書くとこんな感じです。
abc.Add(123);
  • 最初に5つの要素[0-4]があり、その末尾に[5]が追加されたということです。
  • そしてabc[5]には123という整数が入っているので、当然123が表示される事になります。
  • ちなみに【add】(アッドまたはアド)とは「足す」とか「加える」という意味で、非常に良く使います。
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の使い方ですよね。(最近は、「コンピュータに振り回されている」人間が多いように思えます)

配列・リストの本当の力

  • さて、配列・リストについて見てきましたが、まだ現時点では「変数の合体したヤツ」程度にしか思っていないはずです。
  • 配列やリストは「繰り返し文(for文)とセットで使う」事で、本当の力を発揮します。
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]+"点です。");
}
  • このコードを実際に試して、意味をつかんでください(なんとなくの雰囲気でわかると思いますが)
  • これはかなり単純な使い方ですが、他にも「すべての要素に◯◯を加える」や、「要素を合計する」「平均を出す」など、配列と繰り返し文を組み合わせれば、非常に簡単にプログラムが組めます。
    • (もし変数で同じ事をしようとするとゾッとするほどメンドウですよね?)
  • この事を「syori ループで回す」みたいな言い方をします。
  • この「ループで回す」ことをイメージしてから配列を作れば、プログラムが作りやすくなります。
string[] name = {"トム","虎鉄","サーシャ","エルドラド"};
int[] seiseki = {80,78,92,100};
for(int i=0; i<name.Length ; i++){
    System.Console.WriteLine(name[i]+"の成績は"+seiseki[i]+"点です。");
}

リスト

配列

他の配列の仲間たち

  • 実は、まだまだ配列には種類があります。
  • もうお腹いっぱいでしょうが、軽くだけ触れておきましょう。
    • 【使いやすいけど遅い】と呼ばれてたアイツ
      • 実はコイツもリストです。
      • 正確にはコッチは普通のリストで、さっきやった【List<>】がジェネリック型のリストというものになります。
      • ジェネリックとは「抽象的に型指定が出来る仕組み」ですが、特に気にしなくて良いです。
      • 一番大きな違いは、コッチの普通のリストは、違う型(intとstringなど)を同じ配列の要素に出来るという特徴があるけど、そんな事しなくても良いので今すぐ忘れましょう。
    • 【​Dictionary(ディクショナリ)】
      • ディクショナリとは「辞書」の事です。
      • 一般的に【連想配列】や【ハッシュ】と呼ばれることが多いです。
      • 配列やリストと違う点は、[0]とか[3]とかのインデックス番号がなく、その代わり【key(キー)】と呼ばれる”名前”と【値】のセットにして、要素(箱)に入ります。
      • つまり要素を指定する時に、番号ではなくキーを指定して値を呼び出すことになります(abc[0]ではなく、abc["Tom"]など)。
      • プログラミングしていれば、必ず使う事になるだろう重要な機能ですが、Unityであまり使わないので今はスルーします。

4,名前空間・Using文

  • 最後は【名前空間】に関してです。ここはカンタンなので安心してください。
  • 名前空間とは、「クラス名の重複を避けるため」の仕組みです。
  • プログラミングをしているとして、以下のような問題が起こる事あります。
    • Aくん”ステージをクリア”した時のプログラムを作ったぞ!これをクラスにしておこう。クラス名は"Clear"でいいか」
    • Bくん"透明になる魔法"のプログラムを作ったぞ!透明は英語でclearだし、クラス名は"Clear"にしておこう
  • このように同じクラス名が出来てしまう事は実はよくある事です。
  • 当然、このまま【clearクラス】を使おうとすると、「どっちのClearなんだよ!」と怒られます。
  • これを避けるために、それぞれ別の空間に分けていれておくためのモノが「名前空間」というものです。
  • それぞれの空間を「namespace(ネームスペース)」と呼びます。

ステージという

ネームスペース

Clear

魔法という

ネームスペース

Clear

名前空間ステージのClearのことな」

「なんやソッチかいな」

名前空間

  • カンタンに言えば「名字」と同じです。
  • 同じ「イチロー」君でも「鈴木」と「山田」では別のイチローだって、すぐにわかりますもんね。(ただし当然、名字(ネームスペース)まで一緒になってしまうとどうしようもないので注意です。
  • 実際の作り方はめちゃ簡単です。

using System.Collections.Generic;

  • この中の[ using ] がポイントで、名前空間を利用するためのキーとなります。
  • ただし、名前空間は複数人で結構大きなプログラムを作る時しか使わないので、"作り方"は重要ではありません。(たぶん一人でプログラミングする時は作る事ない)
  • じゃあ、なぜこの説明をしているかと言うと、ズバリ「"使い方"を理解する」ためです。
  • というのも、プログラムを作る際に、真っさらの状態から始める事は、現代ではほぼありません。
  • 特にゲーム作りは開発エンジン(Unityなど)を使わずに、作る可能性はほぼ0です。
  • つまり最初から用意されているネームスペースやクラスが沢山あるので、それを正しく利用出来るスキルが必要になります。なので、名前空間に関しては使い方だけをマスターしましょう。
  • そういえばpaiza.ioに記入した、下の部分を覚えていますでしょうか?
namespace abc{
  class Test{
    //省略
  };
};

←クラスを包むように書くだけ

名前空間

  • usingを理解しやすくするために、名前空間のデメリットにも触れておきましょう。
  • 名前空間の中のクラスを使う時は、以下のように指定しなくてはいけません。

名前空間.クラス

  • まぁ簡単に言えば、クラスを指定する時に、書くコード量が増えるという事です。
  • さらに大きなプログラムの場合、名前空間は複数重なっている(ネスト)場合も多いです。
  • そうなると当然、以下のように書かないといけません。

名前空間1.名前空間2.クラス

  • という感じで、どんどん長くなります。一箇所だけなら我慢しましょうが、何箇所もこんなに書くのは非効率ですよね。
  • という事で、この名前空間のデメリットを解消するための仕組みが、次のページからやるusingになります。

using(ユージング)

  • using(ユージング)とは、主に2つの使い方があります。
    • ①名前を短縮(たんしゅく)する
    • ②別の名前をつける※アダ名みたいなもん
  • このうち、paisa.ioに入力した[ using System.Collections.Generic; ]は①の使い方です。
  • たとえば上のコードのように、using〜がないままだと【List<>】が使えず、エラーになってしまうと、前に言いましたね。
  • なぜ使えないかと言うと、実は【List<>】は短縮された名前で、正式名称は、
    • System.Collections.Generic.List<> 】だからです。※試しに正式名称で書いても動きます。
  • 当然、長すぎて書くのが大変ですよね?なのでusing(ユーシング)を使ったのです。
  • System.Collections.Generic の部分は名前空間を指しています。
  • .(ドット)ごとに一つのネームスペースを表すので、Sytem(システム)の中の、Collections(コレクション)の中の、Generic(ジェネリック)って意味になります。最後のジェネリックの中にList<>クラスがあるという事です。(長い!)
  • このように[ using System.Collections.Generic; ]と最初に書いておく事によって、

System.Collections.Generic ]部分を短縮でき、List<>】だけで動くようになったのです。

using(ユージング)

  • このusing(ユーシング)での短縮はよく使いますので、もう少しイジってみましょう。
  • 上のコードの中で、まだなんか短く出来そうなとこありますね。
  • [System.Console.WriteLine(w.Count);]の部分です。下みたいに変えてみましょう。※赤線の部分です、
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);
    }
}
  • 少し短くなりましたね。
  • え?[using System.Console;]ではダメなのかって?はい、ダメです。エラーになります。

using(ユージング)

  • なぜ[using System.Console;]だとダメかと言うと、[Console]はネームスペースの名前ではなく、クラス(型)だからです。
  • つまり[System.Console.WriteLine]は[ネームスペース名.クラス名.メソッド]という並びになっているんですね。
  • クラス名も短縮したい場合は、usingだけではダメで、[using static]とする必要があります。
  • 上のようにすると動きます。
  • この「ネームスペース名なのかクラス名(型)なのか?」問題は結構やっかいで、パッと見は区別が出来ません。
  • いちいち調べるのも面倒ですし、だから[static]でクラス名まで短縮する人は少ないと思います。
  • 大事なのは上みたいなコードに出会った時に、その読み方がわかるかどうかです。

using(ユージング)

  • ​さて、もう一つの使いかた「②別の名前をつける」とはどういうことかと言うと、下の感じです。
  • まんま変数と同じ使い方なのがわかりますか?簡単ですね。
  • しかも、この方法だと、先程の「ネームスペース名なのかクラス名(型)なのか?」問題も気にする必要がありません。下のコードでも問題なく動きます。
  • ちょっと入門編ではないような内容ですが、usingを知っておくとラクにプログラミングが出来ます。

ちなみに「別名をつける」というのはalias(エイリアス)と言います。

IT業界ではよく使われる単語です。

C#入門編おわり

  • お疲れ様です。C#の基礎的な部分はこれで終わりです。
  • きっと「大学でプログラミング学び始めて1年」ぐらいのスキルは付いたかと思います。(たぶん)
  • 次はまたUnityでゲーム作りを進めましょう。(またプログラミング中にわからなくなったら、戻ってきてください)
  • 下の画像を押せば「Unity入門2」に進みます。