Saturday 21 December 2019

What are the default access modifiers in C#?



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


Answer



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


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...