() => построить - PullRequest
       40

() => построить

4 голосов
/ 16 июля 2010

Я нахожусь в процессе преобразования проекта из Visual Studio 2005 в Visual Studio 2008 и подошел к вышеупомянутой конструкции.

using Castle.Core.Resource;
using Castle.Windsor;
using Castle.Windsor.Configuration.Interpreters;
using CommonServiceLocator.WindsorAdapter;
using Microsoft.Practices.ServiceLocation;

namespace MyClass.Business
{
    public class Global : System.Web.HttpApplication
    {
        public override void Init()
        {
            IServiceLocator injector =
                new WindsorServiceLocator(
                    new WindsorContainer(
                        new XmlInterpreter(
                            new ConfigResource("oauth.net.components"))));

            //ServiceLocator.SetLocatorProvider(() => injector);

            // ServiceLocator.SetLocatorProvider(injector);
        }
    }
}

ServiceLocator.SetLocatorProvider (() => инжектор);

Могу ли я понять, что это такое.

Ответы [ 5 ]

10 голосов
/ 16 июля 2010

Это лямбда-выражение .

Я полагаю, что метод SetLocatorProvider имеет такую ​​подпись, как:

SetLocatorProvider( Func<IServiceLocator> callback ):

Теперь вы должны предоставить такуюПерезвоните.Есть в основном три варианта:

Использовать метод (всегда работает):

private IServiceLocator GetServiceLocator() { /* return IServiceLocator */ }

ServiceLocator.SetLocatorProvider( GetServiceLocator() );

Использовать делегат (требуется C # 2.0):

ServiceLocator.SetLocatorProvider( delegate
        {
            // return IServiceLocator
        } );

Используйте лямбда (требуется C # 3.0):
Это кодвы видите ...
Поскольку аргумента нет (Func<IServiceLocator> имеет только возвращаемое значение), вы указываете это с помощью ():

ServiceLocator.SetLocatorProvider( () => { /* return IServiceLocator */ } );

, это можно перевести в

ServiceLocator.SetLocatorProvider( () => /* IServiceLocator */ );

Может быть, вы хотите прочитать этот вопрос + ответ тоже.

2 голосов
/ 16 июля 2010

Это лямбда.Если вы знакомы с делегатами, это все равно что объявить метод, который возвращает injector, и использовать его в качестве делегата, за исключением того, что вы указали метод.

Первый () содержит аргументы лямбда-выражения,Например, при обработке событий вы часто будете видеть (src, e), где src - источник события, а e - само событие.Затем доступны аргументы для использования последующим кодом.

Если он многострочный, вы можете поместить (args) => { brackets } вокруг делегата и вернуть значение.Это стенография.

2 голосов
/ 16 июля 2010

Это лямбда-нотация для создания встроенного делегата без параметра.

0 голосов
/ 16 июля 2010

Это не конструктор, а лямбда-выражение.См. здесь для более подробной информации.

В этом случае () означает отсутствие параметров => - это оператор Lamda, и возвращается инжектор.

0 голосов
/ 16 июля 2010

Это лямбда-выражение, которое создает анонимный делегат. То есть его функция объявлена ​​встроенной. Список параметров находится внутри парантеза, поэтому в этом случае нет параметров. И когда функция содержит один оператор, она неявно возвращает значение этого оператора (или вообще ничего не возвращает).

В данном конкретном случае это функция, которая возвращает инжектор. Это общий шаблон для ServiceLocator, который инициализирует его функцией, возвращающей контейнер IoC.

...