• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Array.Clear- jak działa?

VPS Starter Arubacloud
0 głosów
204 wizyt
pytanie zadane 10 października 2020 w C# przez JakSky Stary wyjadacz (14,770 p.)

Natrafiłem ostatnio na ciekawą funkcję: Array.Clear. Na pierwszy rzut oka wygląda zwyczajnie, ale interesuje mnie pewna rzecz.

Załóżmy, że mam tablicę:

private int[] myIntArray = new int[] { 1, 2, 3, 4, 5};

I mamy jakąś funkcję która wywołuje:

Array.Clear(myIntArray,0, myIntArray.Length);

Co ciekawe nasza tablica zostanie zresetowana, pomimo tego, że:

Metoda Clear nie ma słowa kluczowego ref, ani też nieprzypisujemy wyniku metody Clear do tablicy. Więc jakim cudem metoda Clear zmienia stan tablicy?

2 odpowiedzi

+2 głosów
odpowiedź 10 października 2020 przez Jakub 0 Pasjonat (23,120 p.)
edycja 10 października 2020 przez Jakub 0
 
Najlepsza

Nie pisałem nigdy w C#, ale na logikę:

Tablica w C# jest typem referencyjnym, to znaczy że do myIntArray zostanie zapisana referencja ( pointer ) do danych a nie same dane ( new zwraca referencje do utworzonej tablicy ). W przykładzie ta referencja jest co prawda przekazywana przez kopię, jednak ona już wskazuje na inne dane ( przechowuje adres tych danych ). Jak byś użył ref to byś miał referencję na referencję.

To oczywiście nie zadziała dla typów prostych ( jak int, float itd... ) bo w tym przypadku zmienne faktycznie trzymają dane same w sobie.

https://stackoverflow.com/questions/10325323/passing-arrays-by-value-and-by-reference

Jeśli tego nie rozumiesz to nie przejmuj się, w tracie nauki języka powinieneś to automatycznie pojąć. ( najlepiej poczytaj o działaniu new )

1
komentarz 10 października 2020 przez adrian17 Ekspert (344,100 p.)
(napisałeś że nie jesteś pewny, więc tylko dodam że dla mnie brzmi poprawnie)
komentarz 10 października 2020 przez JakSky Stary wyjadacz (14,770 p.)
Tak tak, wszytko się zgadza. Tylko jeszcze jeden dylemat.... Dlaczego jakaś zewnętrzna klasa(Array) może modyfikować zmienną prywatną(private int[] myIntArray) w innej klasie? Tu też chodzi referencje? Hmm
1
komentarz 10 października 2020 przez adrian17 Ekspert (344,100 p.)
Prywatność oznacza "nie możesz z obiektu tej klasy wyciągnąć tego pola". Ale tutaj Array.Clear() nie dostaje obiektu Twojej klasy, tylko sam mu przekazałeś referencję do tej tablicy, więc prywatność w ogóle tutaj nie wchodzi w grę.
1
komentarz 10 października 2020 przez Jakub 0 Pasjonat (23,120 p.)

Zmienne prywatne polegają na tym że nie są one dostępne w interfejsie obiektu klasy. Czyli jak masz klasę A ze zmienną b, to w przypadku obiektu klasy A nie masz dostępu do obiekt.b ... ale to pewnie wiesz.

Takie ukrywanie danych w programowaniu obiektowym nazywamy hermetyzacją. To jednak absolutnie nie ma wpływu na twoją zdolność robienia z prywatnym polem we "wnętrzu klasy" co chcesz, czyli w metodzie klasy jak najbardziej możesz taką zmienną ( pole ) modyfikować, zwracać czy przekazywać do innej funkcji.

 

komentarz 10 października 2020 przez JakSky Stary wyjadacz (14,770 p.)
Hmm według mnie to stanowi pewne zagrożenie. Mamy referencje(prywatną) która sobie swobodnie lata po całej aplikacji. Tak naprawdę nie wiemy na przykład co taka metoda Clear z zewnętrznej klasy robi z naszą zmienną. Dziwne to trochę. Znacie jakieś sposoby, by taka referencja została tylko w zasięgu danej klasy?
komentarz 10 października 2020 przez Jakub 0 Pasjonat (23,120 p.)
edycja 10 października 2020 przez Jakub 0

według mnie to stanowi pewne zagrożenie

W pewnym sensie tak. Jednak w przypadku funkcji standardowej nie ma powodów do obaw.

Pamiętaj jednak że dokładnie takie same zagrożenie jest dla "krążących po programie" referencji niezależnie czy pochodzą one od prywatnego pola klasy czy nie. Problem ten więc nie tyczy się bezpieczeństwa pól prywatnych ale w ogóle bezpieczeństwa referencji. A te w C# są dość bezpieczne w przeciwieństwie do C++ gdzie dynamicznymi danymi zarządzasz ręcznie ( o ile nie używasz tzw. smart pointerów ).

 

komentarz 10 października 2020 przez JakSky Stary wyjadacz (14,770 p.)

Referencje są kopiowane, ale wszystkie prowadzą do tej samej instancji obiektu :) Trzeba bacznie się przyglądać, bo łatwo o problemy. Dzięki za odpowiedzi. yes

1
komentarz 10 października 2020 przez adrian17 Ekspert (344,100 p.)

Hmm według mnie to stanowi pewne zagrożenie

Spójrz na to inaczej... gdyby to nie było możliwe, jak mógłbyś zrobić _cokolwiek_ praktycznego z tą tablicą? Nie możesz używać Array.Copy, Array.Reverse, Array.Sort, Array.Find etc etc - to co, będziesz implementować od zera sortowanie tablicy w każdej klasie z prywatnym polem tablicowym? ;)

Powtórzę - celem prywatności jest chowanie szczegółów przed użytkownikami klasy. W środku implentacji klasy, to odpowiedzialnością kodu klasy jest że poprawnie używasz jej zawartość - nie ma powodu sztucznie ograniczać ich uzywania.

Tak naprawdę nie wiemy na przykład co taka metoda Clear z zewnętrznej klasy robi z naszą zmienną

Doskonale wiesz - masz opis z dokumentacji. W dodatku... jeśli nie ufasz bibliotece którą używasz, to "robi co innego niż pisze w dokumentacji" jest Twoim najmniejszym problemem.

–1 głos
odpowiedź 10 października 2020 przez kukulim Mądrala (6,440 p.)
komentarz 10 października 2020 przez JakSky Stary wyjadacz (14,770 p.)
Nie ma o tym ani słowa.
1
komentarz 10 października 2020 przez kukulim Mądrala (6,440 p.)
No to trzeba przejść w dokumentacji wyżej i poczytać o Array Klasa :)

https://docs.microsoft.com/pl-pl/dotnet/api/system.array?view=netcore-3.1

Podobne pytania

0 głosów
1 odpowiedź 111 wizyt
pytanie zadane 16 kwietnia 2021 w C i C++ przez xxx109 Nowicjusz (160 p.)
0 głosów
1 odpowiedź 392 wizyt
pytanie zadane 11 lutego 2016 w JavaScript przez movinger Nowicjusz (180 p.)
+1 głos
1 odpowiedź 213 wizyt
pytanie zadane 15 lutego 2022 w C# przez chrystian Gaduła (4,780 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...