-
Floating-point standards
- I tipi float (32 bit) e double (64 bit) si basano sullo standard IEEE 754
- Questo standard prevede un bit di segno, alcuni bit di esponente e alcuni bit di mantissa, il valore del numero è dato dalla seguente formula:
(Notare che la base è 2)
- Dove è necesssario rappresentare valori finanziari o misure del mondo reale è meglio utilizzare il tipo decimal (128 bit) rappresentato in base 10.
- Dato che i tipi float e double sono supportati nativamente dalla quasi totalità dei moderni processori le prestazioni computazionali sono di un ordinde di grandezza (x10) superiore al tipo decimal.
- Per questa ragione questi tipi sono l'ideale per applicazioni scentifiche o matematiche.
- Attenzione però che i tipi float e double hanno una "precisione inferiore" dei tipi integrali (int, long)
Code Snippet
- public void WhenCastFromLargeIntegerValueToFloatMagnituedIsPreversevedButBrecisionIsLost()
- {
- int i = 100000001;
- float f = i;
- Assert.AreNotEqual(i, (int) f);
- Assert.AreEqual("100000000", ((int) f).ToString("0"));
- }
-
Conditional operators (&& - || - & - |)
- La risoluzione degli operatori && e || determinata uno "short-circuit (cortocircuito)" quando possibile
- Gli operatori & e | indicano invece di non "cortocircuitare" l'espressione, cioè tutti gli argomenti dell'espressione vengono sempre valutati.
- Notare che quando & e | sono applicati a tipi integrali operano come and e or bit a bit.
-
Arrays
- Gli array multidimensionali si dichiarano come con la notazione type[d1,d2...]
- Gli array jagged ("frastagliati") sono array di array e si dichiarano con la notazione type[][]...
- Le particolari convenzioni di inizalizzazione degli array jagged sono spiegate in questo articolo di Eric Lippert: Arrays of arrays
-
Optional parameters (introdotti con C# 4.0)
- Un parametro è opzionale quand viene dichiarato un valore di default: void Method(int a=1, int b=2) { ... }
- E' importante ricordarsi che quando si aggiunge un parametro ad un metodo è necessario ricompilare gli assembly chiamanti
-
-
Switch statements
- E' possibile passare ad un case diverso con le dichiarazioni "goto case x" e "goto default"
-
Advanced namespaces rules
- In caso di conflitto di nome (completamente qualificato) (namespace.type) tra due assembly diversi, è possibile importarli definendo un alias (Notare che vanno compliati con apposita opzione del compilatore csc [/r])
- L'alias si importa quindi con il seguente statement: extern alias aliasX;
- In questo caso si accederà ai tipi in conflitto con la notazione aliasX.namespace.type oppure aliasX::namespace.type
- :: è definito alias namespace qualifiers, se utilizzato con la notazione global:: identifica il namespace globale, viene usato per risolvere particolari tipi di conflitti tra i nomi
- Ad esempio namespace1.Class1 e global::namespace1.Class1 rappresentano la stessa classe
sabato 22 giugno 2013 23:28