3 votes

VB.NET - Existe-t-il un moyen d'utiliser des paramètres facultatifs dans les délégués ? (Ou des plans pour permettre cela ?)

Je crois savoir qu'il n'est pas possible d'avoir un paramètre facultatif dans un délégué dans la version de VB fournie avec VS2008.

Cependant, je me demande s'il existe des solutions de contournement ou des plans pour incorporer cette fonctionnalité dans VB.NET à l'avenir ?

Ce que j'aimerais faire :

Public Delegate Function Deserializer(Of T)(ByRef Buffer() As Byte, optional ByRef BufferPosition As Integer = 0) As T 

'Implementation of a func that matches the delegate'
Class A
  Public Function Deserialize(Byref Buffer() as Byte, optional Byref BufferPosition as integer = 0)
  ....

En l'absence de spécification de "facultatif" dans le délégué lui-même, il serait au moins agréable de pouvoir le faire dans l'implémentation de la fonction uniquement :

Public Delegate Function Deserializer(Of T)(ByRef Buffer() As Byte, ByRef BufferPosition As Integer) As T 

'Implementation of a func that matches the delegate'
Class A
  Public Function Deserialize(Byref Buffer() as Byte, optional Byref BufferPosition as integer = 0)
  ....

Au moins de cette deuxième façon, les fonctions du délégué auront toujours une valeur associée à chaque paramètre, bien que certaines puissent provenir du côté de la fonction et non du côté de l'appelant.

1voto

Merlyn Morgan-Graham Points 31815

Au lieu d'essayer d'écrire une signature de délégué qui gère tous les cas qui m'intéressent, et de limiter éventuellement la flexibilité future (bien que cela dépende vraiment du cas ), j'utilise parfois une Action (délégué dont la signature ne prend aucun paramètre) au lieu d'écrire mon propre délégué :

void SomeFunction(Action action)
{
    // ...
    action();
}

Il existe une fonctionnalité en C# (et je suis presque sûr en VB) qui vous permet d'inclure des valeurs de la portée locale, plutôt que de les passer comme paramètres. Cela s'appelle un délégué anonyme. En termes généraux de CS, prendre des valeurs locales avec vous, plutôt que de les passer en paramètre, est une forme de ce qu'on appelle une fermeture.

int someValueFromLocalScope = 5;
SomeFunction(() => DoSomethingElse(someValueFromLocalScope));

// you can also assign a closure to a local variable:

int someValueFromLocalScope = 5;
Action doSomethingElse =
    delegate()
    {
        DoSomethingElse(someValueFromLocalScope);
    }; // Or you could use () => { } syntax...
SomeFunction(doSomethingElse);

Ensuite, SomeFunction n'a pas besoin de savoir quels paramètres s'appliquent à l'action spécifique.

Plus d'informations sur Action : (la réponse concerne les fermetures, mais ceci peut également être utile)

L'action est simplement un délégué qui prend zéro paramètre et renvoie zéro valeur : http://msdn.microsoft.com/en-us/library/system.action.aspx

Comme tout autre délégué, vous pouvez également utiliser Action comme variable membre.

Il y a plus de délégués pré-conçus :

Action<TFirstParameter>
Func<TReturnValue>
Func<TFirstParameter, TReturnValue>

etc.

0voto

jreed350z Points 300

En VB.net, vous pouvez créer un délégué anonyme en utilisant.

Sub(t1, t2) methodName(t2)

Cela vous permet de ne pas passer le premier paramètre.

-2voto

gazarsgo Points 429

Pourquoi ne pas utiliser des types nullables, c'est-à-dire des boîtes, au lieu d'utiliser des paramètres facultatifs ?

Les paramètres facultatifs sont généralement considérés comme un défaut de forme car ils ne sont pas disponibles dans d'autres langages .NET.

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