作者: littleboy 2025-10-14 16:09:22

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# 异步编程精要