Affichage des articles dont le libellé est C#. Afficher tous les articles
Affichage des articles dont le libellé est C#. Afficher tous les articles

Comment savoir qu'elle version du C Sharp (C#) vous utilisez ?

Je suis avec Visual Studio 2022 Community, et je développe une application Blazor alors que je cherche à utiliser une bibliothèque JavaScript depuis mon Blazor je tombe sur une bizarrerie :

Visual Studio vous demande d'utiliser C# 11.0 ou une version ultérieure ?!!
Visual Studio vous demande d'utiliser C# 11.0 ou une version ultérieure ?!!

Mais du coup je voudrais savoir comment installer C# 11.0 ou découvrir comment savoir qu'elle version du C Sharp j'utilise.

La réponse est peu évidente, il faut aller lancer une commande au fin fond de l'install de votre Visual Studio :

>C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\Roslyn\csc.exe /langversion:?

Ce qui me donne le résultat suivant :

Commande pour savoir qu'elle version du CSharp vous utilisez
Commande pour savoir qu'elle version du CSharp vous utilisez

Avec une sourire je découvre que j'utiliser la version du CSharp (C#) 11.0.

Je retourne lire attentivement le message délivré par Visual Studio et je lis "version du langage 11.0 ou ultérieure" !? "ultérieur" me fais sourire. 

Mais maintenant je sais qu'elle version du Langage CSharp (C#) j'utilise.

Venez découvrir comment j'ai corrigé cette erreur : 

La fonctionnalité "littéraux de chaîne brute n'est pas disponible en C# 9.0. Utilisez la version de langage 11.0 ou une version ultérieure.

Dans :

GitHub - mabyre - My BlazingPizza

Have fun!

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.


10 des meilleurs Blog C# .NET

Vous cherchez les meilleurs informations, les lectures les plus appropriées les plus intéressantes sur le langage C# DotNET et tous ces dérivés. On va regarder ce que l'on peut faire.

J'ai longtemps écris des articles sur C# .NET et mon blog était référencé parmi les meilleurs en page 1 de googole et puis d'autre sont arrivés et bientôt je fus submergé et c'est bien normal. C'est la loi de
l'évolution quand un créneau est bon à prendre il faut être le premier.

Blog en C# .NET

Alors aujourd'hui pour être référencé correctement avec C#.NET, il faut vraiment écrire beaucoup et je n'ai plus le temps alors je regarde ce que les autres écrivent. Et c'est intéressant finalement.

Je remarque une technique en référencement qui consiste à trier les meilleurs Blogs C# .NET et en parler dans un article avec des liens sur chacun des blogs.

Developpez.net - Les meilleurs blogs sur C#
Ils sont carrément chauvins que des blogs sur le site Développez.net. Ils proposent avent tout les blogs qui sont héberger sur Développez.net d'autre sont directement des blogs Microsoft ! Que du lourd pas de place pour les petits.

dotnetdojo - Top 20 des blogs Dotnet
C'est la technique de référencement qui est employée ici faire part des 10 blogs .NET C# qu'il préfère ou qu'il trouve en tête de recherche dans les moteurs. C'est un blog assez fort qui prend le développement logiciel au sérieux par exemple avec cet article : Les 10 premiers principes

Et je le remercie de référencer mon propre blog qui est classé dans ce top 20 c'est assez gratifiant je dois dire.

Puis, quand on cherche à lire sur le C# .NET, on tombe forcément sur les blogs de Microsoft :

Visual S# Archives | .NET Blog

Visual S# Archives | .NET Blog
Le souci chez Microsoft c'est qu'ils changent souvent leurs liens et vous vous retrouve avec des liens cassés ou pire qui pointent vers tout autre chose.

Et maintenant Le Roi, the King of C# .NET : SCOTT HANSELMAN
Le plus gros publicateur d'informations intéressantes sur C#.NET (peut être trop !)

