“保護された内部”を使用する場合アクセス修飾子?
-
03-07-2019 - |
質問
ご存じのとおり、.NET Frameworkの 内部 アクセス修飾子は奇妙な方法で動作します:クラスが保護されている AND 内部という意味ではありませんクラスは保護されている または 内部。つまり、変更されたクラスまたはメンバーには、同じアセンブリのおよびからアクセスできます。
だから、これを知っている:いつそれを使うのか?例を挙げていただけますか? .NET Base Class Library内に、良い照明の使用例がありますか?
解決
このアクセス修飾子の組み合わせを使用する必要はめったにありません。最も極端な状況を除いて、これはデザインの悪さの指標だと思います。ただし、型コンバーターやエディターなどのヘルパークラスがアセンブリ内のメソッドにアクセスする必要がある場合もありますが、派生クラスは他のユースケースでのみアクセスできます。
例として、型を型コンバーターの文字列に変換する呼び出しがあります。通常、 ToString()
はこの目的には使用されないため、タイプコンバーターで使用する ToPersistableString()
呼び出しがあるため、内部
。次に、クラスから派生したユーザーが、派生クラスの独自の永続化スキームの一部としてこの呼び出しを使用したい場合があると判断し、 protected
にします。
.NET Frameworkの使用
Control
の AccessibilityNotifyClients
は protected internal
です。 Reflector を使用すると、 CheckedItemCollection
CheckListBox
のcode>は、チェック状態を変更するときにアクセスできます。
他のヒント
単体テスト用に別の名前空間で使用できるようにしたい内部メソッドに使用しました。単体テストの名前空間にはクラスのサブクラスが含まれていました。保護されたメソッドへのアクセスを許可しました。
それは、ユニットテストのためにすべてを公開するという議論があるということです。
ASP.Net MVCフレームワークから例を追加します:
public abstract class Controller : ControllerBase, <Omitted Interfaces>
{
protected internal ViewResult View() {
return View(null /* viewName */, null /* masterName */, null /* model */);
}
protected internal ContentResult Content(string content) {
return Content(content, null /* contentType */);
}
}