Geek quizz !


Petite question amusante sur C# 3:


Le framework 3.5 apporte la méthode AsEnumerable. Quel est donc l’intérêt de ce code étrange !?!?


public static IEnumerable<TSource>
AsEnumerable
<TSource>(this IEnumerable<TSource> source)
{
return source;
}

J’attends vos suggestions en commentaires.


Mitsu


[Update] : Les méthodes d’extension de C# 3: réponse au quizz
[Update] Quizz suivant: Geek quizz II: comment stopper l’imbrication des expressions Linq to Sql ?

Comments (22)

  1. Erebuss says:

    Une question de Visibilité ?

    Quand on l’appelle, il permettrait de cacher une méthode surchargée pour utiliser la standard ?

  2. Cela permet de choisir entre différents opérateurs de query

  3. Simon says:

    Je ne réponds pas pour l’instant… Je passe mes journées là-dessus, ce serait de la triche :p

  4. Cela permet de réduire la visibilité. Exemple, on veut retourner une list sous la forme d’un IEnumerable à l’utilisateur pour qu’il ne puisse pas directement en modifier le contenu. Pour cela en 2.0, j’aurais retourné ma list castée en IEnumerable. Avec C#3.0, on peut directement appeler la méthode AsEnumerable() à la place du cast.

  5. Pierrick says:

    c’ets une méthode d’extension , non ?

    c’est à dire sur tout type qui implémentarea IEnumerable<Source>, je pourrai invoquer "AsEnumerable()"

  6. Désolé pour ma réponse précédente, elle est débile.

    3 excuses :

    je viens de passer une semaine sans coder à faire de la menuiserie, de l’électricité et de la plomberie

    j’ai dormi moins d’une demi-heure la nuit dernière

    j’ai répondu trop vite sans réfléchir.

    Bon ok, pas besoin d’excuses, j’ai répondu n’importe quoi. :S

    Pierrick : oui c’est exactement ça. Par contre si une classe qui implémente IEnumerable<Source> a défini la méthode AsEnumerable (sous la forme d’une extension method ou non), il faudra caster en IEnumerable<Source> pour appeler l’extension method définie sur IEnumerable<Source>

  7. Ce qui est sûr en revanche c’est que cette extension method a également été définie sur les DataTable pour LINQ to DataSet.

    Après avoir réfléchi au problème (c’est déjà mon troisième post :-)), je reviens sur l’idée du cast.

    Prenons un exemple :

    Soit l’extension method M1 défini sur IEnumerable<Source> et l’extension method M1 définie sur List<Source>. Si on veut appeler l’extension method de IEnumerable<Source> sur une instance de la List, il va falloir caster notre List en IEnumerabble. Avec la method AsEnumerable, on peut directement faire myList.AsEnumerable().M1().

  8. mitsu says:

    Pas mal.

    D’autres suggestions ?

  9. Simon says:

    C’est pas mal tout ca, mais ca ne répond pas à la question : quel est l’intérêt de cette méthode d’extension? ^^

  10. L’intérêt  c’est de povoir la redéfinir pour les classes implémentant IEnumerable<T> ou les interfaces héritant de IEnumerable<T>.

  11. Gabriel says:

    L’intérêt pourrait être lors d’une exécution distante d’empêcher l’appel de méthodes locales redéfinies afin d’utiliser les opérateurs standards.

  12. Simon says:

    Houlà, y’a des phrases, j’arrive même pas à les comprendre !

    Je donne juste un indice : Exécution différée

  13. Un des gros avantages des IEnumerable c’est de ne récupérer les éléments qu’un par un au moment où on en a besoin et pas tous en même temps. Du coup cela devient vite très intéressant dans le cadre des imbrications. Pour ceux qui n’en sont pas convaincus, cf le webcast de Mitsu C#2, un an après.

    De même une requête LINQ peut être stockée (dans une variable de type IEnumerable<T>).

    Si avant l’exécution réelle de celle-ci vous modifiez l’élément requêté (un IEnumerable pour LINQ to Object, un DataSet, une table SQL, etc), cette modification sera visible dans l’exécutuion de la requête.

    Voilà ça ne répond pas directement à la question (vraiment pas le temps d’y réfléchir là) mais je pense que, d’après l’indice de Simon, il faut chercher dans ce sens.

  14. Simon says:

    On s’approche petit à petit, un 2e indice: Linq va encore plus loin que C# 2.0 dans le domaine de l’éxécution différée (cf Mitsu, le même WebCast ^^)

  15. Azra says:

    Encore une cochonnerie a tester ça…

    Je vais le faire comment mon assert?

  16. Azra says:

    Désolé, oubliez ma réponse, elle est hors contexte, j’ai passé 3 jours a faire du repassage, passer le balais, changer les couches de ma fille et faire du VB… faut me comprendre! (moi aussi je peux raconter ma vie Matthieu 🙂 )

  17. RE : Geek quizzz! (part 1)

  18. Miiitch says:

    Ca me fait penser a l’opérateur ‘ (quote) que l’on trouve en lisp, et certains autres langages qui permettent de ‘stopper’ l’execution de code dans une expression.

  19. Florent : 3 jours à faire du VB ! Je te plaindrais bien mais moi ça fait 6 mois que je vis ce calvaire tous les jours pour un client qui n’a toujours pas compris, et c’est pas faute d’insister lourdement, que C# c’était mieux ! 🙁

  20. mitsu says:

    Des réponses intéressantes de tout le monde.

    Voici la mienne (en tout cas voici le point technique que je voulais mettre en avant) :

    http://blogs.msdn.com/mitsufu/archive/2007/07/24/les-m-thodes-d-extension-de-c-3-r-ponse-au-quizz.aspx

    …un seconde quizz va suivre très rapidement