Web Analytics Made Easy - StatCounter

Economics Of TEC

RPA,経済学,IT技術などに関する情報を発信しています。

【C#入門】プロパティとは?SetとGetを使った書き方をご紹介

f:id:WillSpecter:20200811195608j:plain

 

これまで、メソッド、クラス、インスタンスカプセル化などを順に紹介してきました。今回は、カプセル化の便利機能として、プロパティを紹介させていただきます。

 

◆これまでの記事◆

 

前回はカプセル化の中でprivateの変数に値を入れる際に、アクセサというメソッドを2つ準備して処理を行いました。しかし、プログラムが冗長的になって読みづらくなってしまいます。

 

そこで、今回はプロパティという仕組みを利用して前回のプログラムを簡素に書く方法を紹介させていただきます。

プロパティとは

プロパティとは、特殊なメソッドで、カプセル化した値への代入を簡素に記述することが可能です。普段プログラムを見ていてSet~Get~という記述を見つけたら、プロパティのことで、Setで値を受け取り、Getで値を返しています。

基本的なプロパティの書き方

それでは、実際にどのように書くのかご紹介いたします。

 基本構文はこのようにプロパティ名の中にSetとGetを入れ、呼び出し先のプログラム(privateの変数がある方)に処理を書き込みます。

        public プロパティの型 プロパティ名 {
            set
            {
                変数名 = Value;
            }
            get
            {
                return 変数名;                
            }
        }
SetではValueを変数名に入れること、GetではReturnで値を返すことがポイントです。具体的にどのように書き方が変わるのかを説明します。

プロパティを使わない書き方(呼び出し先クラス)

こちらは、前回の記事でご紹介した、カプセル化した変数に値を代入する方法です。SetHPとGetHpの二つのメソッドを準備しています。SetHPではマイナスの値が入らないようにif文で条件を付けてセットしています。

        //hpがマイナスの場合は0をセットする
        public void SetHp(int hp)
        {
            this.hp = hp;
            if (this.hp <0)
            {
                this.hp = 0;
            }
        }
        //hp変数の値を取得する
        public int GetHp()
        {
            return this.hp;
        }

プロパティを使った書き方(呼び出し先クラス)

一方で、先ほどの構文通りプロパティを使った方法はこちらです。基本的に、プロパティ名は頭文字を大文字にするため、Hpと設定しました。

    class Murabito
    {
        private string name; //村人の名前
        private int hp;   //村人の体力

        //コンストラクタで引数を初期値に代入
        public Murabito (string name, int hp)
        {
            this.name = name;
            this.hp = hp;
        }
        //Hpプロパティ//
        public int Hp
        {
            set //値をhpに代入する
            {
                this.hp = value;
                if (this.hp < 0)
                {
                    this.hp = 0;
                }
            }
            get //値を返す
            {
                return this.hp;
            }
        }
    }
上記ではHpというメソッドの中にSetとGetが入っていることが分かりますね。そして、value とreturnを使っています。ただ、メソッドは減ったものの「そんな簡素になったかな??」と思うかもしれません。。では、呼び出し元クラスの書き方を見てみましょう。

プロパティを使わない書き方(呼び出し元クラス)

呼び出し元のMainクラスでは、GetHpメソッドとSetHpメソッドを利用して値を操作しています。具体的には、初期値を200としそこから-150した値が結果として表示されます。

        static void Main(string[] args)
        {
            //村人1のインスタンスを作り、名前と体力を代入
            Murabito murabito1 = new Murabito("たかし",200); 
            //現在のhp
            int hp = murabito1.GetHp();

            //体力が減る
            int NewHp = hp - 150;

            //減った体力をhpに代入する
            murabito1.SetHp(NewHp);

            //現在のhpを表示する
            Console.WriteLine("現在の体力は" + murabito1.GetHp());
        }

 

プロパティを使った書き方(呼び出し元クラス)

一方で、プロパティを利用した場合のMainクラスです。随分と簡素になりましたね!前回は、NewHpに減った体力を代入する形をとっていましたが、プロパティとして設定したHpを変数のように使うことができました。

        static void Main(string[] args)
        {
            //村人1のインスタンスを作り、名前と体力を代入
            Murabito murabito1 = new Murabito("たかし",200); 

            //体力が減る(Hpメソッドに代入する)
            murabito1.Hp -= 150;

            //現在のhpを表示する
            Console.WriteLine("現在の体力は" + murabito1.Hp);
        }

 

自動実装プロパティ

実は、C# 3.0 以降ではさらに簡素化した自動実装プロパティという機能が導入されています。ただ、自動実装プロパティはプロパティの中に特別な条件が入る場合には利用できません

 

従って、これまでの例のようにSetの中でIf文を使う、ということは自動実装プロパティが利用できないので、ご注意ください、、 

 

自動実装プロパティが利用できる例

            //Hpプロパティ//
            public int Hp
        {
            set //値をhpに代入する
            {
                this.hp = value;

            }
            get //値を返す
            {
                return this.hp;
            }
        }

自動実装プロパティの書き方

では早速、自動実装プロパティの書き方をご紹介します。

(アクセス識別子) (型名) (プロパティ名) {(アクセス識別子) get; (アクセス識別子) set;}

アクセス識別子は省略できますのでこのように書き換えられます。

(アクセス識別子) (型名) (プロパティ名) { get; set;}

自動実装プロパティが利用できる例と比較すると、かなり簡素になりました!

 

前回の例を書き換えるとこのようになります。

        public string Name { get; set; }  //村人の名前
        public int Hp { get; set; }   //村人の体力

呼び出し元のプログラムは引数が渡せないようなので、このように書き変えました。

namespace JinroGame
{
    class Program
    {
        static void Main(string[] args)
        {
            //村人1のインスタンスを作り、名前と体力を代入
            Murabito murabito1 = new Murabito()
            {
             Name ="たかし",
             Hp =200
            }; 
            //体力が減る
            murabito1.Hp -= 150;
            //現在のhpを表示する
            Console.WriteLine("現在の体力は" + murabito1.Hp);
        }
    }
}

これで実行すると、"現在の体力は50"と表示されます。

ひとこと

プログラムを開発するとき、可読性を上げることが大切だと思いますが、より簡素に書くことも重要なポイントだと思います。自動実装プロパティがC# 3.0以降で利用できるようになったように、同じ処理でも書き方が簡素になっていくこともありますので、これからもアンテナを張っていく必要があると感じました。

 

今回の説明は「確かな力が身につくC# 「超」入門」を参考にさせていただきましたが(例題はオリジナルです)、「もっと前から読んでおきたかった!」と痛感しています、、。もし、C#について学び始めたという方は是非参考にしてみてください!(2020年7月に出版された新書です(^^)

 

◆合わせて読みたい◆

 

更に力を伸ばしたい方は、プログラミングの無料体験もお勧めです!

 

☆その他C#の記事をアップしています☆