Возможно ли использовать анонимный делегат для возврата объекта?Использование анонимного делегата для возврата объекта
Что-то вроде этого:
object b = delegate { return a; };
Возможно ли использовать анонимный делегат для возврата объекта?Использование анонимного делегата для возврата объекта
Что-то вроде этого:
object b = delegate { return a; };
Да, но только путем вызова его:
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
});
, и если я пытаюсь сравнить 'a' с каким-либо другим объектом внутри метода в потоке, отличном от потока, в котором' a' принадлежит? Например, 'void Test() {if (a == b) {}}', где доступ к b из этого метода вызывает исключение перекрестного потока. – wulfgarpro
@Wulfgar 'a' не« принадлежит »нитке; он принадлежит либо экземпляру класса (если это поле), либо является переменной метода. В любом случае компилятор «захватит» переменную 'a' из области, объявляющей делегата; путем создания типа, который инкапсулирует либо экземпляр объекта «это» (для поля), либо сама «переменная»; цитата потому что он тогда * становится * полем. –
@Wulfgar - чтобы получить сквозную нить, вы должны делать работу пользовательского интерфейса; да, вы можете это исправить, но «как» зависит от того, какой блок кода является кодом пользовательского интерфейса; можете ли вы прояснить это, пожалуйста? –
Просто объявить где эти статические функции:
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();
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"));
}
}
Где 'a' взялось? Также ваш существующий код просто присваивает 'b' самому делегату. – BoltClock
@BoltClock - спасибо за указание вопроса о назначении. – wulfgarpro
см. Обновление re вашей кросс-threading pain –