Le King in French : Blog .NET de Thomas Levesque
Je suis triste en allant visiter son blog on peut constater qu'en Français c'est fini il ne publiera plus car en anglais, il est 20 fois plus visité (c'est vrai c'est incontournable).

Petit mise à jour, moi j'ai continué de publier en Français pour C# .NET car maintenant ce sont les moyens de traduction qui se sont terriblement améliorés. Ici même tout en haut vous pouvez choisir la langue et pas seulement l'anglais.

En anglais donc : Thomas Levesque's .NET blog

Et il en a un que je ne connaissais pas mais que j'ai trouvé très pertinent des articles très approfondis C'est : Mathias Montantin : Blog .NET

En plus, je tombe sur LE SUJET du moment pour tous les architectes DotNET : Architecture en Microservices en 10 min

Alors voilà, je ferai ça plus souvent : plutôt regarder et lire ce que les autres font que d'écrire moi même des articles.

Pour me ressourcer,

Qu'elles nouveautés pour le langage C# 8.0 ?

Bientôt la prochaine version majeur du langage C# la version 8.0 alors qu'est ce qu'il y a dedans ? Suivez-moi, on va regarder cela de plus prêt très rapidement.

Déjà, on nous prédit une nouvelle version ; Visual Studio 2019, une version tous les deux ans, la roadmap ou le plan d'action est respectée. Ce Visual Studio 2019 veut t-il vraiment le coup ?

Développez.com - Visual Studio 2019

Vous pouvez voir le design de la nouvelle icône ... bientôt chez vous Visual Studio 2019.

Design de Visual Studio 2019

Pour la livraison de C# 8.0 dans Visual Studio 2019 Microsoft veut livrer le tout avec .NET Core 3.0, on est prévenu mais du coup l'année va être courte !

Fonctionnalités de C# 8.0

Types Nullables

Introduction aux Types Nullables

Donc en C# 8.0
string s = null; // Warning: Assignment of null to non-nullable reference type

Il faut écrire :
string? s = null; // Ok

Flux asynchrones

Microsoft introduit IAsyncEnumerable<T>, qui est une version asynchrone de IEnumerable<T>.

async IAsyncEnumerable<int> GetBigResultsAsync()
{
    await foreach (var result in GetResultsAsync())
    {
        if (result > 20) yield return result;
    }
}

Range et Index

Création du type Index utilisé pour l’indexation permet de compter depuis le début, ou avec un le préfixe ^ permet de compter depuis la fin.

Index i1 = 3;  // number 3 from beginning
Index i2 = ^4; // number 4 from end
int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Console.WriteLine($"{a[i1]}, {a[i2]}"); // "3, 6"

Autres Fonctionnalités à étudier

Default implementations of interface members
Recursive patterns
Switch expressions
Target-typed new-expressions
Platform dependencies

Je vous laisse le soin d'aller plus loin sur la page suivante : Nouvelles fonctionnalités de C# 8.0

GitHub - DotNET - CSharp lang wiki - vNext - Preview

Ici on vous donne la possibilité "d'installer" C# 8.0  "au dessus" de Visual Studio 2017 15.5 - 15.7

Voilà c'est vraiment rapide, c'est pour prendre note du travail que va nous donner cette nouvelle version de Visual Studio 2019.

Pour voir les réelles fonctionnalités de cette nouvelle version, il faudra regarder ailleurs car sur cette page c'est tout ! 

La source se situe sur les blogs de Microsoft : Mads Building C# 8.0

Stay quite!

Coder une calculette en C#

Passer le test de la Calculette en C#.NET, on vous a déjà fait le coup ? Pour un recrutement, un poste de développeur, on vous demande d'écrire un programme en C# avec Visual Studio qui fonctionnera comme la calculatrice de Windows. C'est ici !

Coder une Calculatrice Windows en C# - C'est le test de la calculette

Alors permettez que je vous présente ma solution.

