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.


Comment passer mon site en https ?

C'est toujours la même chose, on croit prendre assez de notes pour être capable de refaire une opération délicate comme le passage d'un site de http "normal" au https "sécurisé" et obligatoire aujourd'hui et puis lorsque l'on y revient, on se rend compte que l'on croyait en avoir fait assez mais ce n'est pas le cas.

J'avais bien écrit quelque chose dans : C# NET, je tape "ssl" dans la barre de recherche :

C# .NET - SSL

Je trouve un article sur la possibilité de générer un certificat ssl par OpenSSL mais ce n'est que du localhost pour une plateforme Angular en Débug.

C# NET - IdentityServer4 Client Angular comment passer de Http à Https

Pour le reste, il me semble bien que je n'aie plus rien. Alors si, je me rappelle avoir été obligé d'acheter un certificat SSL auprès de l'hébergeur de mon site mais j'ai laissé passer la dernière relance, où il me demandait environ 25 euros/an pour ce certificat !

C'est un comble, le fournisseur qui vous donne un nom de site vous demande de l'argent pour certifier votre site. Je crois bien que c'est cela qui m'a poussé à vouloir trouver une alternative.

Pour vérifiez votre certification SSL

Il y a un site pour vérifier votre certification :  

SSL Server Test (Powered by Qualys SSL Labs)

Je vérifie que ma certification SSL est bien expirée !

Me voici donc dans un peu de lecture :

angle web - Sécurisez votre site Web en HTTPS
Cela me semble bien complet, il détaille les différents hébergeurs, leurs façons de procéder pour vous fournir la certification SSL. OVH c'est une option de l'hébergement (le plus pratique il suffit de cocher une case).

Digital Guide - IONOS Le rôle des certificats SSL

Et du coup me voilà en train de renouveler mon certificat SSL pour mon nom de domaine tout un patacaisse qui commence ici :

https://www.namebay.com/cert/CSR/IIS7/index.htm

Et qui va se terminer en allant installer ce que l'hébergeur m’envoie par email ... Donc il n'y a pas de miracle c'est vraiment une affaire de professionnels.

Gestion des certificats https avec IIS

Voici deux copies d'écran de mon Serveur IIS, pour nous rappeler que les certificats sont gérer à la racine du serveur de IIS :

Gestion des certificats https avec IIS
Gestion des certificats SSL https avec IIS

En cliquant sur l'icône Server Certifcats, vous obtenez la liste des certificats installés sur votre Serveur IIS :

Gestion des certificats SSL https avec IIS
Gestion des certificats SSL https avec IIS

En sélectionnant un des certificats SSL dans la liste des certificats installés, vous obtenez une série de d'actions possible sur la droite :

  • View ...
  • Export ...
  • Renew...
  • Remove...

En cliquant, colonne de droite, sur la fonctionnalité Renew ... de mon certificat SSL :

Renew My certificat SSL - avec IIS
Renew My certificat SSL - avec IIS

Vous avez encore trois choix possibles, vous allez pouvoir renouveler votre certificat d'après le certificat du domaine si vous avez acheté un certificat de domaine ... environ 400 € / an ! 

Voilà Internet est maintenant réservé aux professionnels qui doivent y gagner beaucoup d'argent pour faire certifier leurs serveurs. 

Sinon, j'essaye de reprendre avec Let's Encrypt ...

Let's Encrypt pour obtenir un certificat SSL

Il me semblait bien pourtant dans ma mémoire profonde que par Let's Encrypt, j'étais arrivé à un résultat non nul.

Let's Encrypt pour vos certificats SSL Gratuit
Autorité de certification à but non lucratif

Mais la certification en passant par Let's Encrypt est très fastidieuse, il faut exécuter des Scripts Shell sur votre serveur et vous plonger au cœur de la certification. 

Mais je n'ai plus le temps de jouer, ils ont malheureusement gagné.

Au passage, il me faudra quand même faire tout un tas d'aller-retour par email, entre mon hébergeur l'organisme de certification ... pour approuver à chaque étape.

Certificats SSL GlobalSign
Certificats SSL GlobalSign

Le tout pour une facture de 31,5 Euros TTC/an ! 

Mais il existe tout une série de type de certificats, par exemple chez namebay - Certificats SSL

Certains certificats SSL sont infiniment chers ~399 €/an !!!

Voilà depuis longtemps déjà les dérives d'Internet même à l’accélération d'un monde consumériste. La massification de l'Internet créée les conditions de l'avènement des Trolls.

