転職を繰り返したサラリーマンの多趣味ブログ

30才未経験でSEに転職した人の多趣味ブログ

【技術書メモ】C#プログラミングのイディオム / 定石&パターン①

趣味で、Unityでゲームを作っているが、C#についてちゃんと勉強したことがない。
そのため、ここらでC#について基礎から学ぼうと思い、以下の技術書を読んだ。
uuc1h.hatenablog.jp
入門としては、最適な良書だと思う。
そこで、次に入門書の一歩先の技術書を読もうと思い、この本を選択した。

まだまだ序盤しか読んでないが、かなりの良書の予感。。
文法を説明するだけでなく、どういったときにこういう書き方をしなければならないのかという、一歩踏み込んだところまで書いてくれている。
ていうことで、読んだだけでは頭に残らないので、読んだ内容をブログにまとめていきます。

プロパティ

プロパティとは、Javaでいうセッター、ゲッターメソッドの代わりだと認識していた。
ただ、C#3.0で導入された自動実装プロパティのことは知らなかった。こっちの方が凄い簡単。

// 自動実装プロパティを使った書き方
public int Code { get; set; }

// 自動実装プロパティを使わない書き方
private int code;
public int Code 
{ 
    get { return this.code; }
    set { this.code = value; }
}

これまで6行で書いていたところを、たった1行で済んでしまう。。

※ここでちょっとした参考になったこと。
なぜ値型と参照型が必要なのか。
参照型と値型の違いは分かっているのだが、使い分けが分からなかった。
よく入門書では、大きなオブジェクトをコピーする際、値型だったらコピー処理が大変だが、参照型だったらアドレスをコピーするだけですむ。と書いてあるが、これは分かる。
けど、この本には小さなオブジェクトの場合、参照型だとオブジェクトを格納する領域と、アドレスを格納する領域と2つ必要になってしまう。値型なら、変数の領域そのものにオブジェクトを格納できる利点があると書いてあり、腹落ちした。

静的クラスについて

静的クラスの定義方法などは分かっているので、ここでは静的クラスを使う理由について。
インスタンスは、1つのクラスから複数を生成できるので、たとえば以下のようなクラスがあったとする。

class Product
    {
        public int Price { get; set; }

        public double getTaxPrice()
        {
            return this.Price * 1.08;
        }

    }

1つのクラスから複数のインスタンスを生成できるので、車オブジェクトやバイクオブジェクトなどを生成でき、それぞれ個別の値を変数Priceに設定できる。
そのため、Productクラスを静的クラスにしてしまうと、上記利点が消えてしまう。
そのため、静的クラスは特定の値に左右されない場合に適用する。代表的なのが、DateTime.Todayなど。

継承について

// 基底クラス
class Person
    {
        // 名前
        public string Name { get; set; }
        // 誕生日
        public DateTime Birthday { get; set; }

        // 年齢を返却
        public int GetAge()
        {
            DateTime today = DateTime.Today;
            int age = today.Year - Birthday.Year;
            if(today < Birthday.AddYears(age))
            {
                age--;
            }
            return age;
        }
    }
// 派生クラス
class Employee : Person
    {
        // 社員ID
        public int Id { get; set; }
        // 部署名
        public string DivisionName { get; set; }
    }
class Program
    {
        public static void Main(string[] args)
        {
            Employee em = new Employee
            {
                Id = 100,
                Name = "山田",
                Birthday = new DateTime(1980, 1, 1),
                DivisionName = "プログラミング1課",

            };

            Console.WriteLine("{0}({1})は、{2}に所属しています", em.Name, em.GetAge(), em.DivisionName);
        }
    }

継承については、文法的にはJavaとほぼ一緒の印象。なお、基底クラスの変数に派生クラスのインスタンスを代入可能だが、その場合基底クラスのプロパティやメソッドしか使用できない。(これもJavaと一緒)
ちなみにis a 関係というものを知らなかったのでメモ。
継承は「〇〇は△△である」という関係が成り立つときに使用する。上の例でいえば、「社員は人である」という関係が成り立つので、継承を使用して可。
逆に、「人は社員である」という関係は成り立たないので、継承を使ってはいけないとのこと。