【C#】アクセス修飾子

目次

概要

今回はアクセス修飾子。これはクラスのメソッドや変数が他のクラスから使えないようにするためのもの。

例えばゲームなどでも、設定画面から自由に設定できるものもあれば、敵のHPのように特定の動作でしか値を変えられないものもある。
そういう特定の場合のみ値を編集する場合にはアクセス修飾子を使おう。

全ての変数がプログラム全体から値の修正ができてしまうと、思わぬバグの原因にもなるし、バグの発生箇所の絞り込みの範囲もプログラム全体となってしまう。
でも、もしも「この変数は同じクラス内のみ修正できる」となっていたらどうだろう。
余計なところから修正される心配は無くなるし、バグの発生範囲も限られてくる。
そのために使われるのがアクセス修飾子。

ソースコード

public class  PlayerStatus{
    private String playerName;
    private int level;
    private int hp;
    private int attack;
    private int defense;
    private List<String> items;

    public PlayerStatus(String playerName, int level, int hp, int attack, int defense) {
        this.playerName = playerName;
        this.level = level;
        this.hp = hp;
        this.attack = attack;
        this.defense = defense;
        this.items = new List<String>();
    }

    public String getPlayerName() {
        return playerName + "様";
    }

    public int getDamage(int youAttack, int myDefense) {
        Console.WriteLine("相手の攻撃力:" + youAttack);
        Console.WriteLine("自分の防御力:" + myDefense);

        this.updateHp(youAttack, myDefense);

        return youAttack - myDefense;
    }

    private void updateHp(int youAttack, int myDefense) {
        this.hp = this.hp - (youAttack - myDefense);
        Console.WriteLine("残りHP:" + this.hp);
    }
}
PlayerStatus playerStatus = new PlayerStatus("あなた", 1, 100, 100, 0);
Console.WriteLine("PlayerName: " + playerStatus.getPlayerName());
Console.WriteLine("Damage: " + playerStatus.getDamage(100, 10));

実行結果

PlayerName: あなた様
相手の攻撃力:100
自分の防御力:10
残りHP:10
Damage: 90

詳細

アクセス修飾子の種類

アクセス修飾子設定内容
publiuc全てのクラスから使用できる
private同じクラス内からでしか使用できない
アクセス修飾子が書かれていない場合はprivateになる
protected子クラスのみ使用可能
internal同じアセンブリでのみ使用可能
※アセンブリとは「.exe(アプリケーションファイル)」「.dll(ライブラリファイル)」のこと

多くの場合、privateにする場合が多いだろう。
理由としては、privateにしておけばバグの範囲が限られるし、処理の流れを追う際も同じクラス内に限られる。
そうした方が楽だからだ。

代わりに、ダメージ計算のメソッドなどは他のクラスから呼ぶことが多いだろう。
そういうときはpublicにする。

なるべくprivateでプログラムを書くように心がけよう!

参考ページ