35 votes

Le langage C# comporte-t-il trop de fonctionnalités ?

C'est une discussion qui surgit de temps en temps dans notre équipe. Alors que certains ont rapidement appris les fonctionnalités de C# 3.0, d'autres s'en tiennent aux techniques classiques.

Certains n'utilisent jamais Linq, pensent que les expressions lambda sont déroutantes et que yield est "effrayant". Parfois, ils ont du mal à comprendre le code écrit par des personnes utilisant toutes les nouvelles fonctionnalités. Nous pouvons simplement dire qu'ils ne maîtrisent pas le langage et qu'ils devraient l'apprendre.

Mais à quel point l'apprentissage d'un langage de programmation moderne doit-il être difficile ? Tout le monde peut résoudre les problèmes, tout le monde a beaucoup d'autres problèmes à résoudre chaque jour que de se préoccuper de manières plus agréables de les mettre en œuvre. La formation des personnes n'est pas gratuite. D'un autre côté, les fonctionnalités du langage peuvent rendre les gens plus productifs et le code plus facile à maintenir.

Liste probablement incomplète des fonctionnalités de C#

  • classes, structs, types primitifs, tableaux, boxing, interfaces, héritage (abstrait, virtuel, new, sealed), propriétés, nullables
  • exceptions
  • génériques
  • filetage multiple, serrures
  • réflexion
  • délégués, événements, délégués anonymes
  • itérateurs
  • expressions lambda
  • méthodes d'extension
  • linq

La version 4 sera bientôt disponible et comprendra de nombreuses fonctionnalités supplémentaires.

Personnellement, j'aime presque toutes les fonctionnalités de C# et j'aime le code court et agréable que je peux écrire avec ce langage. Mais je n'ai pas besoin de l'apprendre à partir de zéro.

Je suis intéressé par votre opinion et votre expérience de l'apprentissage ou de l'enseignement du C#. Y a-t-il déjà trop de fonctionnalités ? Manque-t-il encore des fonctionnalités importantes ? Les fonctionnalités de la langue rendent-elles la langue plus facile à utiliser ou simplement plus difficile à apprendre ?

S'il vous plaît : Pas de réponses du type "La langue A est meilleure que la langue B parce que...".

25voto

Marc Gravell Points 482669

Oui, c'est un risque - et on en discute souvent. lot . On en arrive à un point où il est très difficile d'apprendre le C# à partir de rien. Heureusement, les choses se sont un peu stabilisées et les changements de langage entre C# 3.0 et C# 4.0 sont relativement mineurs.

En fait, j'ai récemment fait beaucoup de travail en essayant de réparer une Le problème des génériques dans les FC Dans le cadre de la correction, il se peut que le code revienne presque aux techniques du C# 1.2 (pas ou très peu de génériques). Ainsi, la plupart des problèmes peut être traitées avec les constructions linguistiques les plus simples. Le fait est que : à quel point cela devrait être difficile de faire quelque chose ?

Par exemple, les méthodes anonymes ajoutent un LOT d'avantages pour une complexité relativement faible. dynamic (4.0) en ajoute d'autres pour les scénarios d'interopérabilité COM. Les blocs d'itérateurs sont précieux pour le code de style LINQ...

Je vois beaucoup de questions sur les parties non triviales du C#, et je pense que j'aurais du mal à enseigner à un débutant todos de C# depuis le début. Des livres comme C# in Depth de Jon sont bons pour les personnes qui connaissent déjà les bases (au moins C# 1.2 ; idéalement un peu de C# 2.0) - mais ils ne sont pas vraiment conçus pour les débutants (je sais que Jon ne sera pas d'accord).

Une question délicate en effet. Heureusement, l'équipe C# a placé la barre (pour l'inclusion) très haut ; quelque chose de nouveau doit être très utile pour faire partie de la langue.

7voto

OregonGhost Points 16615

