アクセス修飾子とは?
アクセス修飾子とは、クラスや変数等のアクセスレベルを制限するために定義して、他のクラスから参照できるか否かを調整するためのキーワードとなります。
アクセス修飾子があるおかげで、変数やクラスが自分のクラスでしか参照できないのか、外部からも参照できるのかを制限できるため、不用意に値を編集される恐れをなくしたり、プログラム修正時の影響範囲の調査の負荷を下げる効果があります。
アクセス修飾子の種類
アクセス修飾子の種類は次の5種類あります。
- public
- internal
- protected
- protected internal
- private
の5種類です。
public
publicはどこからでも参照可能となります。自分のクラスからはもちろん、他のクラスからも可能。他のプロジェクトからも、参照設定がされている場合は参照できます。この設定にしておけば、どこからでも見えるので、何も考えなくてもコーディングはできますが、どこからでも参照できている分、コードを修正したくなった場合に、どこまで影響範囲があるのかをチェックしてから、プログラムの修正をする必要があります。同一ソリューションの場合はコンパイルエラーで検知できる可能性がありますが、DLLとして他の会社やソリューションに提供している場合は、実行時にならないとエラーが検知できない可能性があります。安易にpublicにするのではなく、次に解説するinternalにすることができないかを検討し、それでもpublicとして公開する必要がある場合にpublicとしましょう。
Internal
Internalは同一アセンブリであれば参照可能です。同一アセンブリとは、同一のexeファイルや、DLLファイルの事です。VisualStudioのソリューション内であれば、同一プロジェクトという認識で構いません。他のプロジェクトからは、参照設定がされていてもinternalの場合は参照できません。同一のプロジェクトという事は、プログラムの修正が発生した場合も、必ず同時にコンパイルされる環境にあるため、publicのように、dll提供していることまでを視野にいれてプログラム修正をする必要がありません。プログラムを修正する場合も自分自身のプロジェクトのみを意識すればいいので、クラス名や関数名を右クリックで、参照されている箇所を確認すれば、修正後の影響範囲はおのずと確認できます。そういった意味で、publicよりもinternalにすることを第一選択肢として検討し、解決できない場合にpublicを使用しましょう。
protected
protectedは自分のクラスと派生クラスでのみ参照できます。派生クラスとは、継承しているクラスの事で、親子関係の子供側です。親子関係の親のみで使用する場合はprivateとし、子供にも使わせる必要がある場合はprotectedとします。この場合は別のプロジェクトであっても継承関係にあればprotectedの参照は可能です。
private
privateは自分のクラスの内部からのみ参照できます。外部から参照されることがないので、自分のクラスでのみ値を参照したり、変更したい場合はprivateにすることで、他のクラスからの影響を受けることがなくなります。
記述例
プロジェクトCS18
using CS18_2; namespace CS18 { class A1 { public A1() { var a2 = new A2(); //A2は見れる var bi = new BP(); //BPは見れる BIは見れない var a3 = new A3(); a3.InternalMethod(); a3.InternalProtectedMethod(); a3.PublicMethod(); //privateとprotectedは見れない } } class A11:A3//継承すればbaseキーワードで見れる { public A11() { base.InternalMethod(); base.InternalProtectedMethod(); base.PublicMethod(); base.ProtectedMethod(); } } }
namespace CS18 { class A2 { } }
クラス名にアクセス修飾子を省略するとinternalと同等の動作となります。
namespace CS18 { class A3 { public void PublicMethod() { } internal void InternalMethod() { } protected void ProtectedMethod() { } internal protected void InternalProtectedMethod() { } private void PrivateMethod() { } } }
プロジェクトCS18_2
namespace CS18_2 { internal class BI { } }
namespace CS18_2 { public class BP { } }
- C#初心者のための基礎!C#文法2割の知識で8割の仕事をする方法!#1
- C#初心者のための基礎!ブロックと名前空間とクラスとメソッドを解説#2
- C#初心者のための基礎!#3値の扱い方。変数と定数をわかりやすく解説!
- C#初心者のための基礎!データ型の種類と使い分けをわかりやすく解説#4
- C#初心者のための基礎!値型と参照型の違いと使い方をわかりやすく解説#5
- C#初心者のための基礎!データ型の変換のやり方をわかりやすく解説#6
- C#初心者のための基礎!配列の使い方をわかりやすく解説#7
- C#初心者のための基礎!動的配列List<T>の使い方をわかりやすく解説#8
- C#初心者のための基礎!演算子の使い方をわかりやすく解説#9
- C#初心者のための基礎!if文とswich文の使い方をわかりやすく解説#10
- C#初心者のための基礎!while文の書き方と使い方をわかりやすく解説#11
- C#初心者のための基礎!do-While文の書き方と使い方をわかりやすく解説#12
- C#初心者のための基礎!for文の書き方と使い方をわかりやすく解説#13
- C#初心者のための基礎!foreach文の書き方と使い方をわかりやすく解説#14
- C#初心者のための基礎!オブジェクト指向の意味をわかりやすく解説#15
- C#初心者のための基礎!クラスの意味と使い方をわかりやすく解説#16
- C#初心者のための基礎!コンストラクタの意味と使い方をわかりやすく解説#17
- C#初心者のための基礎!アクセス修飾子の意味と使い方をわかりやすく解説#18
- C#初心者のための基礎!メソッドの意味と使い方をわかりやすく解説#19
- C#初心者のための基礎!フィールドの意味と使い方をわかりやすく解説#20
- C#初心者のための基礎!インスタンスの意味と使い方をわかりやすく解説#21
- C#初心者のための基礎!カプセル化の意味と使い方をわかりやすく解説#22
- C#初心者のための基礎!プロパティの意味と使い方をわかりやすく解説#23
- C#初心者のための基礎!Disposeとusingの意味と使い方を解説#24
- C#初心者のための基礎!staticスタティックの意味と使い方を解説#25
- C#初心者のための基礎!継承の意味と使い方をわかりやすく解説#26
- C#初心者のための基礎!override(オーバーライド)の使い方を解説#27
- C#初心者のための基礎!ポリモーフィズムとインタフェースの使い方を解説#28
- C#初心者のための基礎!ポリモーフィズムと抽象クラスの使い方を解説#29
- C#初心者のための基礎!例外Exceptionの意味と使い方をわかりやすく解説#30