1473 votes

Fonctions cachées de C# ?

Cela m'est venu à l'esprit après avoir appris ce qui suit de la part de cette question :

where T : struct

Nous, développeurs C#, connaissons tous les bases de C#. Je veux dire les déclarations, les conditionnels, les boucles, les opérateurs, etc.

Certains d'entre nous ont même maîtrisé des trucs comme Génériques , types anonymes , lambdas , LINQ , ...

Mais quelles sont les fonctionnalités ou les astuces les plus cachées de C# que même les fans, les accros et les experts de C# connaissent à peine ?

Voici les caractéristiques révélées jusqu'à présent :

Mots clés

Attributs

Syntaxe

  • ?? (coalesce nulls) opérateur par kokos
  • Nombre de drapeaux par Nick Berardi
  • where T:new par Lars Mæhlum
  • Génériques implicites par Keith
  • Lambdas à un paramètre par Keith
  • Propriétés automobiles par Keith
  • Les alias de l'espace de nommage par Keith
  • Les chaînes littérales verbatim avec @ par Patrick
  • enum valeurs par lfoust
  • @variablenames par marxidad
  • event opérateurs par marxidad
  • Format de la chaîne de caractères entre crochets par Portman
  • Modificateurs d'accessibilité des accesseurs de propriétés par xanadont
  • Opérateur conditionnel (ternaire) ( ?: ) par JasonS
  • checked et unchecked opérateurs par Binoj Antony
  • implicit and explicit opérateurs par Flory

Caractéristiques de la langue

Fonctionnalités de Visual Studio

Cadre de travail

Méthodes et propriétés

  • String.IsNullOrEmpty() méthode par KiwiBastard
  • List.ForEach() méthode par KiwiBastard
  • BeginInvoke() , EndInvoke() méthodes par Will Dean
  • Nullable<T>.HasValue et Nullable<T>.Value propriétés par Rismo
  • GetValueOrDefault méthode par John Sheehan

Conseils et astuces

  • Méthode agréable pour les gestionnaires d'événements par Andreas H.R. Nilsson
  • Comparaisons en majuscules par John
  • Accéder aux types anonymes sans réflexion par dp
  • Un moyen rapide d'instancier paresseusement les propriétés de la collection en Will
  • Fonctions inline anonymes de type JavaScript par acide rostéronique

Autre

751voto

ageektrapped Points 7815

Ce n'est pas C# en soi, mais je n'ai vu personne qui utilise vraiment System.IO.Path.Combine() dans la mesure où ils le devraient. En fait, l'ensemble de la classe Path est vraiment utile, mais personne ne l'utilise !

Je suis prêt à parier que chaque application de production a le code suivant, même si elle ne devrait pas :

string path = dir + "\\" + fileName;

583voto

chakrit Points 29562

lambdas et inférence de type sont sous-estimés. Les lambdas peuvent avoir plusieurs déclarations et ils double en tant qu'objet délégué compatible automatiquement (il suffit de s'assurer que la signature correspond) comme dans :

Console.CancelKeyPress +=
    (sender, e) => {
        Console.WriteLine("CTRL+C detected!\n");
        e.Cancel = true;
    };

Notez que je n'ai pas de new CancellationEventHandler et je ne dois pas non plus spécifier les types de sender et e ils sont déductibles de l'événement. C'est pourquoi c'est moins lourd que d'écrire l'ensemble de l'événement. delegate (blah blah) qui vous oblige également à spécifier les types de paramètres.

Les lambdas n'ont pas besoin de retourner quoi que ce soit. et l'inférence de type est extrêmement puissante dans un contexte comme celui-ci.

Et BTW, vous pouvez toujours retourner Des lambdas qui font des lambdas dans le sens de la programmation fonctionnelle. Par exemple, voici un lambda qui fait un lambda qui gère un événement Button.Click :

Func<int, int, EventHandler> makeHandler =
    (dx, dy) => (sender, e) => {
        var btn = (Button) sender;
        btn.Top += dy;
        btn.Left += dx;
    };

btnUp.Click += makeHandler(0, -1);
btnDown.Click += makeHandler(0, 1);
btnLeft.Click += makeHandler(-1, 0);
btnRight.Click += makeHandler(1, 0);

Notez le chaînage : (dx, dy) => (sender, e) =>

Voilà pourquoi je suis heureux d'avoir suivi le cours de programmation fonctionnelle :-)

En dehors des pointeurs en C, je pense que c'est l'autre chose fondamentale que vous devriez apprendre :-)

527voto

jfs Points 13605

De Rick Strahl :

Vous pouvez enchaîner l'opérateur ? ? afin de faire un tas de comparaisons nulles.

string result = value1 ?? value2 ?? value3 ?? String.Empty;

453voto

BlackTigerX Points 3569

Génériques aliasés :

using ASimpleName = Dictionary<string, Dictionary<string, List<string>>>;

Il vous permet d'utiliser ASimpleName au lieu de Dictionary<string, Dictionary<string, List<string>>> .

Utilisez-le lorsque vous utilisez la même chose générique, longue et complexe, dans de nombreux endroits.

437voto

jfs Points 13605

De CLR via C# :

Lorsque vous normalisez des chaînes de caractères, il est fortement recommandé d'utiliser ToUpperInvariant plutôt que ToLowerInvariant car Microsoft a optimisé le code pour effectuer comparaisons en majuscules .

Je me souviens d'une fois où mon collègue changeait toujours les chaînes de caractères en majuscules avant de les comparer. Je me suis toujours demandé pourquoi il faisait cela, car j'ai l'impression qu'il est plus "naturel" de passer d'abord en minuscules. Après avoir lu le livre, je sais maintenant pourquoi.

254 votes

Lorsque vous "convertissez une chaîne en majuscules", vous créez un deuxième objet chaîne temporaire. Je pensais que ce type de comparaison n'était pas préférable, que la meilleure façon était : String.Equals(stringA, stringB, StringComparison.CurrentCultureIgnoreCase) qui ne crée pas du tout cette chaîne temporaire.

32 votes

Quel type d'optimisation pouvez-vous effectuer sur la comparaison de chaînes de caractères en majuscules qui ne peut pas être effectuée sur des chaînes de caractères en minuscules ? Je ne comprends pas pourquoi l'une serait plus optimale que l'autre.

1 votes

J'ai fait un test rapide. J'ai comparé "XXX" à "XxX" 1 million de fois, de trois façons (pas de conversion, invariant et string.Equals). Voici les résultats : Test sans conversion : 0 correspondance en 1 ms Test de correspondance invariante : 100000 correspondances en 23 ms string.Equals Match Test : 100000 résultats en 8 ms

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X