Jaki jest domyślny modyfikator dostępu dla klas, metod, członków, konstruktorów, delegatów i interfejsów?
źródło
Jaki jest domyślny modyfikator dostępu dla klas, metod, członków, konstruktorów, delegatów i interfejsów?
Domyślny dostęp do wszystkiego w języku C # to „najbardziej ograniczony dostęp, jaki można zadeklarować dla tego członka” .
Na przykład:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
jest równa
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
Jedynym rodzajem wyjątku jest ograniczenie jednej części właściwości (zwykle ustawiającej) 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 mówi specyfikacja C # 3.0 (sekcja 3.5.1):
W zależności od kontekstu, w którym odbywa się deklaracja członka, dozwolone są tylko niektóre typy deklarowanej dostępności. Ponadto, gdy deklaracja członka nie zawiera żadnych modyfikatorów dostępu, kontekst, w którym deklaracja ma miejsce, określa domyślną deklarowaną dostępność.
- Przestrzenie nazw domyślnie mają publicznie zadeklarowaną dostępność. Żadne modyfikatory dostępu nie są dozwolone w deklaracjach przestrzeni nazw.
- Typy zadeklarowane w jednostkach kompilacji lub przestrzeniach nazw mogą mieć publiczną lub wewnętrzną deklarowaną dostępność i domyślnie wewnętrzną deklarowaną dostępność.
- Członkowie klasy mogą mieć dowolny z pięciu rodzajów deklarowanej dostępności i domyślnie deklarowaną dostępność prywatną. (Należy zauważyć, że typ zadeklarowany jako członek klasy może mieć dowolny z pięciu rodzajów deklarowanej dostępności, podczas gdy typ zadeklarowany jako członek przestrzeni nazw może mieć tylko publiczną lub wewnętrzną deklarowaną dostępność).
- Członkowie struktury mogą mieć publicznie, wewnętrznie lub prywatnie zadeklarowaną dostępność i domyślnie prywatną deklarowaną dostępność, ponieważ struktury są domyślnie zapieczętowane. Elementy struktury wprowadzone w strukturze (tj. Nie dziedziczone przez tę strukturę) nie mogą mieć zabezpieczonej ani chronionej wewnętrznej deklarowanej dostępności. (Należy zauważyć, że typ zadeklarowany jako członek struktury może mieć zadeklarowaną dostępność publiczną, wewnętrzną lub prywatną, podczas gdy typ zadeklarowany jako członek przestrzeni nazw może mieć tylko zadeklarowaną dostępność publiczną lub wewnętrzną).
- Członkowie interfejsu domyślnie mają publicznie zadeklarowaną dostępność. Żadne modyfikatory dostępu nie są dozwolone w deklaracjach członków interfejsu.
- Członkowie wyliczenia domyślnie mają publicznie zadeklarowaną dostępność. Żadne modyfikatory dostępu nie są dozwolone w deklaracjach członków wyliczenia.
(Należy zauważyć, że typy zagnieżdżone będą znajdować się pod częściami „członków klasy” lub „członków struktury” - i dlatego są domyślnie widoczne dla prywatności).
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!
class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();
nie możesz uzyskać dostępu zaM
pomocąa.M()
, możesz to zrobić za pomocą(a as IFoo).M()
. (Sprawdź specyfikację, aby uzyskać więcej informacji na temat szczegółów)Krótka odpowiedź: minimalny możliwy dostęp (por. Odpowiedź Jona Skeeta).
Długa odpowiedź:
Nie zagnieżdżone typy, wyliczanie i delegowanie dostępu ( może mieć tylko dostęp wewnętrzny lub publiczny )
Dostępność typu zagnieżdżonego i członków
Dostępność typu zagnieżdżonego zależy od jego domeny dostępności, która jest określona zarówno przez deklarowaną dostępność członka, jak i domenę dostępności typu zawierającego bezpośrednio. Domena dostępności typu zagnieżdżonego nie może jednak przekraczać domeny typu zawierającego.
Uwaga: CIL ma również opcję chronioną i wewnętrzną (w przeciwieństwie do istniejącej chronionej lub wewnętrznej), ale o ile wiem, nie jest obecnie dostępna do użycia w języku C #.
Widzieć:
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 URIs ...)
źródło
Spójrz na Modyfikatory dostępu (Podręcznik programowania w języku C #)
źródło
Klasa jest domyślnie Wewnętrzna .
Domyślnie interfejs jest wewnętrzny .
Członkowie interfejsu są domyślnie publiczni . (Interfejsy nie pozwalają nam określić żadnego rodzaju dostępu do jego członków).
Uwaga: Jeśli spróbujesz podać dowolny specyfikator dostępu do członków interfejsu, wyświetli się błąd kompilacji.
Struktura jest domyślnie Wewnętrzna .
źródło
Chciałbym dodać link do dokumentacji. Sprawdź więcej szczegółów tutaj .
źródło
Najprostsza odpowiedź jest następująca .....
Wszyscy członkowie w C # zawsze domyślnie korzystają z MOŻLIWEGO dostępnego modyfikatora.
Dlatego wszystkie klasy najwyższego poziomu w zestawie są domyślnie „wewnętrzne”, co oznacza, że są publiczne dla zestawu, w którym się znajdują, ale są prywatne lub wykluczone z dostępu do zewnętrznych zestawów. Jedyną inną opcją dla klasy najwyższego poziomu jest publiczna, która jest bardziej dostępna. W przypadku typów zagnieżdżonych wszystko jest prywatne, z wyjątkiem kilku rzadkich wyjątków, takich jak elementy wyliczeń i interfejsy, które mogą być tylko publiczne. Kilka przykładów. W przypadku klas i interfejsów najwyższego poziomu wartości domyślne to:
klasa Animal taka sama jak klasa wewnętrzna Animal
interfejs Animal taki sam jak interfejs publiczny Animal
W przypadku zagnieżdżonych klas i interfejsów (typy wewnętrzne) wartości domyślne to:
klasa Animal taka sama jak klasa prywatna Animal
interfejs Animal taki sam jak prywatny interfejs Animal
Jeśli po prostu założysz, że domyślna jest zawsze najbardziej prywatna, nie musisz używać akcesoriów, dopóki nie musisz zmienić domyślnej. Łatwy.
źródło
Wewnętrzny jest domyślnym modyfikatorem
źródło
Poziom przestrzeni nazw:
internal
Poziom typu:
private
źródło