patterncsharpCritical
What are the default access modifiers in C#?
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:
is equivalent to
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:
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.
modifiers are allowed on namespace
declarations.
internal declared accessibility and
default to internal 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.)
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.)
access modifiers are allowed on
interface member declarations.
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.)
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.