Использование ref
с делегатами - плохая идея, ИМО.(Если честно, я бы сказал, что обычно это плохая идея. Заставьте ваши методы делать одно и иметь один результат.)
Я не думал, что это сработает вообще - но, очевидно, это сработает,до тех пор, пока вы предоставляете параметр ref
при вызове EndInvoke
:
using System;
class Program
{
delegate void Foo(ref int x, string y);
static void SampleFoo(ref int x, string y)
{
Console.WriteLine("Incoming: {0}", x); // 10
x = y.Length;
}
static void Main(string[] args)
{
int x = 0;
int input = 10;
Foo f = SampleFoo;
IAsyncResult result = f.BeginInvoke(ref input, "Hello", null, null);
f.EndInvoke(ref x, result);
Console.WriteLine("Result: {0}", x); // 5
}
}
Поведение здесь потенциально сбивает с толку ... Я бы избегал его, если это вообще возможно.
Большинство случаев использования ref
связано с непониманием того, как передача параметров работает в C # ... возможно ли, что это так?Вам действительно нужен первый параметр, который будет ref
?Вы можете просто сделать возвращаемое значение делегата новым контекстом вместо этого?