VB.NET - есть ли способ использовать необязательные параметры в делегатах? (Или планирует разрешить это?) - PullRequest
3 голосов
/ 06 августа 2010

Насколько я понимаю, невозможно иметь необязательный параметр в делегате в версии VB, поставляемой с VS2008.

Однако мне интересно, есть ли какие-нибудь обходные пути или планы по включению этой функции в VB.NET в будущем?

Что бы я хотел сделать:

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)
  ....

В отсутствие указания «опционально» внутри самого делегата, по крайней мере, было бы неплохо сделать это только в реализации функции:

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)
  ....

По крайней мере, при этом втором способе функции для делегата всегда будут иметь значение, сопоставленное с каждым параметром, хотя некоторые могут исходить от стороны функции, а не от вызывающей стороны.

Ответы [ 3 ]

1 голос
/ 08 августа 2010

Вместо того, чтобы пытаться написать подпись делегата, которая обрабатывает все интересующие меня случаи, и, возможно, ограничить будущую гибкость (хотя это действительно зависит от случая ..), я иногда использую Action (делегат, подпись которого не принимает никаких параметров) вместо написания моего собственного делегата:

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

В C # есть функция (и я вполне уверен в VB), которая позволяет вам включать значения из локальной области видимости, а не передавать их в качестве параметров,Это называется анонимным делегатом.В общих чертах CS, взятие с собой локальных значений, а не передача их в качестве параметра, является одной из форм так называемого замыкания.

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);

Тогда SomeFunction не нужно знать, какие параметры применяютсяк конкретному действию.

Подробнее о действии: (ответ касается замыканий, но это также может быть полезно)

Действие - это просто делегат, который принимает нольпараметров и возвращает нулевые значения: http://msdn.microsoft.com/en-us/library/system.action.aspx

Как и любой другой делегат, вы также можете использовать Action в качестве переменной-члена.

Существует больше предварительно разработанных делегатов:

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

и т. Д.

0 голосов
/ 06 сентября 2013

В VB.net вы можете создать анонимного делегата, используя.

Sub(t1, t2) methodName(t2)

Это позволяет при желании не передавать первый параметр.

0 голосов
/ 06 августа 2010

Почему бы не использовать обнуляемые типы, или бокс, вместо использования необязательных параметров?

Необязательные параметры обычно считаются неправильными, поскольку они недоступны в других языках .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...