Csharp/CSharp Tutorial/delegate/Multi cast delegate — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
(нет различий)
|
Текущая версия на 15:19, 26 мая 2010
Содержание
Demonstrate multicasting
Create an invocation list, or chain, of methods that will be called when a delegate is invoked.
<source lang="csharp">using System;
delegate string StrMod(ref string str);
class MultiCastDemo {
static string replaceSpaces(ref string a) { Console.WriteLine("replaceSpaces"); return a; } static string removeSpaces(ref string a) { Console.WriteLine("removeSpaces"); return a; } static string reverse(ref string a) { Console.WriteLine("reverseSpaces"); return a; } public static void Main() { StrMod strOp; StrMod replaceSp = new StrMod(replaceSpaces); StrMod removeSp = new StrMod(removeSpaces); StrMod reverseStr = new StrMod(reverse); string str = "This is a test"; // Set up multicast. strOp = replaceSp; strOp += reverseStr; // Call multicast. strOp(ref str); // Remove replace and add remove. strOp -= replaceSp; strOp += removeSp; str = "This is a test."; // reset string // Call multicast. strOp(ref str); }
}</source>
replaceSpaces reverseSpaces reverseSpaces removeSpaces
Multicast delegates
<source lang="csharp">using System; class MainClass {
delegate int MyDelegate(string s); static void Main(string[] args) { string MyString = "Hello World"; MyDelegate Multicast = null; Multicast += new MyDelegate(DoSomething); Multicast += new MyDelegate(DoSomething2); Multicast(MyString); } static int DoSomething(string s) { Console.WriteLine("DoSomething"); return 0; } static int DoSomething2(string s) { Console.WriteLine("DoSomething2"); return 0; }
}</source>
DoSomething DoSomething2
Remove delegate from Multicast
<source lang="csharp">using System; class MainClass {
delegate int MyDelegate(string s); static void Main(string[] args) { string MyString = "Hello World"; //Or you can Multicast delegates by doing this MyDelegate Multicast = null; Multicast += new MyDelegate(DoSomething); Multicast += new MyDelegate(DoSomething2); Multicast -= new MyDelegate(DoSomething2);
Multicast(MyString); } static int DoSomething(string s) { Console.WriteLine("DoSomething"); return 0; } static int DoSomething2(string s) { Console.WriteLine("DoSomething2"); return 0; }
}</source>
DoSomething
uses the reference parameter of a multicast delegate as a counter
<source lang="csharp">using System; public delegate void DelegateClass(int valCount, ref int refCount); public class Counter {
public static void Main() { DelegateClass del = (DelegateClass)AddOne + (DelegateClass)AddTwo + (DelegateClass)AddOne; int valCount = 0; int refCount = 0; del(valCount, ref refCount); Console.WriteLine("Value count = {0}", valCount); // 0 Console.WriteLine("Reference count = {0}",refCount); // 4 } public static void AddOne(int valCount,ref int refCount) { ++valCount; ++refCount; } public static void AddTwo(int valCount,ref int refCount) { valCount += 2; refCount += 2; }
}</source>