Domanda

Questa domanda ha già una risposta qui:

Perché è Array.Length un int e non a uint.Questo mi dà fastidio (solo un po') perché un valore di lunghezza non può mai essere negativo.

Questo mi ha anche costretto a usare un INT per una proprietà di lunghezza sulla mia classe, perché quando si specifica un valore int, questo deve essere esplicitamente ...

Quindi la domanda finale è:esiste qualche utilità per un int senza segno (uint)?Anche Microsoft sembra non usarli.

È stato utile?

Soluzione

Unsigned int non è conforme a CLS e pertanto limiterebbe l'utilizzo della proprietà a quei linguaggi che implementano a UInt.

Vedere qui:

Quadro 1.1

Introduzione alla libreria di classi .NET Framework

Quadro 2.0

Panoramica della libreria di classi di .NET Framework

Altri suggerimenti

Molte ragioni:

  • uint non è conforme a CLS, quindi rendere dipendente un tipo integrato (array) da esso sarebbe stato problematico
  • Il runtime progettato originariamente impedisce a qualsiasi oggetto nell'heap di occupare più di 2 GB di memoria.Poiché l'array di dimensione massima inferiore o uguale a questo limite sarebbe new byte[int.MaxValue], sarebbe sconcertante per le persone essere in grado di generare lunghezze di array positive ma illegali.
  • Storicamente C# eredita gran parte della sua sintassi e convenzioni da C e C++.In questi array c'è semplicemente l'aritmetica dei puntatori, quindi era possibile l'indicizzazione negativa degli array (sebbene normalmente illegale e pericolosa).Poiché gran parte del codice esistente presuppone che l'indice dell'array sia firmato, questo sarebbe stato un fattore
  • In una nota correlata, l'uso di interi con segno per gli indici di array in C/C++ significa che l'interoperabilità con questi linguaggi e funzioni non gestite richiederebbe comunque l'uso di int in tali circostanze, il che potrebbe creare confusione a causa dell'incoerenza.
  • L'implementazione BinarySearch (un componente molto utile di molti algoritmi) si basa sulla possibilità di utilizzare l'intervallo negativo dell'int per indicare che il valore non è stato trovato E la posizione in cui tale valore deve essere inserito per mantenere l'ordinamento.
  • Quando si opera su un array è probabile che si voglia prendere un offset negativo di un indice esistente.Se utilizzassi un offset che ti porterebbe oltre l'inizio dell'array utilizzando l'unità, il comportamento di avvolgimento renderebbe il tuo indice possibilmente legale (in quanto è positivo).Con un int il risultato sarebbe illegale (ma sicuro poiché il runtime proteggerebbe dalla lettura della memoria non valida)

Penso che potrebbe anche avere a che fare con la semplificazione delle cose a un livello inferiore, dal momento che Array.Length verrà ovviamente aggiunto a un numero negativo ad un certo punto, se Array.Length fosse senza segno e aggiunto a un int negativo (complemento a due) , potrebbero esserci risultati disordinati.

Sembra che nessuno abbia fornito una risposta alla "domanda finale".

Credo che l'uso principale degli int unsigned sia quello di fornire un'interfaccia più semplice con i sistemi esterni (P/Invoke e simili) e di coprire le esigenze di porting di vari linguaggi su .NET.

In genere, i valori interi sono con segno, a meno che non sia esplicitamente necessario un valore senza segno.È proprio il modo in cui vengono utilizzati.Forse non sono d'accordo con questa scelta, ma è proprio così.

Per il momento, con i vincoli di memoria tipici di oggi, se il tuo array o una struttura dati simile necessita di una lunghezza UInt32, dovresti prendere in considerazione altre strutture dati.

Con una matrice di byte, Int32 ti fornirà 2 GB di valori

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top