Perché long int ha un modificatore letterale, ma breve int no?
La domanda è "perché C# non ha questa funzione?" La risposta a questa domanda è sempre la stessa. Le funzionalità non sono implementate per impostazione predefinita; C# non ha questa caratteristica perché nessuno ha progettato, implementato e spedito la funzionalità ai clienti.
L'assenza di una funzione non ha bisogno di giustificazione. Piuttosto, tutte le caratteristiche devono essere giustificate dimostrando che i loro benefici superano i loro costi. Come la persona che propone la funzione, l'onere è su di te per descrivere perché pensi che la funzione sia preziosa; l'onere non è su di me per spiegare perché non lo è.
Probabilmente esiste un motivo valido per fornire i modificatori letterali per alcuni tipi, ma non per tutti. Che cos'è?
Ora questa è una domanda più comprensibile. Ora la domanda è "cosa giustifica il suffisso letterale a lungo, e perché non è anche una giustificazione per un suffisso letterale simile in breve?"
I numeri interi possono essere utilizzati per una varietà di scopi. Puoi usarli come numeri aritmetici . Puoi utilizzarli come raccolte di bit bit. Puoi usarli come indici negli array. E ci sono molti altri usi speciali. Ma penso sia giusto dire che la maggior parte delle volte, gli interi sono usati come numeri aritmetici.
La stragrande maggioranza dei calcoli eseguiti in interi da programmi normali coinvolge numeri che sono molto, molto più piccoli del range di un intero con segno a 32 bit - circa +/- 2 miliardi. E un sacco di hardware moderno è estremamente efficiente quando si tratta esclusivamente di interi a 32 bit. Ha quindi senso rendere la rappresentazione predefinita dei numeri da firmare interi a 32 bit. C# è quindi progettato per fare calcoli che coinvolgono interi con segno a 32 bit sembrano perfettamente normali; quando dici "x = x + 1" che "1" è un intero con segno a 32 bit, e le probabilità sono buone anche x e il risultato della somma è troppo.
Cosa succede se il calcolo è integrale ma non si adatta all'intervallo di un numero intero a 32 bit?gli interi "lunghi" a 64 bit sono un sensibile passo successivo; sono anche efficienti su un sacco di hardware e hanno una gamma che dovrebbe soddisfare le esigenze di quasi tutti coloro che non stanno facendo combinatori heavy-duty che coinvolgono numeri estremamente grandi. Ha quindi senso avere un modo per specificare in modo chiaro e conciso nel codice sorgente che questo letterale qui deve essere trattato come un intero lungo.
Gli scenari di interoperabilità o gli scenari in cui gli interi vengono utilizzati come campi bit, richiedono spesso l'uso di numeri interi non firmati. Di nuovo, ha senso avere un modo per specificare in modo chiaro e conciso che questo letterale è destinato a essere trattato come un intero senza segno.
Quindi, riassumendo, quando vedi "1", le probabilità sono buone che la maggior parte delle volte l'utente intende utilizzarlo come un intero con segno a 32 bit. Il prossimo caso più probabile è che l'utente intenda che sia un intero lungo o un intero senza segno o senza firma. Pertanto ci sono suffissi concisi per ciascuno di questi casi.
Pertanto, la funzione è giustificata.
Perché non è una giustificazione per i cortometraggi?
Perché innanzitutto, in ogni contesto in cui un cortocircuito è legale, è già legale utilizzare un numero intero letterale. "short x = 1;" è perfettamente legale; il compilatore comprende che l'intero si inserisce in un breve e ti consente di usarlo.
Secondo, l'aritmetica non viene mai eseguita in corti in C#. L'aritmetica può essere eseguita in interi, uints, long e long, ma l'aritmetica è mai fatta in corti. Gli short promuovono a int e l'aritmetica è fatta in pollici, perché come ho detto prima, lo la stragrande maggioranza dei calcoli aritmetici si adattano a un int. La stragrande maggioranza è non in forma in un breve. L'aritmetica breve è probabilmente più lenta su hardware moderno che è ottimizzato per gli interi, e l'aritmetica breve non occupa meno spazio; sarà fatto in pollici o long sul chip.
Si desidera un suffisso "lungo" per indicare al compilatore "questa aritmetica deve essere eseguita a lungo" ma un suffisso "breve" non dice al compilatore "questa aritmetica deve essere eseguita in cortocircuito" perché è semplicemente non una caratteristica del linguaggio C# per cominciare.
I motivi per fornire un suffisso lungo e una sintassi non firmata non si applicano ai cortocircuiti. Se ritieni che vi sia un vantaggio convincente per la funzionalità, specifica quali sono i vantaggi. Senza un vantaggio per giustificare i suoi costi, la funzionalità non sarà implementata in C#.
Dai un'occhiata a questa domanda (e la risposta di Eric Lippert): http://stackoverflow.com/questions/1678591/why-are-number-suffixes-necessable –