はじめに
感想まで書いてますがまだ理解不十分な点や自分で試せてない所もあるので今後新たな発見や気付きなどあれば徐々に更新していく予定です。
クラスにつけられるアクセスレベル
修飾子 | 意味 | 使いどころ |
---|---|---|
public | 全公開 | どこからでも参照したい時 |
internal | 同一アセンブリ内でのみ参照可能 | 別のプロジェクトからは参照されたくない時 |
※キーワードなしのデフォルトのアクセスレベルはinternal
アクセスレベル以外のクラスにつけられる修飾子
修飾子 | 意味 | 使いどころ または使用した際に生まれる制約 |
---|---|---|
abstract | クラスを抽象クラスとして定義 | 直接インスタンス化できなくなる。 |
sealed | クラスが継承できないことを定義 | 派生を防ぐことが出来る。 |
static | クラスを静的クラスとして定義 | インスタンス化できず、すべてのメンバーがstaticでなければならない。また、internal protected, protectedレベルのメンバーも持てなくなる。 |
partial | クラス定義を複数のファイルに分割可能 | 自動生成コードと手動コードの分離だったり、複数人開発の際にコンフリクトの衝突を避けることが可能になる。一方で分割しすぎると管理が複雑になりやすいので注意 |
unsafe | クラス内でポインタ操作が可能 | ?? |
record | クラスを不変データオブジェクトとして定義 | 主にデータ転送オブジェクトや簡潔なデータ型を定義したい時 |
メンバー(フィールド、メソッド)につけられるアクセスレベル
修飾子 | 同じクラス | 継承関係なし(同じアセンブリ) | 派生クラス(同じアセンブリ) | 継承関係なし(異なるアセンブリ) | 派生クラス(異なるアセンブリ) |
---|---|---|---|---|---|
public | ○ | ○ | ○ | ○ | ○ |
internal protected | ○ | ○ | ○ | × | ○ |
internal | ○ | ○ | ○ | × | × |
protected | ○ | × | ○ | × | ○ |
private protected | ○ | × | ○ | × | × |
private | ○ | × | × | × | × |
※キーワードなしのデフォルトのアクセスレベルはフィールドもメソッドもprivate
アクセスレベル以外のメンバーにつけられる修飾子
メソッド
修飾子 | 意味 | 使いどころ または使用した際に生まれる制約 |
---|---|---|
abstract | 抽象メソッドを定義 | 実装を記述できなくなる。また、継承したクラスのどこかで実装を強制することが出来る。 |
new | 継承元のメソッドを非表示 | 継承先の型でインスタンス化した場合はnewで新しく定義した方のメソッドが呼び出される。一方でポリモーフィズムを使ってインスタンス化した場合は継承元のメソッドが呼ばれる。 |
static | メソッドを静的メソッドとして定義 | インスタンスごとの処理ではなく、アプリケーション全体である処理がしたい場合。 |
感想
Javaも結構細かく制御できて良いと思ってたけどC#はJavaの後発という事もあって、より改良されてる気がしました。
一方でJavaのパッケージプライベートないのかーとは思ったけど
そもそもパッケージプライベートのレベルで制御したいならアセンブリ(プロジェクト)違うよね。ってのがC#の考えなんかな。