• [^] # Re: C# n'est pas un langage à typage fort !

    Posté par . En réponse à la dépêche Mono 2.0 : le singe continue ses grimaces. Évalué à 6.

    En fait, C# c'est pas totalement différent de C# 2, et il est très facile de faire retrouver ses petits à un programmeur C# 2 en lui expliquant trois choses.

    Trois choses c'est pas si énorme.

    La première c'est l'inférence de type. Ce n'est qu'un de laisser le compilateur définir le type la variable. Plutôt que de l'écrire soit même. Entre:

    Dictionary<string, object> d = new Dictionary<string, object> ();

    et

    var cache = new Dictionary<string, object> ();

    Je sais ce que je préfère. En plus ça force souvent le programmeur à mieux nommer sa variable, pour mieux refléter son but.

    La seconde c'est les méthodes d'extensions. Attention, encore une fois, ce n'est que du sucre syntaxique. Ce sont des simples méthodes statiques, que le compilateur peut appeler comme des méthodes d'instance. Les mêmes règles s'appliquent qu'avant.

    Mais au lieu d'écrire:

    byte [] b = ...;
    int c = Utilities.ReadCompressed (b, pos);

    On peut écrire:

    byte [] b = ...
    int c = bytes.ReadCompressed (pos)

    Pour peut que l'on ait défini une méthode d'extension.

    Voilà, et la dernière chose, c'est que la syntaxe `from where select`, est en fait utilisé par le compilateur comme une suite d'appel à des méthodes d'extensions.

    Ainsi au lieu d'écrire:

    string [] args = ..;
    IEnumerable<string> big = args.Where (arg => arg.Length > 10).Select (arg => arg.ToUpper ());

    On peut écrire:

    string [] args = ...;
    IEnumerable<string> big = from a in args where arg.Length > 10 select arg.ToUpper ();

    Allez si, j'ai oublié une chose, la syntaxe des expressions lambdas en C# 3, qu'on peut expliquer à un programmeur C# 2 comme une méthode anonyme, plus simplement déclarée.

    Ainsi, dans l'exemple précédent, au lieu d'écrire:

    args.Where (delegate (string arg) { return arg.Length > 10; })

    J'ai écris:

    args.Where (arg => arg.Length > 10);

    Où on bénéficie de l'inférence de type.

    Voilà, c'était le post «Les nouveautés de C# 3 du point de vue pour le programmeur C# 2»

    Petite note personnelle, pour avoir passé plus de 6 mois à implémenter LINQ dans Mono, et pour avoir implémenter un provider LINQ, je peux dire que c'est un des composants les mieux pensés du framework .net, où tout s'emboîte vraiment logiquement.

    Il ne faut pas se focaliser par l'aspect soudainement non typé, ce n'est surtout pas du Visual Basic ou du JavaScript avec du Late-Binding. Et oui, C# s'oriente petit à petit, vers le fonctionnel. Il faut dire que ce n'est pas donné à tout le monde de programmer avec un langage fonctionnel, et que si ça permet d'ouvrir les masses au fonctionnel, je suis totalement pour le fait que ce soit partiel.