19

既にご存知かもしれませんが、.NET Framework のprotected internalアクセス修飾子は奇妙な方法で動作します。クラスがprotected AND internalであることを意味するのではなく、クラスがprotected OR internalであることを意味します。つまり、変更されたクラスまたはメンバーは、同じアセンブリ内および同じ階層からアクセスできます。

それで、これを知ってください:いつそれを使いますか?例を挙げていただけますか?.NET Base Class Library 内に適切でわかりやすい使用例はありますか?

4

3 に答える 3

9

このアクセス修飾子の組み合わせを使用する必要はめったにありません。最も極端な状況を除いて、これは設計が不十分であることを示しているからです。ただし、型コンバーターやエディターなどのヘルパー クラスがアセンブリ内のメソッドにアクセスする必要がある場合もありますが、他のユース ケースでは派生クラスのみがアクセスできるようにします。

例として、型を型コンバーターの文字列に変換する呼び出しがあります。ToString()通常、この目的には使用されないためToPersistableString()、型コンバーターに使用させたい呼び出しがある可能性があるため、それを作成しinternalます。次に、あなたのクラスから派生した人々が、派生クラスの独自の永続化スキームの一部としてこの呼び出しを使用する可能性があると判断したため、同様に作成しprotectedます。

.NET Frameworkでの使用
AccessibilityNotifyClientsは. Reflectorを使用すると、チェック状態を変更するときにがアクセスできるように、これが行われたことがわかります。Controlprotected internalCheckedItemCollectionCheckListBox

于 2008-10-15T15:33:33.900 に答える
2

単体テスト用に別の名前空間で使用できるようにしたい内部メソッドに使用しました。単体テストの名前空間には、クラスのサブクラスが含まれていました。これにより、保護されたメソッドにアクセスできました。

つまり、単体テストのためにすべてを公開するという議論があります。

于 2008-10-15T15:36:47.967 に答える
1

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 */);
        }

}
于 2012-02-12T17:59:20.537 に答える