Domanda

Che cosa è il razionale per l'utilizzo numeri con segno gli indici in .Net?

In Python, è possibile indicizzare dalla fine di una matrice con l'invio di numeri negativi, ma questo non è il caso in .Net. Non è facile per .NET per aggiungere una caratteristica in seguito in quanto potrebbe rompersi altro codice magari utilizzando regole speciali (si, una cattiva idea, ma credo che accade) sulla indicizzazione.

Non che io abbia mai avuto bisogno di array indice sopra 2,147,483,647 in termini di dimensioni, ma davvero non riesco a capire il motivo per cui hanno scelto i numeri con segno.

Può essere perché è più normale usare i numeri con segno in codice?

Edit: Ho appena trovato questi link:

I pericoli di non firmato iterazione in C / C ++

lunghezze di parola firmato e indici

Edit2: Ok, un paio di altri motivi buoni dal thread Matthew Flaschen pubblicato:

  • ragioni storiche, si tratta di un c-come il linguaggio
  • interoperabilità con c
È stato utile?

Soluzione

Per semplicità, naturalmente. Ti piace problemi facendo dimensioni aritmetica con unsigned int?

Altri suggerimenti

Può essere alla lunga tradizione di usare un valore inferiore a 0 come un indice non valido. Metodi come String.IndexOf restituiscono -1 se l'elemento non viene trovato. Pertanto, il valore di ritorno deve essere firmato. Se index-consumatori richiederebbe valori senza segno, sarebbe necessario un controllo) e b) il cast del valore di usarlo. Con indici firmati, basta il controllo.

Unsigned non è compatibile con CLS.

L'utilità primaria di numeri senza segno sorge quando la composizione di un numero maggiore di quelli più piccoli e viceversa. Ad esempio, se si riceve quattro byte senza segno da una connessione e desidera considerare il loro valore, nel suo complesso, come un intero a 32 bit, utilizzando tipi firmati mezzi si può semplicemente fare:

  value = byte0 | (byte1*256) | (byte2*65536) | (byte3*16777216);

Per contro, se firma dei byte, un'espressione come sopra sarebbe più complicato.

Non sono sicuro che ho davvero vedere alcuna ragione per un linguaggio progettato al giorno d'oggi non includere le versioni senza firma di tutti i tipi di durata inferiore il più lungo di tipo intero con segno, con la semantica che tutto intero (che significa discreti-quantità-numerici, piuttosto che eventuali operazioni particolari tipo) che si inserisce interamente nella grande tipo firmata saranno di default eseguite come se agivano su quel tipo. Tra cui una versione senza segno del più grande tipo firmato complicherebbe la specifica del linguaggio (in quanto si dovrebbe specificare quali operazioni devono rientrare nel raggio d'azione del tipo firmato, e che le operazioni devono rientrare nel raggio d'azione di tipo non firmato), ma per il resto non ci dovrebbero essere nessun problema progettazione di un linguaggio in modo che if (unsigned1 - unsigned2 > unsigned3) produrrebbe un "numerico corretto" provocare anche quando unsigned2 è maggiore di unsigned1 [se si vuole avvolgente non firmato, avrebbe esplicitamente specificare if ((Uint32)(unsigned1 - unsigned2) > unsigned3)]. Un linguaggio che specifica tale comportamento sarebbe certamente un grande miglioramento rispetto alla confusione che esiste in C (giustificabile, data la sua storia), C # o vb.net.

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