HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpCritical

What are the default access modifiers in C#?

Submitted by: @import:stackoverflow-api··
0
Viewed 0 times
modifiersaccessarethewhatdefault

Problem

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

Code Snippets

namespace MyCompany
{
    class Outer
    {
        void Foo() {}
        class Inner {}
    }
}
namespace MyCompany
{
    internal class Outer
    {
        private void Foo() {}
        private class Inner {}
    }
}
public string Name
{
    get { ... }
    private set { ... } // This isn't the default, have to do it explicitly
}

Context

Stack Overflow Q#2521459, score: 581

Revisions (0)

No revisions yet.