Jaka jest różnica między "chronionym" a "chronionym wewnętrznym"?

Czy ktoś może wyjaśnić różnicę między modyfikatorami protected i protected internal W C#? Wygląda na to, że ich zachowanie jest identyczne.

Author: mfluehr, 2009-02-25

11 answers

Modyfikator dostępu" protected internal" jest związkiem zarówno modyfikatorów "protected", jak i "internal".

From MSDN, access Modifiers (C# Programming Guide):

Protected:

Typ lub element można uzyskać tylko za pomocą kodu w tej samej klasie lub struct, lub w klasie, która pochodzi z tej klasy.

Wewnętrzne:

Typ lub element można uzyskać za pomocą dowolnego kodu w ten sam montaż, ale nie z innego zgromadzenia.

Protected internal :

Typ lub element można uzyskać za pomocą dowolnego kodu w zbiorze w które jest deklarowane, lub z klasy pochodnej w innym montaż. Dostęp z innego zgromadzenia musi odbywać się w ramach klasy deklaracja, która pochodzi od klasy, w której chronione element wewnętrzny jest deklarowany i musi się to odbywać poprzez instancja klasy pochodnej Typ.

Zauważ, że: protected internal oznacza "protected lub internal " (dowolną klasę w tym samym zbiorze lub dowolną klasę pochodną - nawet jeśli jest ona w innym zbiorze).

...oraz dla kompletności:

Prywatne:

Typ lub element można uzyskać tylko za pomocą kodu w tej samej klasie lub struct.

Publiczne:

Typ lub element można uzyskać za pomocą dowolnego innego kodu w tym samym montaż lub inny / align = "left" /

Private protected:

Dostęp jest ograniczony do klasy lub typów wywodzących się z zawierające klasę w bieżącym złożeniu.
(Dostępne od C# 7.2)

 412
Author: M4N,
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
2018-02-28 17:09:00

protected może być używany przez dowolne podklasy z dowolnego zespołu.

protected internal Czy wszystko, co protected jest, plus wszystko, co w tym samym zbiorze może mieć do niego dostęp.

Co ważne, nie oznacza to" podklasy w tym samym zespole " - jest to związek dwóch, a nie skrzyżowanie.

 89
Author: Marc Gravell,
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-03-28 18:29:25

Ta tabela pokazuje różnicę. protected internal jest tym samym co protected, z tym że umożliwia również dostęp z innych klas w tym samym zestawie.

Porównanie modyfikatorów C#

 65
Author: Andi AR,
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
2020-11-20 19:55:52

W praktyce o metodach:

Protected - dostępne dla klas dziedzicznych, inaczej prywatnych.

Internal - publiczne tylko dla klas wewnątrz zgromadzenia, w przeciwnym razie prywatne.

Protected internal - oznacza protected lub internal - metody stają się dostępne dla odziedziczonych klas i dla dowolnych klas wewnątrz zestawu.

 23
Author: abatishchev,
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
2015-10-24 23:22:40

Nadal istnieje wiele nieporozumień w zrozumieniu zakresu" chronionych wewnętrznych " accesorów, chociaż większość z nich ma poprawnie zdefiniowaną definicję. To pomogło mi zrozumieć zamieszanie między "chronionym" i "chronionym wewnętrznym": {]}

Public jest naprawdę publiczny wewnątrz i na zewnątrz Zgromadzenia (public internal / public external )

Protected jest naprawdę chroniony wewnątrz i na zewnątrz zespołu (protected internal / protected external ) (Niedozwolone na klasach najwyższego poziomu)

Prywatne jest naprawdę prywatne wewnątrz i na zewnątrz Zgromadzenia (prywatne wewnętrzne / prywatne zewnętrzne ) (Niedozwolone na klasach najwyższego poziomu)

Wewnętrzne jest naprawdę publiczne wewnątrz zgromadzenia, ale wykluczone poza zgromadzeniem, jak prywatne (publiczne wewnętrzne / wykluczone zewnętrzne )

Protected internal jest naprawdę publiczny wewnątrz zespołu, ale chroniony poza zespołem (public internal / protected external ) (Niedozwolone na klasach najwyższego poziomu)

Jak widać chroniona wewnętrzna jest bardzo dziwną bestią. Nie intuicyjnie.

To teraz nasuwa się pytanie, dlaczego Microsoft nie stworzył (protected internal / external), albo chyba jakiegoś rodzaju "private protected "lub"internal protected"? lol. Wydaje się niekompletne?

Dodano do zamieszania fakt, że można zagnieżdżać publiczne lub chronione wewnętrzne zagnieżdżone członkowie wewnątrz typów chronionych, wewnętrznych lub prywatnych. Dlaczego miałbyś uzyskać dostęp do zagnieżdżonego "chronionego wewnętrznego" wewnątrz klasy wewnętrznej, która wyklucza zewnętrzny dostęp do złożenia?

Microsoft twierdzi, że takie zagnieżdżone typy są ograniczone przez ich zakres typów nadrzędnych, ale kompilator mówi inaczej. Możesz skompilować chronione wewnętrzne klasy wewnętrzne, które powinny ograniczać zakres Tylko do złożenia.

Dla mnie to wygląda jak niekompletny projekt. Powinny uprościć zakres wszystkich typów do system, który wyraźnie uwzględnia dziedziczenie, ale także bezpieczeństwo i hierarchię typów zagnieżdżonych. Dzięki temu dzielenie się obiektami byłoby niezwykle intuicyjne i szczegółowe, a nie odkrywanie dostępności typów i elementów w oparciu o niekompletny system zakresów.

 10
Author: Stokely,
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-04-24 10:13:11

Protected : zmienna lub metoda będzie dostępna tylko dla klas potomnych (w dowolnym zestawie)

Protected internal : dostępne dla klas potomnych w dowolnym zestawie i dla wszystkich klas w tym samym zestawie

 7
Author: BenMorel,
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
2014-01-07 12:22:15

Przeczytałem bardzo jasne definicje tych terminów.

Protected: dostęp jest ograniczony do definicji klasy i dowolnej klasy, która dziedziczy po klasie. Do typu lub elementu można uzyskać dostęp tylko za pomocą kodu w tej samej klasie lub strukturze lub w klasie, która pochodzi z tej klasy.

Internal: dostęp jest ograniczony wyłącznie do klas zdefiniowanych w aktualnym zestawieniu projektu. Typ lub element można uzyskać tylko za pomocą kodu w tym samym klasy.

Protected-Internal: dostęp jest ograniczony do bieżącego zestawu lub typów pochodzących z klasy zawierającej.

 3
Author: Ammar Asjad,
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-09-28 13:53:06

Protected Member

Protected Member of a class in only available in the contained class (in which it has been declarated) and in the derived class within the assembly and also outside the assembly.

Oznacza, że klasa, która znajduje się poza asemblem, może używać chronionego członka innego asemblem, dziedzicząc tylko tę klasę.

Możemy odsłonić chroniony element poza zbiorem poprzez dziedziczenie tej klasy i użyć go w klasie pochodnej tylko.

Notatka: Protected members nie są dostępne przy użyciu obiektu w klasie pochodnej.

Członek Wewnętrzny

Wewnętrzny element klasy jest dostępny lub jest dostępny w asemblerze albo tworząc obiekt lub w klasie pochodnej, albo można powiedzieć, że jest dostępny we wszystkich klasach w asemblerze.

Uwaga: wewnętrzne pręty nie są dostępne poza asemblem ani za pomocą tworzenia obiektu, ani w pochodnej klasy.

Protected Internal

Modyfikator Protected Internal access jest kombinacją Protected lub Internal.

Protected Internal Member może być dostępny w całym zestawieniu, w którym zadeklarował albo tworzenie obiektu, albo dziedziczenie tej klasy. I mogą być dostępne poza złożeniem tylko w klasie pochodnej.

Uwaga: chroniony element wewnętrzny działa jako wewnętrzny w tym samym zespole i działa jako chroniony Na Zewnątrz montaż.

 1
Author: Mostafa Bouzari,
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
2015-12-29 07:50:06

Public - Członkowie (funkcje i zmienne) zadeklarowani jako public mogą być dostępne z dowolnego miejsca.

Private - Członkowie prywatni nie mogą być dostępni spoza klasy. Jest to domyślny specyfikator dostępu dla członka, tzn. jeśli nie podasz specyfikacji dostępu dla członka (zmiennej lub funkcji), zostanie on uznany za prywatny. Dlatego też, string PhoneNumber; jest odpowiednikiem private string PhoneNumber.

Protected - Protected members dostęp można uzyskać tylko z zajęć dla dzieci.

Wewnętrzny - dostęp do niego można uzyskać tylko w ramach tego samego zestawu.

Protected internal - można uzyskać do niego dostęp zarówno w obrębie tego samego zestawu, jak i w klasie pochodnej.

 1
Author: Piush shukla,
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-08-28 17:00:38

Protected internal best suites jeśli chcesz, aby element lub typ był używany w klasie pochodnej z innego zestawu w tym samym czasie, po prostu chcesz użyć elementu lub typ w zestawie nadrzędnym bez wynikania z klasy, w której jest zadeklarowany. Również jeśli chcesz używać tylko pręta lub typu z wyjściem pochodzącym z innej klasy, w tym samym złożeniu możesz używać tylko wewnętrznego.

 0
Author: satishpkumarin,
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-09-02 18:04:49

Pomyśl o protected internal jako o zastosowaniu dwóch modyfikatorów dostępu (protected i internal) na tym samym polu, Właściwości lub metodzie.

W realnym świecie, wyobraź sobie, że wydajemy ludziom przywilej odwiedzania Muzeum:

  1. każdy wewnątrz miasto może odwiedzić Muzeum (wewnętrzne).
  2. każdy poza miastem, w którym mieszkają ich rodzice, może odwiedzić Muzeum (chronione).

I możemy je połączyć w te sposób:

Każdy wewnątrz miasta (wewnętrznego) i każdy poza miasta, w którym mieszkają ich rodzice (chronionego), może odwiedzić Muzeum (chronionego wewnętrznego).

Świat programowania:

Internal: pole jest dostępne wszędzie w montażu (projekcie). To tak, jakby powiedzieć, że jest public w jego zakresie projektu (ale nie może być dostępny poza zakresem projektu nawet przez te klasy poza assembly, które dziedziczenie z tej klasy). Każda instancja tego typu może ją zobaczyć w tym zestawieniu (zakres projektu).

Protected : oznacza po prostu, że wszystkie klasy pochodne mogą go zobaczyć (wewnątrz lub na zewnątrz assembly). Na przykład klasy pochodne mogą widzieć pole lub metodę wewnątrz swoich metod i konstruktorów używając: base.NameOfProtectedInternal.

Więc, złożenie tych dwóch modyfikatorów dostępu razem (protected internal), masz coś, co może być publiczne wewnątrz projektu i można je zobaczyć przez tych, którzy odziedziczyli po tej klasie w swoim zakresie.

Można je zapisać w internal protected, a nie zmienia znaczenia, ale wygodnie jest je zapisać protected internal.

 0
Author: Hassan Monjezi,
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
2020-11-22 07:12:15