Jakie są domyślne modyfikatory dostępu w C#?

Jaki jest domyślny modyfikator dostępu dla klas, metod, członków, konstruktorów, delegatów i interfejsów?

 300
c#
Author: Peter Mortensen, 2010-03-26

7 answers

Domyślnym dostępem do wszystkiego w C# jest"najbardziej ograniczony dostęp, jaki możesz zadeklarować dla tego członka".

Więc na przykład:

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

Jest równoważne

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

Wyjątek od tego polega na tym, że jedna część właściwości (zazwyczaj setter) jest bardziej ograniczona niż deklarowana dostępność samej właściwości:

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

Oto co ma do powiedzenia Specyfikacja C# 3.0 (sekcja 3.5.1):

W zależności od kontekst, w którym a deklaracja członkowska odbywa się tylko niektóre rodzaje deklarowanych dostępność jest dozwolona. Ponadto, gdy deklaracja członkowska nie zawiera modyfikatorów dostępu, kontekst, w którym deklaracja odbywa się określa domyślną deklarowana dostępność.

  • Przestrzenie nazw domyślnie mają zadeklarowaną dostępność publiczną. Brak dostępu modyfikatory są dozwolone w przestrzeni nazw deklaracje.
  • typy zadeklarowane w jednostkach kompilacji lub przestrzenie nazw mogą mieć publiczne lub wewnętrzna deklarowana dostępność i default to internal declared dostępność.
  • Członkowie klasy mogą mieć dowolny z pięciu rodzajów deklarowanej dostępności i domyślnie deklarowane jako prywatne dostępność. (Zauważ, że typ zadeklarowany jako członek klasy może mieć jeden z pięciu rodzajów zadeklarowanych dostępności, natomiast typ deklarowany jako członek przestrzeni nazw może mieć tylko publiczne lub wewnętrzne zadeklarowane dostępność.)
  • członkowie struktury mogą mieć zadeklarowane publiczne, wewnętrzne lub prywatne dostępność i domyślnie prywatny deklarowana dostępność, ponieważ struktury są niejawnie zapieczętowane. Członkowie struktury wprowadzony w strukturze (czyli nie dziedziczona przez tę strukturę) nie może mieć chronione lub chronione wewnętrzne deklarowana dostępność. (Zauważ, że a Typ zadeklarowany jako członek struktury może mieć publiczny, wewnętrzny lub prywatny deklarowana dostępność, natomiast typ zgłoszony jako członek przestrzeń nazw może mieć tylko publiczne lub wewnętrzne deklarowana dostępność.)
  • Członkowie interfejsu domyślnie mają publicznie zadeklarowaną dostępność. Nie. modyfikatory dostępu są dozwolone na deklaracje członków interfejsu.
  • Członkowie Enumeracji domyślnie mają publicznie zadeklarowaną dostępność. Nie. modyfikatory dostępu są dozwolone na wyliczenie deklaracji członkowskich.

(zauważ, że zagnieżdżone typy wchodzą w skład części" class members "lub" struct members " - i dlatego domyślna widoczność prywatna.)

 391
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-25 13:50:20
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!
 128
Author: John Buchanan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-03 17:19:25

Krótka odpowiedź: minimalny możliwy dostęp (por. odpowiedź Jona Skeeta).

Długa odpowiedź:

Nonested types, enumeration and delegate accessibilities (może mieć tylko dostęp wewnętrzny lub publiczny )

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | internal  | public, internal

class                | internal  | public, internal

struct               | internal  | public, internal

delegate             | internal  | public, internal

zagnieżdżone type and member accessiblities

                     | Default   | Permitted declared accessibilities
------------------------------------------------------------------
namespace            | public    | none (always implicitly public)

enum                 | public    | none (always implicitly public)

interface            | public    | none

class                | private   | All¹

struct               | private   | public, internal, private²

delegate             | private   | All¹

constructor          | private   | All¹

interface member     | public    | none (always implicitly public)

method               | private   | All¹

field                | private   | All¹

user-defined operator| none      | public (must be declared public)

1 All = = = public, protected, internal, private, protected internal

2 struktury nie mogą dziedziczyć ze struktur lub klas (chociaż mogą, interfejsy), dlatego protected nie jest poprawnym modyfikatorem

Dostępność zagnieżdżonego typu zależy od jego domeny dostępności, która jest określana zarówno przez deklarowaną dostępność elementu członkowskiego, jak i domenę dostępności typu bezpośrednio zawierającego. Domena dostępności zagnieżdżonego typu nie może jednak przekraczać domeny typu zawierającego.

Uwaga: CIL ma również przepis na chronione i wewnętrzne (w przeciwieństwie do istniejącego chronionego "lub" wewnętrznego), ale według mojej wiedzy nie jest on obecnie dostępny do użycia w C#.


Zobacz:

Http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en-us/library/cx03xt0t.aspx
(Man I love Microsoft Uri...)

 107
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-11 17:10:29

[[0]} spójrz na modyfikatory dostępu (C# Programming Guide)

Class and Struct Accessibility
Wewnętrzne jest domyślne, jeśli brak dostępu modyfikator jest określony.

Class and Struct Member Accessibility
Członkowie klasy (w tym zagnieżdżone klasy i struktury) Można zadeklarować dowolną z pięciu rodzaje dostępu. Członkowie Struct nie mogą być zadeklarowane jako chronione, ponieważ struktury nie wspierają dziedziczenia.

The dostępność członka może nigdy nie bądź większy niż dostępność jego typu

Operatory zdefiniowane przez Użytkownika muszą być zawsze ogłoszone jako publiczne. Więcej informacje, patrz operator (C# Reference).

Destruktory nie mogą mieć dostępności modyfikatory.

Inne Typy
Interfejsy deklarowane bezpośrednio z przestrzenią nazw mogą być deklarowane jako publiczne lub wewnętrzne i jak klasy i struktury, interfejsy default to internal dostęp.

Członkowie Enumeracji są zawsze publiczni, i żadne modyfikatory dostępu nie mogą być zastosowany.

Domyślnie delegaci mają wewnętrzne dostęp.

 11
Author: Adriaan Stander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-26 06:37:44

Chciałbym dodać jakiś link do dokumentacji. Sprawdź więcej szczegółów tutaj.

Tutaj wpisz opis obrazka

 2
Author: Asif Mushtaq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-01 11:17:45

Wewnętrzny jest domyślnym modyfikatorem

 1
Author: renjucool,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-14 11:12:02

Poziom przestrzeni nazw: internal

Type level: private

 0
Author: leppie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-26 06:31:36