Dlaczego jest Array.Długość int, a nie uint [duplikat]

To pytanie ma już odpowiedź tutaj:

Dlaczego Array.Length jest int, a nie uint. Przeszkadza mi to (tylko trochę), ponieważ wartość długości nigdy nie może być ujemna.

To również zmusiło mnie do użycia int dla własności długości na mojej własnej klasie, ponieważ kiedy określić wartość int, to musi być rzucone jawnie...

Więc ostatecznym pytaniem jest: czy jest jakieś zastosowanie dla unsigned int (uint)? Nawet Microsoft zdaje się ich nie używać.

Author: Farshid, 2008-08-08

5 answers

Unsigned int nie jest zgodny z CLS i dlatego ograniczy użycie właściwości do tych języków, które implementują UInt.

Zobacz tutaj:

Framework 1.1

Wprowadzenie do biblioteki klas. NET Framework

Framework 2.0

Przegląd biblioteki klas. NET Framework

 58
Author: Kev,
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-05-10 14:05:11

Wiele powodów:

  • uint nie jest zgodny z CLS, więc uzależnienie wbudowanego typu (tablicy) od niego byłoby problematyczne
  • środowisko uruchomieniowe, jak pierwotnie zaprojektowano, zabrania jakiegokolwiek obiektu na stercie zajmującego więcej niż 2 GB pamięci. Ponieważ tablica o maksymalnym rozmiarze, która byłaby mniejsza lub równa temu limitowi, byłaby nowym bajtem[int.MaxValue] byłoby zastanawiające dla ludzi, aby móc generować pozytywne, ale nielegalne długości tablic.
  • [[3]] historycznie C# dziedziczy znaczną część składni i konwencji z C i C++. W tych tablicach są po prostu arytmetyka wskaźnikowa, więc indeksowanie tablicy było możliwe (choć normalnie nielegalne i niebezpieczne). Ponieważ wiele istniejących kodów zakłada, że indeks tablicy jest podpisany, byłby to czynnik
  • w powiązanej notce użycie podpisanych liczb całkowitych dla indeksów tablic w C / C++ oznacza to, że interakcja z tymi językami i niezarządzanymi funkcjami i tak wymagałaby użycia ints w tych okolicznościach, co może być mylące ze względu na niespójność.
  • implementacja BinarySearch (bardzo przydatny składnik wielu algorytmów) polega na tym, że można użyć ujemnego zakresu int, aby wskazać, że wartość nie została znaleziona i miejsce, w którym taka wartość powinna być wstawiona w celu utrzymania sortowania.
  • podczas pracy na tablicy jest prawdopodobne że chcesz wziąć ujemne przesunięcie istniejącego indeksu. Jeśli użyłeś offsetu, który przeniesie Cię poza początek tablicy używając unit, to zachowanie zawijania sprawi, że Twój indeks będzie prawdopodobnie legalny (w tym, że jest dodatni). Z int wynik byłby nielegalny (ale bezpieczny, ponieważ runtime chroniłby przed odczytaniem nieprawidłowej pamięci)
 46
Author: ShuggyCoUk,
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-07-22 11:33:52

Myślę, że to również może mieć związek z upraszczaniem rzeczy na niższym poziomie, ponieważ Array.Długość będzie oczywiście dodawana do liczby ujemnej w pewnym momencie, jeśli tablica.Długość była niepodpisana i dodana do ujemnej int( dopełniacz dwóch), mogły być niechlujne wyniki.

 1
Author: ,
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
2008-08-08 20:05:07

Wygląda na to, że nikt nie udzielił odpowiedzi na"ostateczne pytanie".

Uważam, że głównym zastosowaniem unsigned ints jest zapewnienie łatwiejszego połączenia z zewnętrznymi systemami (P / Invoke i tym podobne) i pokrycie potrzeb różnych języków, które są przenoszone do. NET.

 1
Author: Constantin,
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
2008-10-13 15:23:42

Zazwyczaj wartości całkowite są podpisywane, chyba że jawnie potrzebujesz niepodpisanej wartości. To tylko sposób, w jaki są używane. Może nie zgadzam się z tym wyborem, ale tak już jest.

Na razie, przy dzisiejszych typowych ograniczeniach pamięci, jeśli Twoja tablica lub podobna struktura danych wymaga długości UInt32, powinieneś rozważyć inne struktury danych.

Z tablicą bajtów, Int32 da ci 2GB wartości

 0
Author: Lasse Vågsæther Karlsen,
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
2008-08-08 19:40:31