2013-06-16 2 views
2

Есть ли эквивалент функторам в C#?У функторов есть эквивалент в C#?

У C# есть Func <,>, делегаты и анонимные методы, но не все эти указатели на метод?

C++ Functor - это класс, а не указатель на метод.

+0

Этот ответ может помочь http://stackoverflow.com/a/974639/187697 – keyboardP

+0

Я видел это, но они были специфичны для его вопроса, а не для общего. – 4thSpace

+0

Этот ответ содержит список аппроксимаций. –

ответ

6

C# имеет Func <,>, делегатов и анонимные методы , но не все из этих указателей на метод?

Нет. Даже делегаты C# - это классы, реализованные компилятором для вас. Эти сгенерированные классы (для делегатов) получены из MulticastDelegate, который, в свою очередь, происходит от Delegate.

Короче говоря, делегат является синтаксическим сахаром для класса, сгенерированного компилятором.

+0

Хорошо. Будут ли они похожими на Фюнторов? – 4thSpace

+0

@ 4thSpace: «похоже» в каком смысле? В C# вы не можете перегружать 'operator()'. Поэтому, если вы имеете в виду это, то это не похоже. C# - это другой язык, он делает несколько вещей по-другому, достигает их по-разному. – Nawaz

+0

Оператор()? Вы имеете в виду нечто иное, чем это http://msdn.microsoft.com/en-us/library/aa288467(v=vs.71).aspx? – 4thSpace

3

Оба lambdas (Func <>, Action <>), а делегаты (названные так же анонимно) являются классами.

Если вам нужен указатель на метод (передать его в небезопасный код, например), вы должны использовать сортировочных:

IntPtr pFunc = Marshal.GetFunctionPointerForDelegate(myDelegate);