Domanda

La maggior parte del tempo ci rappresentano concetti che non può mai essere inferiore a 0.Per esempio, per dichiarare lunghezza, possiamo scrivere:

int length;

Il nome esprime bene al suo scopo, ma è possibile assegnare i valori negativi ad esso.Sembra che per alcune situazioni, è possibile rappresentare il vostro intento, più chiaramente, scrivendo in questo modo, invece:

uint length; 

Alcuni svantaggi che mi vengono in mente:

  • tipi unsigned (uint, ulong, ushort) non sono compatibili con CLS quindi non è possibile utilizzarlo con altre lingue che non supportano questo
  • .Net classi firmato tipi di la maggior parte del tempo quindi devi cast

Pensieri?

È stato utile?

Soluzione

“Quando sei a Roma, fai come i Romani.”

Mentre non vi è teoricamente un vantaggio nell'utilizzo di valori senza segno, dove applicabile, in quanto rende il codice più espressivo, questo semplicemente non è fatto in C#.Non so perché gli sviluppatori inizialmente non progettare le interfacce per gestire uints e rendere il tipo di CLS conforme, ma ora che il treno ha lasciato la stazione.

Dal momento che la coerenza è generalmente importante vorrei consigliare di prendere il C# strada e l'utilizzo di ints.

Altri suggerimenti

Se si decrementa di un numero con segno con un valore di 0, diventa negativo e si può facilmente verificare questo.Se si decrementa un numero senza segno, con un valore di 0, underflow e diventa il valore massimo per il tipo un po ' più difficile da controllare.

Il secondo punto è il più importante.Generalmente si dovrebbe usare int dal momento che è un buon "catch-all" per valori interi.Vorrei usare solo uint se è assolutamente necessario la capacità di contare superiore int, ma senza l'utilizzo di memoria aggiuntiva long richiede (non molto più di memoria, in modo da non essere a buon mercato :-p).

Penso che l'uso sottile di uint vsint causa di confusione con gli sviluppatori a meno che non è stato scritto nelle linee guida per gli sviluppatori per la società.

Se la lunghezza, per esempio, non può essere inferiore a zero deve essere espressa chiaramente la logica di business in modo che in futuro gli sviluppatori in grado di leggere il codice e conoscere il vero intento.

Solo i miei 2 cents.

Vi segnalo che in C# è possibile attivare /checked per verificare aritmetica di overflow / underflow, che non è una cattiva idea comunque.Se le prestazioni contano in una sezione critica, è comunque possibile utilizzare unchecked per evitare questo.

Per interno codice (vale a dire il codice che non fanno riferimento a qualsiasi interoperabilità padronale con altre lingue) io voto per l'utilizzo unsigned quando la situazione lo richiede, come length variabili come accennato in precedenza.Questo, insieme controllato aritmetica - fornisce una più netta per gli sviluppatori, la cattura di una sottile bug precedenti.

Un altro punto della firmati o non firmati dibattito è che alcuni programmatori utilizzano valori come il -1 per indicare gli errori, quando non avrebbe altrimenti senso.Condivido il punto di vista che ogni variabile deve avere un solo scopo, ma se voi o i colleghi si codice come per indicare gli errori in questo modo, lasciando variabili firmato dà la flessibilità di aggiungere errore uniti.

I vostri due punti sono buoni.Il motivo principale per evitare casting, però.Casting li rende incredibilmente fastidioso da usare.Ho provato ad utilizzare unisigned variabili di una volta, ma ho dovuto cospargere cast assolutamente ovunque, perché il quadro di riferimento, metodi per utilizzare gli interi con segno.Pertanto, ogni volta che si chiama un quadro metodo cast.

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