4

少し調査した結果、クラスに適用できるアクセス修飾子は次のとおりであることがわかりました。

  • public - 任意のアセンブリで利用可能
  • internal - 現在のアセンブリでのみ使用可能

ただし、以下のエラー メッセージは、クラスが名前空間で定義されていない場合、それがprivateprotected、またはprotected internalとして定義される可能性があることを暗示しているようです。

クラスで使用できるクラス修飾子は public と internal だけですか?それとも他にもありますか?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Test2343434
{
    class Program
    {
        static void Main(string[] args)
        {
            Tools.ToolManager toolManager = new Tools.ToolManager();

            Console.ReadLine();
        }
    }

}

namespace Tools
{
    //error: Elements defined in a namespace cannot be explicitly 
    //declared as private, protected, or protected internal
    private class ToolManager 
    {
        public ToolManager()
        {
            Console.WriteLine("inside tool manager");
        }
    }
}
4

4 に答える 4

8

ネストされた型は、private、protected、または protected internal として宣言できます。もちろん、入れ子になった型を public または internal として宣言することもできます。入れ子になっている場合は、上記のアクセス修飾子を使用してのみ宣言できます。

public class OuterClass
{
    private class PrivateNested {}
    protected class ProtectedNested {}
    protected internal class ProtectedInternalNested {}
    public class PublicNested {}
    internal class InternalNested {}
}

be にネストされた型を宣言することはできないことに注意してください。そうする意味がないためです:)structprotectedprotected internal

public struct OuterStruct
{
    private class PrivateNested {}
    public class PublicNested {}
    internal class InternalNested {}
}

C# では、インターフェイスで型をネストすることはできません (残念ながら、IMO - コード コントラクトには便利です)。

これはすべて、他のネストされた型 (列挙型、構造体、インターフェイス、デリゲート) にも当てはまります。

于 2010-07-21T13:14:34.960 に答える
3

答えは、アクセシビリティ レベルにあります。

「トップレベル」クラス、つまり別のクラスにネストされていないクラスは、パブリックまたは内部のみにすることができます。デフォルトでは (何も宣言しない場合)、内部です。

入れ子になったクラスは、可能な 5 つのアクセシビリティ レベル (public、protected、internal、private、protected internal) のすべてを持つことができます。

于 2010-07-21T13:17:50.057 に答える
3

このMSDNページを見てください:

名前空間の型宣言は、パブリック アクセスまたは内部アクセスのいずれかを持つことができます。アクセシビリティが指定されていない場合、内部がデフォルトです。

名前空間の型宣言が外部アセンブリへのパブリックまたは内部以外のものであることはほとんど意味がありません (C# はフレンド クラスなどの概念をサポートしていません)。

于 2010-07-21T13:15:54.880 に答える
0

internalこの質問の文脈では、クラスを他のアセンブリから見えるようにするためのあまり知られていないメカニズムがあることを指摘するのは興味深いかもしれません。そのメカニズムがInternalsVisibleTo属性です。アクセス修飾子の 1 つとは見なされませんが、誰がアクセスできるかを操作する効果があります。この概念は、フレンド アセンブリと呼ばれます。

于 2010-07-21T14:25:59.080 に答える