VS2010で言語サポートを拡張するためのC#コードを探していました(Ookの例)。 internal sealed class
というクラスを見ました
これらは何をしますか?それらを使用しますか?
次のクラスです:
internal
:定義されたアセンブリ(またはフレンドアセンブリ)内からのみアクセスできます。sealed
:継承できません。クラスをinternal
としてマークすると、アセンブリの外部ユーザーがクラスを使用できなくなります。これは実際には設計のカプセル化の形式であり、IMHOでは、目的のパブリックAPI \オブジェクトモデルの一部ではない型をinternal
としてマークすることをお勧めします。長期的には、これにより、ライブラリのユーザーが、意図しないタイプに自分自身を結合することを防ぎます。この種の意図しないカップリングは、クライアントを破壊せずにライブラリを変更することはできないため、ライブラリの実装方法を変更および進化させる能力を損ないます。 internal
を使用すると、ライブラリのパブリックで使用可能な表面積を意図した範囲に抑えることができます。
クラスをsealed
としてマークすると、これらのクラスが継承されなくなります。これは非常に抜本的な設計意図であり、クラスが既に非常に特殊化されているため、継承によって、またはその動作をオーバーライドすることによって他の機能を追加する必要がない場合に便利です。
internal
とsealed
はまったく異なる方法で型を変更しますが、一緒に使用できます。
[〜#〜] nb [〜#〜]他のアセンブリのセットを次のように定義できるため、internal
のスコープ制御がさらにあります。 「友達」。これらのフレンドアセンブリは、internal
型にアクセスする場合があります。これは、生産アセンブリやテストアセンブリなどの協調アセンブリのセットを定義するのに役立ちます。多くの場合、テストアセンブリは、テストしているアセンブリ内のすべてのタイプを表示できることが望ましいです。
internal:同じアセンブリ内でのみアクセスできるクラス。
Assembly1.dll:
namespace test {
internal class InternalClass {
}
public class PublicClass {
}
}
Assembly2.dll:
using test;
...
InternalClass c1; // Error
PublicClass c2; // OK
封印された:から派生できないクラス
sealed class SealedClass { ... }
class ChildClass : SealedClass {} //ERROR
内部は、同じアセンブリで定義されている他のタイプからメンバーにアクセスできることを意味します。 Sealedクラスは、抽象の反対のようなものです。インスタンス化できますが、基本クラスとして機能することはできません。クラスを封印する主な理由は、ユーザーがそのクラスをいじって壊すのを防ぐためです。また、クラスを封印すると、封印されていないクラスでは不可能な特定のコンパイラの最適化が可能になります。
internal sealed
クラスは次のいずれかです。
internal
-同じアセンブリ内からのみアクセス可能sealed
-サブクラス化できません
つまり、直接使用する方法はありません。