Мне нравится знать, есть ли в С# тип функции, например, в AS3. Я хотел бы сделать что-то вроде этого (но в С#):
private function doSomething():void {
// statements
}
var f:Function = doSomething
f()
Мне нравится знать, есть ли в С# тип функции, например, в AS3. Я хотел бы сделать что-то вроде этого (но в С#):
private function doSomething():void {
// statements
}
var f:Function = doSomething
f()
Да, они называются делегатами в .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
.
Концепция делегатов в .NET - именно то, что вы ищете.
На связанной странице есть примеры, а также множество руководств и подробное объяснение того, как они реализованы и используются. Google прочь!
Они (ссылки на функции) называются делегатами
Здесь замечательный праймер: http://www.akadia.com/services/dotnet_delegates_and_events.html
Да, существуют указатели безопасной функции типа 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.
Я думаю, что вы ищете тип делегата С#.
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());
}