山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

実践で役立つ C#プログラミングのイディオム/定石&パターン その1

Chapter 1 オブジェクト指向 プログラミングの基礎

最近、Unity を使っているので、C# について理解を深めるために本を使って勉強しようと思います。

1.1 クラス

C# ではプロパティというものが存在します。get と set に対してそれぞれ異なるアクセス修飾子をつけることができます。

// 出席番号
public int Number { get; private set; }

私は Java を勉強したことがあるので、クラスの使い方はある程度把握しています。例えば、Human クラスのインスタンス "jon" の Height は自由に変更できますが、Problem クラスで宣言された "jon" の Height は変更することができません。

class Human
    {
        // 出席番号
        public int Number { get; private set; }
        // 名前
        public string Name { get; private set; }
        // 身長 (靴を含まない)
        public double Height { get; private set; }


        // 靴を含んだ身長
        public double GetHeightIncludingShoes()
        {
            return Height + 3.0;
        }


        // コンストラクタ
        public Human(int number, string name, int height)
        {
            this.Number = number;
            this.Name = name;
            this.Height = height;
        }


        static void Main(string[] args)
        {
            Human jon = new Human(1, "jon", 180);
            Console.WriteLine(jon.Height);
            Console.WriteLine(jon.GetHeightIncludingShoes());
            // アクセスレベルが違うためエラーとなる
            jon.Height = 170;
            Console.WriteLine(jon.Height);
        }
    }


    class Exec
    {
        static void Main(string[] args)
        {
            Human jon = new Human(1, "jon", 180);
            Console.WriteLine(jon.Height);
            Console.WriteLine(jon.GetHeightIncludingShoes());
            //アクセスレベルが違うためエラーとなる
            //jon.Height = 170;
        }
    }

通常一つのプロジェクトに Main 関数を持つクラスは一つだけにしますが、上記のように二つのクラスに持たせたいときは、次のように設定します。

f:id:yamakasa3:20190711214731p:plain

f:id:yamakasa3:20190711214742p:plain

まあ、こういう書き方は推奨されないと思いますが、プログラミング学習をするときは関係ないですね。

1.2 構造体

クラスと構造体の違いは、クラスは継承できますが、構造体は基本的に継承できません。簡単なオブジェクトを表現するときは構造体が相応しいと思います。

struct Point
    {
        public int X { get; set; }
        public int Y { get; set; }
        public int Norm()
        {
            return X * X + Y * Y;
        }
    }

1.3 値型と参照型

構造体は値型、クラスは参照型。値型は他にも、int, Long などがあります。また、割り当てられるメモリの領域が異なります。

1.4 静的メンバーとクラス

インスタンスを作る必要性のないクラスが静的クラスとなります。下記のサイトが分かりやすいですね。

静的メンバー - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

また、オブジェクト指向を学ぶ上で必要な概念となります。

1.5 名前空間

Java でいうパッケージみたいなものでしょうか。クラス名の衝突を防ぐために必要になります。大規模なプログラムになると恩恵を受けられるみたいです。

違いについては、下記のサイトから。

パッケージ名と名前空間の違い - マイクロソフト系技術情報 Wiki

名前空間があるとネストが深くなるのが気になります。

1.6 継承

オブジェクト指向の基盤となる継承です。Java とあまり変わらないですね。

// Human クラスを継承した Japanese クラス
class Japanese : Human
{
    Japanese(int number, string name, int height) : base(number, name, height)
    {
         // Number の set を protected に変更する必要がある
         this.Number = number;
    }
}

その他

ソリューションに複数のプロジェクトがあるときに、実行させるプロジェクトを選択する。

  • ソリューションのプロパティ→シングルスタートアッププロジェクト

f:id:yamakasa3:20190711215206p:plain

感想

Java である程度オブジェクト指向について勉強したことがあったので、やっていることはなんとなく理解できました。