wewnętrzny vs publiczny w c #


92

Chcę poznać różnicę między modyfikatorami widoczności publici internal.

Kiedy powinniśmy używać internalna zajęciach i kiedy public? Nie wiem, kiedy powinna być metoda publiclub internal.

Czytałem, że internalmożna uzyskać do niego dostęp za publicpośrednictwem zestawu , a także można go użyć za pośrednictwem zespołu, w którym leży różnica.

Odpowiedzi:


101

public jest widoczny z każdego miejsca.

internal jest widoczny tylko w zespole

Zwykle używasz tylko wewnętrznego do ochrony wewnętrznych interfejsów API. Na przykład możesz ujawnić kilka przeciążeń metody:

public int Add(int x, int y)
public int Add(int x,int y, int z)

Oba wywołują metodę wewnętrzną

internal int Add(int[] numbers)

Można wtedy włożyć wiele wyrafinowania do metody, ale „zabezpieczyć” ją za pomocą metod fasadowych, które mogą pomóc programiście w poprawnym wywołaniu metody. (Na przykład metoda implementacji z parametrem tablicy może mieć dowolny limit wartości).

Warto również zauważyć, że używając Reflection, wszystkie metody są wywoływalne, niezależnie od ich widoczności. Kolejny „hack” do kontrolowania / uzyskiwania dostępu do wewnętrznie ukrytych interfejsów API.


5
czy w klasie wewnętrznej mogę zadeklarować metody publiczne ..?
NoviceToDotNet

Nie, ponieważ spowodowałoby to konflikt. Kompilator powie Ci o tym i zakończy się niepowodzeniem.
Program.X

14
@ Program.X: Właściwie możesz, a kompilator nic ci nie powie.
LUB Mapper

Właściwie to przyszedłem tutaj, sprawdzając, czy jest to w rzeczywistości funkcja. Wyobraź sobie, że tworzysz klasę internali wszystkie metody public. Jeśli potrzebujesz większej widoczności, możesz ponownie ustawić całą klasę public. Ale nie jestem pewien, czy ma być używany w ten sposób. Więc kontynuuję googlowanie ... edytuj Et voilà, ten sam temat: stackoverflow.com/questions/9302236/...
ecth

31

internaljest przydatne, gdy chcesz zadeklarować składową lub wpisać wewnątrz biblioteki DLL, a nie poza nią ...
normalnie, gdy deklarujesz składową, ponieważ Publicmożesz uzyskać do niego dostęp z innych bibliotek DLL. ale jeśli chcesz zadeklarować coś jako publiczne tylko w swojej bibliotece klas, możesz zadeklarować to jako Internal.
w formalnej definicji: członkowie wewnętrzni są widoczni tylko w obecnym zgromadzeniu ...


11

internalprzydaje się również podczas pisania testów jednostkowych. InternalsVisibleToAtrybut niech test montaż dostęp metody wewnętrznych w kodzie montażu. Oznacza to, że możesz przetestować metody, które wydają się prywatne dla świata zewnętrznego bez użycia refleksji.


6

Publiczny jest również dostępny poza zgromadzeniem. Więc jeśli masz klasę, do której nie powinno się uzyskiwać dostępu, każda klasa w zestawie powinna mieć do niej dostęp, wtedy wewnętrzna jest właściwa rzecz. Jeśli potrzebujesz dostępu z zewnątrz, użyj publicznego.


4

Ponadto właściwości oznaczone jako internalspowodują zgłoszenie, BindingExpression path errorjeśli są używane do DataBinding w WPF. Muszą więc działać public, aby działały poprawnie, nawet jeśli DataBinding odbywa się w tym samym zestawie.


1

Ogólnie rzecz biorąc, publicmetody powinny spełniać bardzo wysokie standardy niezawodności (nie powodują awarii lub uszkodzenia danych z powodu złych danych wejściowych) i świadomości bezpieczeństwa (nie pozwalają na uruchomienie exploita przez nieoczekiwane dane wejściowe). Ale dla internal, protectedoraz privatemetod, często będzie rozsądnie postępować bardziej zrelaksowany standardów, ponieważ jeden ma pełną kontrolę nad tym, co wprowadza każda metoda może otrzymać.

Ponieważ parametry przekazane do publicmetody (prawdopodobnie z zewnętrznego źródła) są uważane za mniej godne zaufania niż parametry otrzymane z własnego zestawu, metody oznaczone jako publicsą często traktowane inaczej przez analizatory kodu niż identyczne metody oznaczone jako internal. Na przykład w przypadku publicmetody analizator może ostrzec, aby sprawdzić, czy parametry metody nie są zerowe. W przypadku internalmetod może być możliwe skonfigurowanie analizatora tak, aby mniej rygorystycznie nullsprawdzał. Analizator może też samodzielnie określić, wykonując analizę przepływu wszystkich plików źródłowych zespołunullnigdy nie zostaną przekazane do określonej metody jako argument, a tym samym stwierdzą, że nie ma potrzeby sprawdzania, czy parametr jest null. Istnieje wiele innych przykładów traktowania analizatorów publici internalmetod w inny sposób.

Poprzez prawidłowe oznaczenie klas, metod, właściwości, pól, interfejsów itp. Odpowiednimi modyfikatorami dostępu, poprawnie sygnalizujesz analizatorom kodu swój zamiar, a następnie analizator może w zamian udzielić Ci bardziej odpowiednich komunikatów ostrzegawczych i porad.


-3

Jeśli możesz odwołać się do zestawu z zewnątrz, masz zakres klas wewnętrznych i publicznych

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.