À mon avis, le C# n'a pas trop de fonctionnalités. Presque toutes les nouvelles fonctionnalités fantaisistes des versions 2.0 et 3.0 sont d'un usage quotidien pour moi et mes collègues, et même le gars de VB les a rapidement assimilées. Certaines des nouvelles fonctionnalités rendent l'apprentissage du langage encore plus facile, comme l'utilisation de lambdas en ligne au lieu de délégués, le mot-clé var et les initialisateurs d'objets, pour n'en citer que quelques-unes de C# 3.0 (il n'y a pas de C# 3.5, d'ailleurs, vous confondez avec .NET 3.5).

C# a été rendu simple dans la plupart des cas et les puissantes fonctionnalités sont toutes faciles à utiliser, contrairement à C++, où les concepteurs disent que vous pouvez faire absolument tout avec C++, mais ils ne mentionnent jamais que de nombreuses choses ont tendance à devenir une véritable douleur, ce qui se produit parce que C++ peut vraiment tout faire, y compris de nombreuses choses que la plupart des programmeurs utiliseront rarement, voire jamais. Le fait de tout supporter signifie que de nombreuses choses sont plus compliquées que nécessaire, ce qui rend l'apprentissage plus difficile. C'est la différence entre un langage où les fonctionnalités le rendent difficile à apprendre, mais très puissant, et un langage où les fonctionnalités le rendent plus facile à utiliser et améliorent la productivité, même s'il est moins puissant en théorie.

Et, en nombre pur de fonctionnalités, le C# est loin du C++, surtout si vous incluez le C++0x dans ce tableau, ce qui le rend plus facile à apprendre malgré le fait qu'il ait "trop de fonctionnalités" pour certaines personnes. Mon point de vue sur C++ était plutôt que C# n'a pas vraiment tant de fonctionnalités, si vous voulez.

5voto

Qwertie Points 5311

Lorsque je code en C#, j'utilise pratiquement toutes ses fonctionnalités. Pas toutes en même temps, mais chaque fonctionnalité de C# a sa place. Beaucoup de gens ne savent pas que le C# possède un opérateur ": :" et n'ont jamais entendu parler de " alias externe ", mais j'ai dû l'utiliser aujourd'hui pour résoudre un conflit de nom entre deux DLL.

Le "retour de rendement" est l'une de mes fonctions préférées. Je ne l'utilise pas tous les jours, mais j'avais l'habitude d'écrire des interfaces IEnumerator manuellement en C# 1.0 et c'était une énorme douleur que je ne voudrais pas répéter. De plus, c'est vraiment utile pour écrire coroutines même les coroutines qui ne produisent aucun résultat ( yield return null = interrompre l'opération).

Le C# dispose de fonctions internes et de fermetures. Lorsque je code en C++, elles me manquent cruellement.

Il semble stupide que le C# ait tant de façons différentes d'écrire une fonction interne,

  1. delegate(int x) { return x*x; }
  2. x => x*x
  3. (int x) => { return x*x; }

Mais le numéro 1 ne l'est que pour des raisons historiques et les formes 2 et 3 ont chacune leur place.

Qu'il s'agisse de méthodes d'extension, de surcharge d'opérateurs, de génériques, de contraintes génériques, de paramètres par défaut, de null coalescing, de l'opérateur ternaire, de constructeurs statiques, de vérifié/non vérifié, de propriétés automatiques, de directives de préprocesseur, de types de valeur... en tant que programmeur à plein temps, j'utilise tout cela au moins occasionnellement, et l'élimination de l'une ou l'autre de ces fonctionnalités me crée un surcroît de travail et d'ennuis ( foo(x) ?? bar(y) doit maintenant être écrit { var temp = foo(x); if (temp == null) temp = bar(y) } ), ou m'oblige à écrire un code plus gros/plus lent (par exemple, si vous remplacez les types de valeurs par des classes, une partie de mon code sera ralentie et l'utilisation de la mémoire augmentera considérablement).

