C# アクセス修飾子について


今回はアクセス修飾子についてです。
このアクセス修飾子、C#にはこんなに種類があるのかとちょっとびっくりしています。
あまり意識して使ってないのもありますが。

ではいきます!

アクセス修飾子とは

アクセス修飾子はクラスやクラス内のメンバ(クラス内で定義されているフィールド変数のこと)に対してアクセスの制限をかけるものです。
指定しない場合はデフォルトでprivateで定義され、外部からのアクセスはできないようになっています。
privateについては後ほどご紹介しますね。

アクセス修飾子MS公式ドキュメント
このリンクを見てみるとこんなことが書いてあります。

「メンバーまたは型の宣言されたアクセシビリティを指定するときに使用されるキーワードです。」

訳わかんねぇよって感じですよね。

多分、アクセス修飾子のキーワードを見ていけばなんとなくでも理解できそうな予感…
というわけで、C#で使われるアクセス修飾子についてキーワードをひとつひとつ見ていきましょう。
掘るぞ掘るぞ〜

public

アクセス無制限です。
初心者のうちはとりあえずこれを使って定義しましょう。
そして、完成した後にコードを見直して、確実にこれはprivateでいいなと思ったらprivateで定義する。
変にかっこいいプログラムを組もうとしてエラーが起きた方がダサいし、エラー慣れした初心者でなければ完成しないです笑
なのでとりあえずpublicで定義。(先述のように、アクセス修飾子を使わずに定義するとprivateになるのでこちらも注意)

protected

外部からのアクセスは拒否、でもprotectedで定義されたクラスの派生クラスからアクセスするのはOK
この太字の部分、ややこしいですよね。
僕の解釈では、オブジェクト指向の概念の中にある「継承」が鍵となるのかなと思っています。
つまり、protectedで継承したクラスを継承したクラスからのアクセスは許可されますよ、継承されていないクラスはだめですよってことだと思っています

このprotectedですが、「private protected」や「protected internal」というアクセス修飾子もあります。
ややこしいので今は避けていずれご紹介します。

internal

見出しのリンクに書いてある内容を引用します。

同じアセンブリ内のファイル内でのみアクセスできます。

なんじゃそりゃ
もう少し調べてみると、「コンパイル単位でのみアクセスが許可される」とのこと。
コンパイルとは、中間言語と呼ばれるものを使ってC#からコンピュータ語(2進数のバイナリ言語)に変換し、実行ファイルを作成するという作業のことです。
自分が書いたソースコード(C#だろうがJavaだろうがなんでも)をコンパイルする時にinternalというアクセス修飾子が効果を発揮すると…

コンパイルに関連する内容は別の記事にてご紹介します。
ちなみにinternalはC#特有のアクセス修飾子みたいです。(internalが使える言語があればコメントにて!笑)

private

外部であればどんな内容だろうがどこからでもアクセスを拒否しますよということ。
これはクラス内もしくは構造体の中でしか扱えないようにするためのものなんですね。
めっちゃセキュリティーが高いみたいな感じ。
他のクラスからはprivateの内容は見えていませんよ、透明人間ですよ、だから有るけど無い状態ですよというような

public class Me //例えば自分をpublicのクラスとして定義します。
{
    private int myWalette; //要はお金(数値)なのでint型
}

書き方が合ってるかどうかは知りませんが…
Meクラスは自分 = 人に見られる、myWalletフィールド = 落としたくもないし人によっては見られたくない財布
自分(というクラス)の持ち物(お財布という変数)なので、落とすこともいくらか抜き取られることも盗まれる心配もないです。
でも難しいので気をつけましょう。
非現実的だけど、結構上手な例え方だと思ってまーす笑

最後に

今回は4つのアクセス修飾子について解説してみました。
毎度言ってますが、ちょっと間違ってるかもしれないと思いながら書いているので、間違っていたらコメントで優しく教えてください。
本当自信ないよね〜
自信がないからこそ間違いを指摘していただくという受動的アウトプットも目的です。