Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
En gros, c'est une propriété qui prend des paramètres. Par exemple :
Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Private m_Scores As Dictionary(Of String, Integer) Public Property Score(ByVal playerName As String) As Integer Get Return m_Scores(playerName) End Get Set(ByVal Value As Integer) m_Scores(playerName) = Value End Set End Property
Et tu l'utilises comme ça :
Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Dim scoreDeJoe As Integer = toto.Score("Joe") ' Ou encore : game.Score("Joe") = 42
Bref... au final c'est un peu pareil qu'une méthode, sauf que tu peux aussi affecter une valeur
En C# on peut créer des indexeurs, mais seulement sur le type lui même :
Et on l'utilise comme ça :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 private Dictionary<string, int> _scores; public int this[string playerName] { get { return _scores[playerName]; } set { _scores[playerName] = value; } }
En gros, c'est une méthode qui renvoie un IEnumerable<T>, sans passer par une collection intermédiaire (donc pas besoin d'avoir fini de générer les résultats pour commencer à les lire). Un exemple bidon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int scoreDeJoe = toto["Joe"]; toto["Joe"] = 42;
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public IEnumerable<int> Fibonacci() { int a = 0; int b = 1; while(true) { yield return a; int tmp = a + b; a = b; b = tmp; } }
Le compilateur transforme ce code en une implémentation de IEnumerator<int>, avec une machine à états.
C'est utilisé un peu partout dans Linq... par exemple, la méthode Where doit être un truc comme ça :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) { foreach(T item in source) { if (predicate(item)) yield return item; } }
La méthode Select :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector) { foreach(T item in source) { yield return selector(item); } }
Un des aspects intéressants de cette technique est que l'exécution du code de l'itérateur ne se fait que quand tu commence à l'énumérer. En gros, si tu fais juste ça :
Ca n'exécute rien (à part affecter un objet à la variable). La méthode Fibonacci ne s'exécute au fur et à mesure que tu lis la séquence fibonacciNumbers.
Code : Sélectionner tout - Visualiser dans une fenêtre à part var fibonacciNumbers = Fibonacci();
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
donc les named indexers c'est les propriétés comme item du datareader ou controls de control si j'ai bien suivi
et le yield qui n'existe pas en vb servirait à faire des créer IEnumerable "non synchrone"
et les ienumerable du framework sont quand meme "asynchrone" en vb.net malgré le fait qu'on puisse pas en écrire ?
parce que je suis parti de ce principe là, j'ai des conditions qui se rajoute avant de les parcourir ...
C'est ça. En fait Item n'est une "vraie" propriété, c'est le nom donné en VB.NET à l'indexeur du type (qui s'exprime par this[string name] en C#)
Ben en fait c'est pas une histoire de synchrone/asynchrone, dans le sens où tout se passe sur le même thread. C'est juste que le code de l'itérateur va en fait se retrouver dans un IEnumerator<T>, qui ne sera récupéré et parcouru que lorsqu'on va énumérer la séquence avec foreach (ou autre)
Pas de questions techniques par MP ! Le forum est là pour ça...
Tutoriels : Les nouveautés de C# 6 - Accès aux données avec Dapper - Extraction de données de pages web à l'aide de HTML Agility Pack - La sérialisation XML avec .NET (Aller plus loin) - Les markup extensions en WPF
Partager