Ce code source fonctionne avec toute version de Visual Studio mais cette solution a été développée avec Visual Studio Community 2017.

Visual Studio Community 20017

Cahier des charges de la Calculatrice en C#

On va d'abord se fixer quelques limites dans un mini cahier des charges.

Présentation du projet

Il s’agit d'écrire un programme qui fasse la même chose que la Calculatrice livrée avec Windows, dans sa version "standard". On ne développera pas la version "calculatrice scientifique".

Pour simplifier encore un peu le développement

On ne développera pas le menu, ni l’aide, ni les fonctions suivantes : "Rac", "%", "1/x".
La calculatrice ressemblera donc à ceci :

Maquette de la Calculatrice Windows en C#

Et on va se fixer un temps limite développement du projet disons 4 heures.

Livraison du projet

Ecrire l'application comme s'il s'agissait d'une "vraie" application professionnelle, en vue d'être commercialisée.

Le code source de l'application doit être fourni, sous la forme d'un fichier .ZIP contenant le répertoire complet du projet C#.

Le projet en C#

Choix du Template de départ : Application Windows Forms (.NET Framework)
Donc on y a va, on fait : Ficher->Nouveau->Projet, on choisi :

Solution Visual Studio Calculette

Structure de la solution du projet :

Structure de la Solution Calculatrice

On verra que l'on va utiliser deux objets. La Form s'appelle FormCalculatrice et j'ai ajouté un petit fichier "readme.txt" ça fait plus pro. On peut y écrire par exemple l'historique du développement ou une ToDoList des chose qu'il reste à faire.

Conception Objet de la Calculatrice

On a besoin de deux objets, l'un pour effectuer le Calcul, l'autre pour gérer les fonctions Mémoires.

Objet Calcul

Vous trouverez les sources en bas de cet article, je ne vais donc pas trop détailler mais simplement on imagine que l'objet Calcul.cs prendra 3 états :

Les trois états de l'objet Calcul.cs

Objet Memoire ou Memory

Vous rappelez-vous à quoi servent les touches mémoires de la Calculatrice ?

MC : Memory Clear
MR : Memory Read
MS : Memory Save
M+ : Memory Add

Heureusement, j'avais un bon vieux Windows XP sous la main, il est vrai pour l'instant que l'aspect de cette calculatrice ressemble plus à celle de Windows XP qu'à celle de Windows 10... en tous les cas celle que j'ai sous Windows 7 ne me présente plus l'aide de la Calculette Windows et son aspect est très différent mais restons à nos moutons.

Il m'a suffit de faire "bouton droit" sur la touche et de Cliquer sur "Qu'est ce que c'est ?" pour obtenir la réponse :

Calculatrice en C# Trouver les fonctions mémoires

L'application Calculatrice m'affiche maintenant la réponse à quoi sert la touche "MC" :

Calculatrice fonctions mémoires

Voici l'aide correspondante à la touche "MC" de la Calculatrice. L'objet mémoire aura donc trois états :

Les trois états de l'objet Memory.cs

Conception de l'IHM

Aujourd'hui on dit UI ou UX bref, elle nous est donnée donc on copie au plus prêt :

Windows Forms de la Calculatrice

Il faut un outil de graphiste pour trouver la taille des boutons en pixels, je vous donne le résultat :
  • Width : 35
  • Height : 25

Programme principal de la Calculette

Pour la Testabilité & Evolution tous les boutons "chiffre" sont câblés sur la même gestion d'events :

buttonNumber_Click()

Tous les boutons "Operands" sont également câblés ainsi :

buttonOperand_Click()

On y gère l'état de l'objet "Calcul" qui passe de AquireOperand1 à BeginAquireOperand2

Enfin la gestion de l'events clique sur "Equal" qui exécute le calcul en utilisant l'Opérand1 et l'Opérande2 :

buttonEqual_Click()

