2011-02-06 2 views
5

Возможно ли использовать анонимный делегат для возврата объекта?Использование анонимного делегата для возврата объекта

Что-то вроде этого:

object b = delegate { return a; }; 
+1

Где 'a' взялось? Также ваш существующий код просто присваивает 'b' самому делегату. – BoltClock

+0

@BoltClock - спасибо за указание вопроса о назначении. – wulfgarpro

+0

см. Обновление re вашей кросс-threading pain –

ответ

9

Да, но только путем вызова его:

Func<object> func = delegate { return a; }; 
// or Func<object> func =() => a; 
object b = func(); 

И, конечно же, следующий много проще ...

object b = a; 

В комментариях исключения для кросс-потоков упоминается; это может быть определена следующим образом:

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

object o = null; 
MethodInvoker mi = delegate { 
    o = someControl.Value; // runs on UI 
}; 
someControl.Invoke(mi); 
// now read o 

Или наоборот (для запуска делегата на BG):

object value = someControl.Value; 
ThreadPool.QueueUserWorkItem(delegate { 
    // can talk safely to "value", but not to someControl 
}); 
+0

, и если я пытаюсь сравнить 'a' с каким-либо другим объектом внутри метода в потоке, отличном от потока, в котором' a' принадлежит? Например, 'void Test() {if (a == b) {}}', где доступ к b из этого метода вызывает исключение перекрестного потока. – wulfgarpro

+0

@Wulfgar 'a' не« принадлежит »нитке; он принадлежит либо экземпляру класса (если это поле), либо является переменной метода. В любом случае компилятор «захватит» переменную 'a' из области, объявляющей делегата; путем создания типа, который инкапсулирует либо экземпляр объекта «это» (для поля), либо сама «переменная»; цитата потому что он тогда * становится * полем. –

+0

@Wulfgar - чтобы получить сквозную нить, вы должны делать работу пользовательского интерфейса; да, вы можете это исправить, но «как» зависит от того, какой блок кода является кодом пользовательского интерфейса; можете ли вы прояснить это, пожалуйста? –

1

Просто объявить где эти статические функции:

public delegate object AnonymousDelegate(); 

public static object GetDelegateResult(AnonymousDelegate function) 
{ 
    return function.Invoke(); 
} 

И где-нибудь использовать его, как вы хотите, как это:

object item = GetDelegateResult(delegate { return "TEST"; }); 

или даже как это

object item = ((AnonymousDelegate)delegate { return "TEST"; }).Invoke(); 
0
using System; 

public delegate int ReturnedDelegate(string s); 

class AnonymousDelegate 
{ 
    static void Main() 
    { 
     ReturnedDelegate len = delegate(string s) 
     { 
      return s.Length; 
     }; 
     Console.WriteLine(len("hello world")); 
    } 
} 
Смежные вопросы