1

私はC#4を使用しています。

コメントは、クラスの目的と、クラスが構造化されている理由を説明しています。

/// <summary>
/// I want this internal just to reduce the number of publicly
/// accessible classes in this assembly.  I don't want people to
/// come after me to even spend time reading about this class,
/// since it won't help them unless they're modifying, and not
/// using this assembly.
/// </summary>
internal class MyInternalClass
{
}

/// <summary>
/// This class is an initialization class for tests.  This is the
/// base class for other initialization classes so that I can have 
/// a tree-like structure of method calls.  This needs to be
/// public because it is the base class of a derived class that needs
/// to be public.
/// </summary>
public class MyPublicClass
{
    protected internal MyInternalClass MyInternalProperty;
}

/// <summary>
/// This class is a test class that tests a particular initialization
/// class.  This class needst to be public, else the Unit Testing 
/// framework will not execute its methods.
/// </summary>
public class MyInheritedPublicClass : MyPublicClass
{
}

上記のコードで一貫性のない可視性エラーが発生する理由を誰か教えてもらえますか?

私が理解しているように、C# の可視性修飾子の意味は次のとおりです。

public: 誰でも、どこからでも、リフレクション ハックなしでこれを表示およびアクセスできます。

private: これは、宣言されているクラスのスコープ内でのみアクセスできます。同じ名前空間およびアセンブリ内の派生クラスおよびその他のクラスは、これを参照できません。

protected: これは、クラスが public である場合、アセンブリまたは名前空間に関係なく、それが宣言されているクラスと派生クラスのスコープ内でのみアクセスできます。クラスが内部の場合、もちろん、このプロパティを表示できるクラスがさらに制限されます。

internal: これは、同じアセンブリ内のエンティティのみがアクセスできます。

protected internal修飾子はprotectedとベン図の交差のように機能すると思いinternalました。同じアセンブリにあり、プロパティ/メソッド/コンストラクタ/フィールド/存在するものは何でも、同じアセンブリにあり、そのクラスのサブクラスであるエンティティにのみアクセスできます。 . 私の考えでは、上記のコードはコンパイルされるはずだと思いました。

4

1 に答える 1

2

protected internalはとの交差ではなく、共用です。つまり、どのアセンブリに属しているかに関係なく、クラスのすべての子孫にプロパティが表示されます。protectedinternalprotected internal

参照: http://msdn.microsoft.com/en-us/library/ms173121.aspx

于 2012-07-25T19:01:42.063 に答える