Les nouvelles caractéristiques du langage C#

Le langage C# est influencé par les langages C++ et Java dont les caractéristiques sont l'encapsulation l'héritage et la polymorphisme, des langages orientés objet. Ils sont tous avec un ramasse-miettes (garbage collector). 

Le langage C# évolue alors qu'elles sont ses caractéristiques car il est bon de regarder cela de temps en temps ?

La dernière version est : 10.0, sortie le 8 novembre 2021. 

Il s'agit ici pour les experts de faire un tour rapide du C#, j'ai l'habitude de changer souvent de langage de programmation, je souhaite acquérir rapidement les derniers éléments caractéristiques du langage C#.

Règles de Nommage

Que dire de nouveau ? Rien que du vieux.

un grand "T" pour les types

utilisez T pour les type génériques

Expression lambda 

Func<int, int> square = x => x * x;

Type nullable

Exemple bool? peut prendre les trois valeurs true, false ou null. 

Le type nullable est une déclaration d'intention cela signifie que le déclarant à l'intention d'utiliser la valeur nulle dans cette variable.

Le Type sous-jacent est Nullable<T> ou T? avec deux propriétés :

Nullable<T>.HasValue

Nullable<T>.Value

On peut écrire :

int? c = 7;

if (c != null)
{
    Console.WriteLine($"c is {c.Value}");
}
else
{
    Console.WriteLine("c does not have a value");
}

ou 

if (c.HasValue)
{
    Console.WriteLine($"c is {c.Value}");
}
else
{
    Console.WriteLine("c does not have a value");
}

Utilisation du Type nullable

int? a = 28;
int b = a ?? -1;
Console.WriteLine($"b is {b}");  // output: b is 28

int? c = null;
int d = c ?? -1;
Console.WriteLine($"d is {d}");  // output: d is -1

int? a = 10;
int? b = null;
int? c = 10;

a++;        // a is 11
a = a * c;  // a is 110
a = a + b;  // a is null

Class or Struct ?

Telle est la question et la réponse n'est pas simple ! 

La Struct est un type de valeur alors que la Class est type de une référence une Struct ne peut pas hériter d'une autre Struct ou d'une Class, une Struct est scellée, elle ne peut pas avoir de membre abstrait (abstract) ou virtuel.

La Struct peut être nullable et se voir assigner une valeur nulle.

Struct ne doit être utilisé que lorsque vous êtes sûr que :

  • Il représente logiquement une valeur unique, comme les types primitifs (int, double, etc.).
  • Il est immuable.
  • Il ne doit pas être emballé (boxed) et déballé (un-boxed) fréquemment.

Dans tous les autres cas, vous devez définir vos types en tant que classes.

La Struct est allouée dans la Pile (Stack) alors qu'une Class est allouée dans le Tas (Heap) et elle est garbage collectée.

La Struct ne possède pas de constructeur par défaut (sans paramètre).

Delegate

On pensait en avoir fini avec les pointeurs de fonctions, voici les Delegate.

Un type Delegate est une définition de signature de méthode. Il vous permet de brancher une fonction sur la propriété d'une Class.

Il existe également le MulticastDelegate.

Les méthodes utilisées avec les Delegate sont Invoke() et BeginInvoke() / EndInvoke

public delegate void Action<in T>(T obj);

Exemple de delegate déclaré explicitement :

delegate void DisplayMessage(string message);

public class TestCustomDelegate
{
   public static void Main()
   {
      DisplayMessage messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");
   }

   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

Que l'on peut écrire plus simplement en utilisant Action (implicite) :

public class TestAction1
{
   public static void Main()
   {
      Action<string> messageTarget;

      if (Environment.GetCommandLineArgs().Length > 1)
         messageTarget = ShowWindowsMessage;
      else
         messageTarget = Console.WriteLine;

      messageTarget("Hello, World!");
   }
   private static void ShowWindowsMessage(string message)
   {
      MessageBox.Show(message);
   }
}

Nouveauté de C# 10

Maintenant les Struct peuvent avoir un constructeur sans paramètre et on peut initialiser un champ dans ce constructeur. Il aura fallut attendre C# 10 !

Directive using global pour indiquer au compilateur que la directive s'applique à tous les fichiers source du projet.


Aucun commentaire:

Enregistrer un commentaire

Pour plus d'interactivité, n'hésitez pas à laisser votre commentaire.