Sinon, j'ai retrouvé par miracle un vieil article sur le sujet qui donne LA Solution : 

ASP.NET C# - IIS Certificate Management - Comment installer un certificat SSL sur mon Site Web derrière IIS ?

WPF avec .NET Core et .NET Framework

Je cherche à créer un projet WPF (Windows Presentation Foundation) et Visual Studio Community 2019. Que puis-je instancier comme applications WPF sur quel type de .NET Framework ?

Avec Visual Studio Community 2019 le choix des templates d'applications à bien changé (dans la forme ) :

Visual Studio - Template d'applications

Je peux créer une application WPF soit avec .NET Framework soit avec .NET Core. Mais je peux également créer une Application de Navigateur avec .NET Framework :

Visual Studio - Template d'application de Navigateur

Cela me fait penser aux vieilles applications XBAP en WPF pour le navigateur qui ne fonctionnaient que sur Internet Explorer, IE comme on l'appelait à l'époque.

Je vous laisse de côté le Visual Basic, ce serait bien stupide de vouloir développer aujourd'hui en Visual Basic. Sacré Bilou, il aura fallut qu'il continue de nous gonfler avec son foutu langage Visual Basic qui lui survivra ...

Si j'instancie une Application de Navigateur WPF et que je clique sur "run" :

Visual Studio - Application de Navigateur XBAP

Il s'agit bien d'un fichier XBAP qui essaye de se télécharger dans mon navigateur. Mais j'essaye d'éxécuter mon application, je trouve ce commentaire :

As far as I know, the browsers Edge doesn't support it. The XBAPs are intended to be used in intranet scenarios where all users use Internet Explorer. And many settings (such as security) are associated with IE. So, when you run it by other browser, it may have some issues.

Alors laissons cela de côté pour reprendre les Applications WPF pour le poste.

D'une part, j'ai une application WpfAppCore1 avec .NET Core :

WPF application with .NET Core
WPF Application with .NET Core

Et de l'autre, j'ai la même application mais avec comme Référence .NET framework :

WPF application with .NET Framework

Quelles autres différences entre WPF .NET Framework et WPF .NET Core :

Il y a un fichier App.config dans .NET Framework, pas dans .NET Core

Dans les csproj de .NET Core :

<TargetFramework>netcoreapp3.1</TargetFramework>
<UseWPF>
true</UseWPF>

Et dans celui de .NET Framework :

<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>

Comparaison des deux instanciation d'application WPF :

Compare WPF .NET Framework vs WPF .NET Core
Différences entre WPF .NET Core et WPF .NET Framework

Ce que Microsoft nous prédit, c'est l'abandon de .NET Framework au profit de .NET Core ou .NET x.x. .NET Core est multiplateforme et open source disponible sur GitHub :

dotnet/wpf

Mais il y a pourtant encore des technologies disponibles avec .NET Framework qui ne le sont pas avec .NET Core :

  • La communication à distance identifiée comme une architecture problématique
  • Le sandboxing
  • Workflow Foundation
  • L'enregistrement des assemblys générés par réflexion
  • Les blocs de scripts XSLT

.NET Core est porté sur plusieurs plateformes .NET Framework n'est que sur Windows.

Si vous souhaitez effectuer une migration de .NET Framework vers .NET Core :

Microsoft - Migration d’applications WPF vers .NET Core

Tous ceux qui pensent encore que ce n'est pas possible de faire du WPF sur .NET Core vont devoir mettre à jour leur copie et moi le premier (mais c'était il y a longtemps). En effet .NET Core c'était ASP.NET Core (Web only).

Aujourd'hui .NET Core devient .NET 5.0 ... 6.0 .... etc

Pour tenter de comprendre les différentes version des frameworks de Microsoft vous pouvez regarder ici :

Blog .NET - Comprendre .NET Standard en 5 min

Alors en 5 minutes certainement pas, il faut bien plus de temps pour arriver en bas de cette page et franchement je n'ai pas tout compris.

Je viens d'instancier une Application WPF avec la dernière mise à jour de Visual Studio Community 2019 et dans le fichier .cproj je trouve :

<TargetFramework>net5.0-windows</TargetFramework>

Voilà, on vient de voir les trois types d'application WPF que l'on peut instancier avec Visual Studio Community 2019 et les différences qu'il y a entre .NET Framework et .NET Core.