この章のテーマ §
アクセサのprivate/protected/internal/publicキーワードのアクセス修飾子について学びます。
前提知識 §
Console.WriteLineメソッド, クラスの基礎, メソッドの基礎, アセンブリ, 継承
解説 §
クラスなどの型やそのメンバーにはアクセス修飾子を付けることができます。
これによって、誰からアクセスできるかの範囲を制御することができます。これにより、内部処理で使っているだけのメンバーを外部に見せないという配慮が可能になり、候補リストに並ぶ名前を減らすことができます。また、内部処理専用のメンバーは内部の都合でいつでも書き換え可能になります。意図しない利用も防げて信頼性も上がります。
アクセス修飾子には以下にバリエーションがあります。
- public:アクセスは無制限です。
- protected:現在の型またはそこから派生した型にアクセスが限定されます。
- internal:アクセスは現在のアセンブリに限定されます。
- protected internal:現在のアセンブリ、または包含クラスから派生した型にアクセスが限定されます。
- private:現在の型にアクセスが限定されます。
- private protected:現在の型、または現在の型から派生した型にアクセスが制限されます。
ビギナーはまずpublicとprivateだけしっかり覚えて使い分けで下さい。継承を学んだらprotectedを意識して下さい。モジュール分けを学んだらinternalも意識して下さい。
罠の数々 §
- アクセス修飾子は省略することもできる。クラスなどはinternal相当、メンバーはprivate相当になるが、他の機能にもデフォルトの定義が存在する。相当慣れるまでは、できるだけはっきりと書いて意図を明示した方が良い
- 実は慣れている人ほどきめ細かくアクセス制限を設定する。不必要にアクセス可能にするとトラブルの元だと分かっているからである
- リフレクションという特別な機能を使用するとアクセス制限を超えてアクセスすることもできてしまうが、使うのは面倒なので特にそれが必要とされるまでは使用されないと思って良い。型の外部から利用される可能性のあるメンバーはpublicやinternalを指定しておこう
参考リンク §
アクセス修飾子 (C# リファレンス)
サンプルソース: accessModifiers §
var x = new Sample();
x.SubPublic(); // 呼べる
//x.SubPrivate(); // 呼べない
public class Sample
{
public void SubPublic()
{
Console.WriteLine("pubic method");
SubPrivate(); // 呼べる
}
private void SubPrivate()
{
Console.WriteLine("private method");
}
}
実行結果 §
pubic method
private method
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
なぜ外部からの利用を全てシャットアウトするprivateというアクセス修飾子があるのだろうか。
間違った解釈を選べ。
- 複数の公開されたメソッドの共通処理を書きたいから
- 型の内部でのみ参照される共通の情報の保管場所を作りたいから
- 型の内部でのみ参照される型を作りたいから
- 厳格な禁止ルールを付けて支配する快感に酔いたいから
[[解答]]