다음을 통해 공유


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

  • Anonymous
    July 22, 2007
    Une question de Visibilité ? Quand on l'appelle, il permettrait de cacher une méthode surchargée pour utiliser la standard ?

  • Anonymous
    July 22, 2007
    Cela permet de choisir entre différents opérateurs de query

  • Anonymous
    July 22, 2007
    Je ne réponds pas pour l'instant... Je passe mes journées là-dessus, ce serait de la triche :p

  • Anonymous
    July 22, 2007
    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.

  • Anonymous
    July 22, 2007
    c'ets une méthode d'extension , non ? c'est à dire sur tout type qui implémentarea IEnumerable<Source>, je pourrai invoquer "AsEnumerable()"

  • Anonymous
    July 23, 2007
    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>

  • Anonymous
    July 23, 2007
    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().

  • Anonymous
    July 23, 2007
    Pas mal. D'autres suggestions ?

  • Anonymous
    July 23, 2007
    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? ^^

  • Anonymous
    July 23, 2007
    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>.

  • Anonymous
    July 24, 2007
    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.

  • Anonymous
    July 24, 2007
    Houlà, y'a des phrases, j'arrive même pas à les comprendre ! Je donne juste un indice : Exécution différée

  • Anonymous
    July 24, 2007
    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.

  • Anonymous
    July 24, 2007
    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 ^^)

  • Anonymous
    July 24, 2007
    The comment has been removed

  • Anonymous
    July 24, 2007
    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 :) )

  • Anonymous
    July 24, 2007
    RE : Geek quizzz! (part 1)

  • Anonymous
    July 24, 2007
    Allez, voilà la réponse : http://www.simonferquel.net/blog/archive/2007/07/25/re--geek-quizzz-part-1.aspx

  • Anonymous
    July 24, 2007
    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.

  • Anonymous
    July 24, 2007
    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 ! :-(

  • Anonymous
    July 25, 2007
    Réponse au post: http://blogs.msdn.com/mitsufu/archive/2007/07/23/geek-quizz.aspx Alors, alors..., le

  • Anonymous
    July 25, 2007
    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