Qui prend en compte le fonctionnement particulier de la Calculette comme par exemple lorsque le résultat du calcul précédent devient l'Opérande1 pour le calcul suivant.

Je vous laisse découvrir le reste des codes sources dans le .ZIP à télécharger à la fin de cet article.

Gestion des touches tapées au clavier dans la Calculette

La Calculatrice Windows est utilisable au clavier numérique pad et touches d'opérations. Pour faire la même chose dans notre Calculette nous allons cabler l'event KeyPress de la Form :

FormCalculatrice_KeyPress()

Code source de la fonction FormCalculatrice_KeyPress()

FormCalculatrice_KeyPress()

Astuce concernant la gestion des touches du clavier

Si vous en restez là, cela ne fonctionne pas. En effet il faut passer l'event à la Form sinon elle ne le gère pas. Pour ce faire il faut setter la propriété "KeyPreview" de la Form à True.

Pour gérer les événements clavier mettre à True la propriété KeyPreview

Conclusion

Voilà c'est fini ! En gros les grandes parties de ce petit projet "Test de la Calculette Windows". Qui n'est finalement pas si petit.

C'est vraiment désobligeant quand on vous demande d'effectuer ce genre de test pendant l'entretien d'embauche alors que vous avez une expérience comme la mienne en développement de logiciel.

Que même s'il existe un "mini" cahier des charges les pièges sont nombreux et vous ne manquerez pas de tomber dedans. Donc j'espère avoir cassé les pattes de ces recruteurs peu scrupuleux.

La prochaine fois nous verrons comment coder une calculette en WPF avec le modèle MVVM (Model View ViewModel) de Prims et l'utilisation d'un EventToCommand.

Ou peut-être que l'on choisira ASP.NET avec le modèle MVC (Model View Controller) pour en faire une application Web, ou bien en faire une application Multi-plateforme avec ASP.NET Core et Angular2.

Revenez nous voir.

Download calculator sources code

Here on github :


Here you can find Calculator sources code 

Download Source Code - Calculator in C#

Have fun! Don't forget to go to the beach!

Statistiques over years

2017 : 1826 visites
22/10/2018 : 2294
22/06/2019 : 3944 quel succès apparemment le sujet vous intéresse.
24/11/2020 : 7140 bientôt tout le monde saura coder une calculette.
17/11/2022 : 13302

En 2022, j'ai pu exécuter les sources sur ma machine Windows 10 avec Visual Studio Community 2019.

Cet article vous a plu vous a aidé dans votre pratique de développeur, surtout laissez-moi votre commentaire.

Même, juste un petit merci, would be please ;) 

Tutoriels C# - Remise en forme après les vacances

C'est encore l'été mais il faut bien rentrer de vacances, comment me remettre au travail tranquillement. Je lis différents articles et je tombe sur cette page que je trouve intéressante :

http://www.csharpstar.com/csharp-coding-interview-questions-part-1/

Un tuto plutôt tranquille mais Whaou que c'est dur de répondre à toutes ces questions qui sont à mon avis un peu dans le désordre. Je trouve qu'il n'y a pas de progression dans ces questions certaines dures d'autres faciles aussi je vais directement à la dernière page pour voir :

C# Interview Questions for Experienced professionals (Part – 9)

How do you generate a random number in C#?
The Random class is used to create random numbers in C#.

//Example:
Random r = new Random();
int n = r.Next();

C'est toujours la même fonction utilisée depuis les débuts de l'informatique et le Langage C ? La vraie question aurait plutôt été : Comment tester le caractère véritablement aléatoire de la fonction random()...
certainement en analysant son spectre.

Mais c'est une très bonne remise en forme après les vacances, ce site est vraiment très complet. Alors pour se rafraîchir en C#, je vous conseille :

http://www.csharpstar.com/
Questions et tutoriels en C#
Bonne lecture.

Langage C#

Mots clefs, astuces et autres particularités du langage C#.

Mots clefs du C#

using

