はじめに
この記事はHamster Output Advent Calendar 2024の10目の記事です!
今まで、アクセス修飾子をつける時に多分こういう感じなんだなと考えていて、つける時にもやもやしていました。そこで、アドベントカレンダー走ってるし、アウトプットしちゃえ!というノリで作った記事です。
アクセス修飾子って何...?
クラスやメソッド、変数の前につけるpublicやprivateのことをアクセス修飾子といいます。
public class Test : MonoBehaviour
{
private void Start()
{
}
private void Update()
{
}
}
Microsoftの公式ページにはこう書かれています。
アクセス修飾子は、メンバーまたは型の宣言されたアクセシビリティを指定するときに使用されるキーワードです。
なるほど、型に対するセキュリティやルール見たいな感じですね。アクセス修飾子が5つあるらしいので、それぞれの違いを調べて見ます。
それぞれのアクセス修飾子の違い
・public
アクセス制限なし!どのクラスからでも参照可能!
僕も初めて作ったゲームではpublicしか付けてませんでした。後は制作期間が短いゲーム制作とかも...
色々な記事にも書いてあったりしますが、ゲーム開発に慣れてきたら何でもかんでもpublicにするのは止めましょう!半年~1年立った後にゲームをブラッシュアップするぞ~ってなった時に地獄を見ます(2敗)
・protected
継承されていればアクセスできる。していなければアクセスできないという考え方で良いと思います。
下にprotectedを使ったクラスと利用するクラスを用意して、いつも通りアクセスして見ますが...クラス参照はできても、変数は参照出来ません。
public class TestProtected : MonoBehaviour
{
protected int _num = 999;
}
public class Test : MonoBehaviour
{
private TestProtected _testProtected;
private void Start()
{
_testProtected = GetComponent<TestProtected>();
// この下がエラーになる
_testProtected._num += 1;
}
}
TestクラスにTestProtectedを継承すると、アクセスできるようになります!
public class TestProtected : MonoBehaviour
{
protected int _num = 999;
}
public class Test : TestProtected
{
private void Start()
{
// 継承なので変数をそのまま利用できる
_num += 1;
}
}
思い返してみれば、protectedを利用したこともなければ継承もあまり使っていないのでは........
・internal
同じアセンブリ内ならアクセスできる!それ以外ならアクセスできない!
正直に言うとinternalに関しては、最近使いだしたばかりなので、アセンブリが~とか良く分かりません。何でも、コンパイル単位でアクセスが許可される~~~という。
Unityでこのアクセス修飾子だけを付けても意味がないです。Assembly Definitionと一緒に使うことで利用できるようになります。中間言語が~~など様々なことがありますが、また今度別記事にてアウトプットします。
・protected internal
protectedとinternalの組み合わせです。
・private
どこからもアクセスできない。使えるのは定義したクラスのみ
C#では、アクセス修飾子を何も宣言しなかった場合、デフォルトでprivateになります。
// 何も宣言しなければデフォルトでprivateになる
int _num;
動作確認でクラスを作ってましたが、class自体もアクセス修飾子が無ければデフォルトでpublic見たいです。interfaceもデフォルトでpublicなので同じですね。
・private protected
privateとprotectedの組み合わせです。
・file
宣言された型は現在のソース ファイルでのみ表示されます。 ファイル スコープ型は一般にソース ジェネレーターに使用されます。
C#のバージョン11から追加された見たいです。全く分かりません。
まとめ
使ったこともあるけど、ほとんど使ったことがないアクセス修飾子ばかり!!!
fileに関してはC#バージョン11見たいなので、ゲーム開発で使うのはまだなさそう。