Делегаты. Изменение ссылочных параметров
Прочитал такую вещь: http://msdn.microsoft.com/ru-ru/library/ms173172.aspx
Если делегат использует параметры, передаваемые по ссылке, эта ссылка передается после каждого из трех методов, а все изменения одного из методов становятся видны в следующем методе
Мне стало не совсем понятно, т.е. к примеру:
class Number { private int _value; public static implicit operator Number (int value) { return new Number { _value = value }; } public static implicit operator int(Number obj) { return obj._value; } public static Number operator +(Number c1, Number c2) { return new Number { _value = c1._value + c2._value }; } public static Number operator -(Number c1, Number c2) { return new Number { _value = c1._value - c2._value }; } } class Program { public delegate Number DelSumm(Number a, Number b); static void Main(string[] args) { DelSumm dls = Summ; DelSumm dls2 = Diff; DelSumm res = dls + dls2; Number a = 2; Number b = 3; var c = res(a, b); } static public Number Summ(Number a, Number b) { a += 1; b -= 5; return a + b; } static public Number Diff(Number a, Number b) { return a - b; } }
Получается, что в метод Diff должны передать уже измененные параметры (т.е. a = 3, b = -2), но этого не происходит, тогда как понимать эту строчку:
все изменения одного из методов становятся видны в следующем методе
Обновлено: Вроде разобрался, да действительно если в методе Summ изменить объекты a и b, то в метод Diff, они попадут уже измененными.
Предыдущий мой пример был некорректен. Правильный пример привожу ниже:
class Number { public int Value {get; set;} } class Program { public delegate int DelSumm(Number a, Number b); static void Main(string[] args) { DelSumm dls = Summ; DelSumm dls2 = Diff; DelSumm res = dls + dls2; var a = new Number(); a.Value = 2; var b = new Number(); b.Value = 3; Console.WriteLine("a = {0} b = {1}", a.Value, b.Value); var c = res(a, b); Console.WriteLine("Press any key to exit."); Console.ReadKey(); } static public int Summ(Number a, Number b) { a.Value += 1; b.Value -= 5; Console.WriteLine("Summ a = {0} b = {1}",a.Value,b.Value); return a.Value + b.Value; } static public int Diff(Number a, Number b) { Console.WriteLine("Diff a = {0} b = {1}", a.Value, b.Value); return a.Value - b.Value; } }
Результат:
a = 2 b = 3
Summ a = 3 b = -2
Diff a = 3 b = -2
Press any key to exit.