(Vedi Re[studing] C# 5 - (WinRT))
  • 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
    1.         public void WhenCastFromLargeIntegerValueToFloatMagnituedIsPreversevedButBrecisionIsLost()
    2.         {
    3.             int i = 100000001;
    4.             float f = i;
    5.             Assert.AreNotEqual(i, (int) f);
    6.             Assert.AreEqual("100000000", ((int) f).ToString("0"));
    7.         }

  • 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

  • Operators table: C# Operators - VS 2012

  • 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