What are the default access modifiers in C#?

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.)

Leave a Comment