L'utilisation de l'instruction using doit être vue comme un pattern en C#, un objet présent dans une instruction using doit dérivée d'une interface IDisposable. Ce qui nous obligera lors de la conception de codes propres à systématiquement écrire une fonction Dispose de nos objets et à y placer le code nécessaire lors de la destruction de cet objet :

http://www.dotnetdojo.com/instruction-indispensable-en-csharp-using-idisposable/

Pour les objets qui implémente la fonction Dispose, l'appel à MyObject.Dispose() est automatique ce qui est finalement pratique.

http://msdn.microsoft.com/fr-fr/library/yh598w02(v=vs.80).aspx

Le pattern est moins clair mais avec ces deux articles, on comprendra que l'utilisation de ce pattern permet l'écriture de code propre en se posant systématiquement la question de la destruction d'un objet. Car il est toujours préférable de libérer aussi tôt que possible les ressources limitées comme les handles de fichiers ou les connexions réseaux.

accessibilité des membres d'une classe, d'un assembli

public : l'accès n'est pas restreint.
protected : l'accès est limité à la classe conteneur ou aux types dérivés de la classe conteneur.
internal : l'accès est limité à l'assembly actuel.
protected internal : l'accès est limité à l'assembly actuel ou aux types dérivés de la classe conteneur.
private : l'accès est limité au type conteneur.

http://msdn.microsoft.com/fr-fr/library/ba0a1yw2(v=vs.80).aspx

problème : une class possède comme niveau d’accessibilité par défaut le niveau private et cela pose un problème car parfois le code généré reste ainsi inaccessible.
solution : pensez à mettre la class générée en public si vous avez besoin de l'utiliser.

static

Un membre de type static appartient au type lui même plutôt qu'à une instance de la classe. On y accède en utilisant le nom du type et non le nom de l'instance.

Exemple : Imaginons que nous ayons besoin de compter le nombre d'employés d'une entreprise :
public class Employee
{
  public string id;
  public string name;

  private static long employeeCounter = 0;
  public static long NbEmployes 
  {
    get { return employeeCounter ; }
  }

  public Employee()
  {
      employeeCounter += 1;
  }

  public Employee(string name, string id)
  {
      this.name = name;
      this.id = id;
      employeeCounter += 1;
  }
}

static void Main()
{
  Employee e = new Employee("Tara Strahan", "AF643G");

  // Display the Number of Employees
  Console.WriteLine("New Number of Employees: {0}", Employee.NbEmployes);
}

out

Passage par référence d'une variable n'ayant pas besoin de valeur initiale car c'est une variable de "sortie".

Types Nullables C#

Créé pour travailler avec des bases de données lorsque la donnée n'a pas de valeur affectée.

Opérateur ??

Exemples :
int? c = null;

// d = c, unless c is null, in which case d = -1.
int d = c ?? -1;
int? e = null;
// d = c or e, unless c and e are both null, in which case d = -1.
d = c ?? e ?? -1;

Accueil

Bonjour à vous, si vous visitez cette page,

Je travaille depuis très longtemps en développement d'application Microsoft et j'ai suivi l'évolution des langages ayant commencé en langage C pour des systèmes embarqués. J'ai viré à l'objet avec C++ que je trouvais trop permissif. Un petit détour par Java pour étudier les langages objets à fond et enfin arriva le C#.

J'ai écris de nombreux articles sur ASP.NET :
http://www.sodevlog.fr/asp.net.blog/

Sur mon serveur dédié c'est un peu cher et difficile à maintenir ...
Maintenant je m'intéresse à "l'architecture logicielle" depuis plus de deux ans.

Je note ici des idées des articles sur le développement C#, WPF, Silverlight et DotNET de façon plus générale.

Si je raconte des bêtises ou que vous n'êtes pas d'accord avec ce qui est écris surtout, surtout n'hésitez pas à ajouter votre propre commentaire.

Retrouvez moi sur le réseau social viadéo