web-dev-qa-db-ja.com

C#の内部密閉クラスとは何ですか?

VS2010で言語サポートを拡張するためのC#コードを探していました(Ookの例)。 internal sealed classというクラスを見ました

これらは何をしますか?それらを使用しますか?

63
Byron Whitlock

次のクラスです:

  • internal:定義されたアセンブリ(またはフレンドアセンブリ)内からのみアクセスできます。
  • sealed:継承できません。

クラスをinternalとしてマークすると、アセンブリの外部ユーザーがクラスを使用できなくなります。これは実際には設計のカプセル化の形式であり、IMHOでは、目的のパブリックAPI \オブジェクトモデルの一部ではない型をinternalとしてマークすることをお勧めします。長期的には、これにより、ライブラリのユーザーが、意図しないタイプに自分自身を結合することを防ぎます。この種の意図しないカップリングは、クライアントを破壊せずにライブラリを変更することはできないため、ライブラリの実装方法を変更および進化させる能力を損ないます。 internalを使用すると、ライブラリのパブリックで使用可能な表面積を意図した範囲に抑えることができます。

クラスをsealedとしてマークすると、これらのクラスが継承されなくなります。これは非常に抜本的な設計意図であり、クラスが既に非常に特殊化されているため、継承によって、またはその動作をオーバーライドすることによって他の機能を追加する必要がない場合に便利です。

internalsealedはまったく異なる方法で型を変更しますが、一緒に使用できます。

[〜#〜] nb [〜#〜]他のアセンブリのセットを次のように定義できるため、internalのスコープ制御がさらにあります。 「友達」。これらのフレンドアセンブリは、internal型にアクセスする場合があります。これは、生産アセンブリやテストアセンブリなどの協調アセンブリのセットを定義するのに役立ちます。多くの場合、テストアセンブリは、テストしているアセンブリ内のすべてのタイプを表示できることが望ましいです。

139
Tim Lloyd
  • 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
    
16
HyLian

内部は、同じアセンブリで定義されている他のタイプからメンバーにアクセスできることを意味します。 Sealedクラスは、抽象の反対のようなものです。インスタンス化できますが、基本クラスとして機能することはできません。クラスを封印する主な理由は、ユーザーがそのクラスをいじって壊すのを防ぐためです。また、クラスを封印すると、封印されていないクラスでは不可能な特定のコンパイラの最適化が可能になります。

11
HABJAN

internal sealedクラスは次のいずれかです。

internal-同じアセンブリ内からのみアクセス可能
sealed-サブクラス化できません

つまり、直接使用する方法はありません。

5
Powerlord

内部 は、同じアセンブリでのみ使用できることを意味します。

Internalキーワードは、型および型メンバーのアクセス修飾子です。内部型またはメンバーは、同じアセンブリ内のファイル内でのみアクセス可能です

sealed 継承できない

シールされたクラスは継承できません。シールクラスを基本クラスとして使用するとエラーになります。クラスの継承を防ぐには、クラス宣言でシールド修飾子を使用します。

4
Arsen Mkrtchyan