Loin d'avoir trop de fonctionnalités, je pense qu'il n'en a pas assez. Chaque fois que je dois écrire un code similaire encore et encore et encore, je maudis le langage pour ne pas avoir de raccourci.

L'astuce consiste à faire en sorte que les programmeurs qui ne travaillent pas à plein temps puissent comprendre. (Quant aux personnes qui programment en C# à plein temps et qui ne parviennent toujours pas à apprendre le langage, hum, les licencier ?) Il aurait été utile que Microsoft rende les fonctionnalités plus "Googlables" ou au moins "F1-ables". Par exemple, lorsque je place le curseur sur " ??" ou "=>" et que j'appuie sur F1, je devrais obtenir une page d'aide pour ces opérateurs. Prenons par exemple les constructeurs statiques : si le code indiquait "static constructor()" au lieu de "static MyClassName()", il serait plus facile de le rechercher sur le Web.

À mon avis, le problème le plus grave est celui du framework. Le cadre .NET est gigantesque, et Microsoft réimplémente les mêmes choses à plusieurs reprises, en créant à chaque fois des conceptions gonflées et défectueuses : WinForms et WPF, les différentes manières d'accéder à une base de données, etc.

2voto

0xA3 Points 73439

Vous devriez probablement lire cet article de blog par Eric Gunnerson, membre de l'équipe chargée du compilateur C# chez Microsoft.

Il explique comment les nouvelles fonctionnalités font leur chemin dans le langage. En gros, elles reçoivent "-100 points" au début, "ce qui signifie qu'elles doivent avoir un effet positif net significatif sur l'ensemble du paquet pour être intégrées dans la langue".

2voto

kjv Points 2513

Il y a en fait beaucoup de débats sur la façon dont C# devrait évoluer. En effet, certains considèrent qu'en ajoutant un grand nombre de nouvelles fonctionnalités, le langage devient trop difficile à apprendre, mais la plupart considèrent C# comme un langage de programmation multi-paradigme. Il s'agit tout d'abord d'un langage orienté objet complet et fortement typé, mais il possède des concepts qui, jusqu'à récemment, étaient réservés aux langages de programmation fonctionnels et dynamiques. Ces caractéristiques, bien qu'elles puissent sembler déroutantes pour un débutant, offrent beaucoup de flexibilité et de puissance, et parfois elles peuvent s'avérer suffisantes pour vous éviter d'utiliser un langage spécifique à un domaine dans l'application et de faire face à tous les problèmes d'intégration. Vous pouvez toujours discuter de ce qui devrait être implémenté dans le langage lui-même et de ce qui devrait faire partie du framework, mais gardez à l'esprit que la plupart des fonctionnalités que vous mentionnez et considérez comme superflues sont en fait le résultat des demandes des développeurs, et qu'elles fournissent des fonctionnalités qui distinguent C# d'autres langages (Java vient à l'esprit). Lorsqu'un programmeur s'habituera à ces fonctionnalités, il se rendra compte de leurs avantages.

Vous avez mentionné Linq, et je dois admettre que j'étais un peu sceptique au début, puisque j'ai toujours considéré SQL comme un langage naturel pour travailler avec des données, mais maintenant j'aime vraiment et je vois l'avantage d'avoir des requêtes évaluées au moment de la compilation. Les expressions lambda sont toujours agréables, elles peuvent en effet rendre le code difficile à lire si elles sont utilisées de manière excessive, mais parfois elles le simplifient réellement. Je ne suis pas un grand fan du mot-clé "var", mais il est parfois utile, et soyons honnêtes, ne pas l'utiliser pour écrire Linq rendrait le code difficile à lire. Je suis moi-même un programmeur débutant, et je ne pense pas qu'il soit difficile d'apprendre ces concepts. J'utilise également beaucoup Java à l'école, et certaines fonctionnalités de C# me manquent vraiment (je ne dis pas que Java est un mauvais langage, au contraire, à certains égards, je pense qu'il est meilleur que C# - contrats de code, surtout à des fins académiques).

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