Подтвердить что ты не робот

Есть ли тип функции в С#?

Мне нравится знать, есть ли в С# тип функции, например, в AS3. Я хотел бы сделать что-то вроде этого (но в С#):

private function doSomething():void {
    // statements
}

var f:Function = doSomething
f()
4b9b3361

Ответ 1

Да, они называются делегатами в .NET, а не типами функций.

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

Чтобы определить тот, который соответствует вашему примеру:

public delegate void DoSomethingDelegate(Object param1, Object param2);

Затем, чтобы назначить его:

DoSomethingDelegate f = DoSomething;
f(new Object(), new Object());

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

Два метода Func<..> для методов, возвращающих значение, и Action<..> для методов, которые этого не делают.

В вашем случае это будет работать:

Action<Object, Object> f = DoSomething;
f(new Object(), new Object());

Обратите внимание, что в этом последнем случае вам не нужно объявлять DoSomethingDelegate.

Ответ 2

Концепция делегатов в .NET - именно то, что вы ищете.

На связанной странице есть примеры, а также множество руководств и подробное объяснение того, как они реализованы и используются. Google прочь!

Ответ 4

Да, существуют указатели безопасной функции типа Delegates. Например...

void Main()
{
   object o1 = new object();
   object o2 = new object();

   Action<object, object> act = DoSomething;
   act( o1, o2 );
}

private void DoSomething( object o1, object o2 )
{
  // do that thang
}

Action<T> - встроенный делегат...

public delegate void Action<T1, T2>(T1 arg1, T2 arg2)

Существуют также анонимные функции, называемые Лямбда-выражения. Например...

   List<int> lst = new List<int>() { 1, 2, 3, 4, 5 };
   var res = lst.Where( l => l > 3 );

Аргумент метода Where - это выражение Lambda. Просмотрите блог Эрика Уайта для отличной дискуссии по этому поводу: Query Composition с использованием методов функционального программирования в С# 3.0.

Ответ 5

Я думаю, что вы ищете тип делегата С#.

    delegate void DoSomethingDelegate(object obj1, object obj2);

    void DoSomething(object a, object b)
    {
    }

    void RunDoSomething()
    {
        //use your delegate
        DoSomethingDelegate d = new DoSomethingDelegate(DoSomething);
        d(new object(), new object());

        //alernatively, use the built in generic version
        Action<object, object> d2 = new Action<object, object>(DoSomething);
        d2(new object(), new object());

    }