Как мне вызвать следующий конструктор Func‹T› как в SimplSocket(Func‹System.IO.Sockets.Socket› socketFunc)

Я не знаком с этим API, но я пытаюсь создать новый конструктор, для которого требуется параметр Func, как показано в конструкторе ниже.

public SimplSocket(System.Func<System.Net.Sockets.Socket> socketFunc, 
                   int messageBufferSize, 
                   int maximumConnections, 
                   bool useNagleAlgorithm)  

Что мне делать с socketFunc?


person halfbit    schedule 01.08.2014    source источник
comment
Я не понимаю тебя. Что ты пытаешься сделать снова? Вы пытаетесь создать экземпляр SimplSocket, подклассировать его или перегрузить другой конструктор?   -  person Kirk Woll    schedule 02.08.2014
comment
@KirkWoll Я пытаюсь создать экземпляр SimplSocket stackoverflow.com/q/25087508/328397   -  person halfbit    schedule 02.08.2014
comment
Вам нужно передать ему метод (или лямбду), который не принимает параметров и возвращает новый сокет. Эти методы будут аргументом для параметра socketFunc.   -  person Kirk Woll    schedule 02.08.2014


Ответы (1)


System.Func<System.Net.Sockets.Socket> — это так называемый делегат. Они используются для хранения функций. В этом особом случае делегат принимает только функции, которые возвращают тип System.Net.Sockets.Socket и не имеют аргументов. Например:

У вас есть функция, определенная где-то:

public System.Net.Sockets.Socket someFunction()
{
  //whatever it does
}

Тогда вы можете сделать это:

var sock = new SimplSocket(someFunction, 1024,1,false);

Если вы не хотите определять дополнительную функцию, вы можете использовать лямбда-выражение для прямого выражения функции:

var sock = new SimplSocket(() => new System.Net.Sockets.Socket(...), 1024,1,false);

Сам конструктор может использовать делегат socketFunc для вызова данной функции, и он знает, что функция вернет System.Net.Sockets.Socket, но не знает, какая функция используется. Это будет просто выглядеть так:

 var aSock = socketFunc();
person T_D    schedule 01.08.2014
comment
Спасибо, что дали мне термин, чтобы я мог найти его в Google ... пример был отличным, спасибо - person halfbit; 02.08.2014
comment
Существует ли известный шаблон проектирования, который объясняет, почему и когда следует применять этот тип использования делегатов в конструкторе? Я только начал работать над новым проектом, и я начинаю видеть много этих конструкций от других разработчиков, но я не совсем понимаю, в чем заключается намерение. - person Gio2k; 13.03.2015