深入理解C中的委托、匿名方法、Lambda表达式与事件
立即解锁
发布时间: 2025-08-21 00:06:07 阅读量: 3 订阅数: 8 


C#编程基础与实战技巧
### 深入理解C#中的委托、匿名方法、Lambda表达式与事件
#### 1. 委托的调用
委托的调用方式与调用方法类似。调用委托时所使用的参数,会用于调用调用列表中的每个方法(除非其中一个参数是输出参数)。以下是一个示例:
```csharp
MyDel delVar = inst.MyM1;
delVar += SCl.m3;
delVar += X.Act;
// ...
delVar( 55 ); // Invoke the delegate.
// ...
```
在这个例子中,委托`delVar`接受一个整数输入值。使用参数调用委托时,会使用相同的参数值(这里是55)调用调用列表中的每个成员。需要注意的是,一个方法可以在调用列表中出现多次。当委托被调用时,每次在列表中遇到该方法时都会调用它。
#### 2. 委托示例
下面的代码定义并使用了一个无参数、无返回值的委托:
```csharp
// Define a delegate type with no return value and no parameters.
delegate void PrintFunction();
class Test
{
public void Print1()
{ Console.WriteLine("Print1 -- instance"); }
public static void Print2()
{ Console.WriteLine("Print2 -- static"); }
}
class Program
{
static void Main()
{
Test t = new Test(); // Create a test class instance.
PrintFunction pf; // Create a null delegate.
pf = t.Print1; // Instantiate and initialize the delegate.
// Add three more methods to the delegate.
pf += Test.Print2;
pf += t.Print1;
pf += Test.Print2;
// The delegate now contains four methods.
if( null != pf ) // Make sure the delegate isn't null.
pf(); // Invoke the delegate.
else
Console.WriteLine("Delegate is empty");
}
}
```
这段代码的输出如下:
```plaintext
Print1 -- instance
Print2 -- static
Print1 -- instance
Print2 -- static
```
这个示例展示了如何创建委托实例、添加方法到委托的调用列表,以及如何安全地调用委托。
#### 3. 带返回值的委托调用
如果委托有返回值,并且其调用列表中有多个方法,会出现以下情况:
- 调用列表中最后一个方法返回的值,就是委托调用返回的值。
- 调用列表中其他所有方法的返回值都会被忽略。
以下是一个示例:
```csharp
delegate int MyDel( ); // Declare method with return value.
class MyClass {
int IntValue = 5;
public int Add2() { IntValue += 2; return IntValue;}
public int Add3() { IntValue += 3; return IntValue;}
}
class Program {
static void Main( ) {
MyClass mc = new MyClass();
MyDel mDel = mc.Add2; // Create and initialize the delegate.
mDel += mc.Add3; // Add a method.
mDel += mc.Add2; // Add a method.
Console.WriteLine("Value: {0}", mDel() );
}
}
```
这段代码的输出是:
```plaintext
Value: 12
```
这个示例清晰地展示了带返回值的委托在调用多个方法时的返回值规则。
#### 4. 带引用参数的委托调用
如果委托有引用参数,参数的值可能会在调用列表中的一个或多个方法返回时发生改变。调用调用列表中的下一个方法时,传递给下一个方法的是参数的新值,而不是初始值。以下是一个示例:
```csharp
delegate void MyDel( ref int X );
class MyClass
{
public void Add2(ref int x) { x += 2; }
public void Add3(ref int x) { x += 3; }
static void Main()
{
MyClass mc = new MyClass();
MyDel mDel = mc.Add2;
mDel += mc.Add3;
mDel += mc.Add2;
int x = 5;
mDel(ref x);
Console.WriteLine("Value: {0}", x);
}
}
```
这段代码的输出是:
```plaintext
Value: 12
```
这个示例说明了引用参数在委托调用过程中的值传递和修改情况。
#### 5. 匿名方法
到目前为止,我们知道可以使用静态方法或实例方法来实例化委托。但如果一个方法仅用于实例化委托,那么除了创建委托的语法要求外,实际上并不需要一个单独的命名方法。匿名方法允许我们省略这个单独的命名方法。
匿名方法是在实例化委托时内联声明的方法。以下是匿名方法的使用场景:
- 作为声明委托变量时的初始化表达式。
- 在组合委托的赋值语句右侧。
- 在将委托添加到事件的赋值语句右侧。
匿名方法的语法包括以下组件:
- 类型关键字`delegate`
- 参数列表(如果语句块不使用任何参数,则可以省略)
- 语句块,包含匿名方法的代码
```plaintext
Keyword Parameter list Statement block
↓ ↓ ↓
delegate ( Parameters
```
0
0
复制全文
相关推荐










