Proč je Array.length int, a ne uint

hlasů
78

Proč je Array.Lengthint, a nikoli uint. To me (jen trochu) vadí, protože hodnota délky nemůže nikdy ne negativní.

To mě také nuceni používat int o délce pozemku na své vlastní třídy, protože když zadáte int hodnotu, to je třeba explicitně cast ...

Tam je jakékoliv použití pro unsigned int (Takže konečný otázka je uint)? Dokonce i Microsoft se zdá ne k jejich použití.

Položena 08/08/2008 v 20:34
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
57

Unsigned int není CLS vyhovující a proto omezují využití majetku na ty jazyky, které se realizovat UInt.

Viz zde:

Framework 1.1

Úvod do knihovny tříd .NET Framework

Framework 2.0

.NET Framework Class Library Přehled

Odpovězeno 08/08/2008 v 20:50
zdroj uživatelem

hlasů
45

Mnoho důvodů:

  • uint není CLS kompatibilní, což je zabudovaný typu (Array), v závislosti na tom by bylo problematické
  • Runtime, jak byly původně zakazuje jakýkoliv objekt na haldě zabírá více než 2 GB paměti. Vzhledem k tomu, maximální velikosti pole, které by menší nebo roven této hranici by nový byte [int.MaxValue] by bylo matoucí pro lidi, aby mohli vytvářet pozitivní, ale ilegální délky pole.
  • Historicky C # zdědí hodně z jeho syntaxi a konvence z C a C ++. V těchto polích jsou prostě ukazatel aritmetické tak negativní indexování pole bylo možné (i když obvykle nezákonné a nebezpečné). Vzhledem k tomu, hodně stávající kód předpokládá, že index pole je podepsán by byli faktor
  • Na příbuznou notu použití podepsaných čísel pro pole indexy v C / C ++ znamená, že interoperability s těmito jazyky a neřízených funkcí by v každém případě vyžadují použití ints za těchto okolností, které mohou zmást vzhledem k nesouladu.
  • Provádění BinarySearch (velmi užitečný součástí mnoha algoritmů) se opírá o budou moci používat negativní rozsah int pro indikaci, že hodnota nebyla nalezena a místo, na které má být tato hodnota vloží udržovat třídění.
  • Při provozu na poli je pravděpodobné, že byste chtěli, aby se zápornou odchylku stávajícího indexu. Pokud jste použili offset, který by se vám v minulosti začátku pole pomocí jednotky pak obal okolo chování by váš index možná legální (v tom to je pozitivní). S int výsledkem by bylo nezákonné (ale bezpečné, protože runtime bude chránit před čtecím neplatné paměti)
Odpovězeno 29/01/2009 v 14:15
zdroj uživatelem

hlasů
1

Vypadá to, že nikdo za předpokladu, odpověď na otázku „konečnému otázky“.

Věřím, že primární použití nepodepsané ints je poskytnout jednodušší propojení s externími systémy (P / Invoke a podobně) a pokrýt potřeby různých jazyků je portován na .NET.

Odpovězeno 13/10/2008 v 16:23
zdroj uživatelem

hlasů
1

Myslím, že to také může mít co do činění s zjednodušit věci, na nižší úrovni, protože Array.length budou samozřejmě přidány do záporného čísla na nějakém místě, pokud Array.length byly nepodepsané, a přidal se k negativnímu int (dvojkový doplněk) , by mohlo být chaotický výsledky.

Odpovězeno 08/08/2008 v 21:05
zdroj uživatelem

hlasů
0

Typicky, celočíselné hodnoty jsou podepsány, pokud je výslovně potřebovat nepodepsaný hodnotu. Je to přesně tak, jak jsou používány. I nemusí souhlasit s touto volbou, ale je to prostě tak, jak to je.

V současné době, s dnešní typické omezení paměti, pokud vaše pole nebo podobná struktura dat potřebuje délku UInt32, měli byste zvážit i jiné datové struktury.

S řadou bytů bude Int32 vám 2GB hodnot

Odpovězeno 08/08/2008 v 20:40
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more