C#の勉強記録その4

続きです。

今更だけどこの勉強記録ってドットインストールの有料講座の内容の備忘録なんで、怒られたりするかもね。まあでも誰も読んでないからいいや。一応リンクだけ貼る。

https://dotinstall.com/lessons/basic_csharp

前回はstatic修飾子(クラス側でフィールドを保持できる)と抽象クラス(継承されるために書くクラス)とインターフェース(メソッドだけ継承させるときに使う)までをまとめました。

書いてきたこと全部覚えてるのかと言われると全然そんなことはないけどね、後で見返したら思い出せるからいいのいいの

 

ジェネリック

クラスを作るときに型の種類を任意にすることができる。
~後日追記~
クラスじゃなくても使える。メソッドでは
public void yahho(<T>){ 処理 }
これでいい。<>で囲ってさえいればいいみたい。
~~~~~~

これじゃ意味わからんな、もう少しかみ砕く。

例えば下記のようなクラスがあるとする。

class number{
    public void number(int num){
        Console.WriteLine(num);
    }
}

こいつのインスタンス.number(数値)としてやれば与えられた数値をコンソールに出力する。

しかし、「数値以外も出力できたらいいな」と思ったとする。
このとき、

class number<T>{
    public void number(T num){

        Console.WriteLine(num);
    }
}

としてやると、どんな型を引数にしてもよくなる。
ちなみに「<>」の中身はTじゃなくてもいいけど、一般的にこう書くことが多いらしい。
「<T>」を記載したことで、このクラスの中ではTはそのときの引数に応じた型に変化してくれる。意味合い的には「ここにはどんな型が入るか分かんないけど、仮にTとしておくね。」ということ。
数学の授業でx + 4 = 5みたいな計算式があるけど、あれに近い。xはまだ分からないけど仮でこの文字にしとくねっていう。

これは便利そう。いや使うシーンは具体的に想像できてないけど。

名前空間

namespace。同名のクラスやメソッドを作りたいとき、その上位の名前空間を分けておけば競合せずに済むよ、というやつ。

それだけでなく、例えば「外部出力関連はこの名前空間にまとめて、データ操作関連はこの名前空間にまとめる」という風に名前空間ごとにテーマを持たせて、関連したクラスはその中に書いていくようにすると後でコードを振り返りやすい。

プログラム冒頭に

using System;
using GaibuShuturyoku;

みたいに書いておくと、その後の処理でクラスやメソッドを呼び出すときに

例1:Gaibushuturyoku.kakikomi()

とか書かずに

例2:kakikomi()

名前空間を省略して書くことができるので楽できる。
ただし、複数の名前空間で同じクラス名が定義されている場合は例2のように名前空間を省略できないので注意。他の名前空間上のクラスと競合しなければクラス名だけでも大丈夫。

構造体

クラスの機能縮小版という感じのもの。単純な値やメソッドを定義して、クラスと同様にインスタンスを作る基として使うことができる。

struct kouzou{
    int X;
    int Y;
    public void SayYeah()
    {
        Console.WriteLine("Yeah");
    }
}

 

ここまで書いてきたコードだとクラスの中身が単純すぎてこれにあんまりメリット感じないけど…

クラスと違い、継承ができないなどの制約もある。
一番の違いは「メモリの使い方」らしいんですけど、以前基本情報のためにちょっとだけCをかじったときにマジで分からなかったのでこの話はいいや…

 

今日のところは以上!