C#委托操作
在C#编程中,委托是一种非常重要的类型,它允许将方法作为参数传递给其他方法。委托是一种引用类型变量,它存储了对某个方法的引用,这个引用可以在运行时改变。所有的委托都派生自System.Delegate类。
委托的声明和实例化
委托的声明决定了可以引用哪些方法。一个委托可以指向一个与其具有相同签名(参数列表和返回类型)的方法。例如,一个可以引用任何接受单个string参数并返回int类型的方法的委托可以这样声明:
1
| public delegate int MyDelegate(string s);
|
声明委托后,可以使用new关键字创建委托对象,并将其与特定方法关联。创建委托时,传递给new语句的参数应该像方法调用一样书写,但不带参数。例如:
1 2 3
| public delegate void PrintString(string s); PrintString ps1 = new PrintString(WriteToScreen); PrintString ps2 = new PrintString(WriteToFile);
|
委托的使用
委托特别适用于实现事件和回调方法。例如,可以创建一个委托实例,然后使用这个委托实例来调用方法。下面的代码展示了如何使用委托:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| delegate int NumberChanger(int n); class TestDelegate { static int num = 10; public static int AddNum(int p) { num += p; return num; } public static int MultNum(int q) { num *= q; return num; } public static int GetNum() { return num; } static void Main(string[] args) { NumberChanger nc1 = new NumberChanger(AddNum); NumberChanger nc2 = new NumberChanger(MultNum); nc1(25); Console.WriteLine("Value of Num: {0}", GetNum()); nc2(5); Console.WriteLine("Value of Num: {0}", GetNum()); Console.ReadKey(); } }
|
在上述代码中,NumberChanger委托被用来引用两个方法:AddNum和MultNum。这些方法通过委托实例nc1和nc2被调用。
跨线程委托
使用Invoke方法
使用Invoke或BeginInvoke方法将操作委托给创建控件的线程执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| private void Func1() { string str = ""; for (int i = 0; i < 5; i++) { str = $"线程 {Thread.CurrentThread.ManagedThreadId} 执行 {i}." + Environment.NewLine; if (textBox1.InvokeRequired) { textBox1.Invoke(new Action(() => textBox1.Text += str)); } else { textBox1.Text += str; } } }
|
参考
C# 异步编程精要