Search code examples
c#access-modifiers

What are the default access modifiers in C#?


What is the default access modifier for classes, methods, members, constructors, delegates and interfaces?


Solution

  • The default access for everything in C# is "the most restricted access you could declare for that member".

    So for example:

    namespace MyCompany
    {
        class Outer
        {
            void Foo() {}
            class Inner {}
        }
    }
    

    is equivalent to

    namespace MyCompany
    {
        internal class Outer
        {
            private void Foo() {}
            private class Inner {}
        }
    }
    

    The one sort of exception to this is making one part of a property (usually the setter) more restricted than the declared accessibility of the property itself:

    public string Name
    {
        get { ... }
        private set { ... } // This isn't the default, have to do it explicitly
    }
    

    This is what the C# 3.0 specification has to say (section 3.5.1):

    Depending on the context in which a member declaration takes place, only certain types of declared accessibility are permitted. Furthermore, when a member declaration does not include any access modifiers, the context in which the declaration takes place determines the default declared accessibility.

    • Namespaces implicitly have public declared accessibility. No access modifiers are allowed on namespace declarations.
    • Types declared in compilation units or namespaces can have public or internal declared accessibility and default to internal declared accessibility.
    • Class members can have any of the five kinds of declared accessibility and default to private declared accessibility. (Note that a type declared as a member of a class can have any of the five kinds of declared accessibility, whereas a type declared as a member of a namespace can have only public or internal declared accessibility.)
    • Struct members can have public, internal, or private declared accessibility and default to private declared accessibility because structs are implicitly sealed. Struct members introduced in a struct (that is, not inherited by that struct) cannot have protected or protected internal declared accessibility. (Note that a type declared as a member of a struct can have public, internal, or private declared accessibility, whereas a type declared as a member of a namespace can have only public or internal declared accessibility.)
    • Interface members implicitly have public declared accessibility. No access modifiers are allowed on interface member declarations.
    • Enumeration members implicitly have public declared accessibility. No access modifiers are allowed on enumeration member declarations.

    (Note that nested types would come under the "class members" or "struct members" parts - and therefore default to private visibility.)