泛型委托 委托作为函数参数 Action和Func委托 委托的多播 事件 普通匿名函数,每个代码解释
时间: 2024-02-02 11:02:51 浏览: 112
好的,我来分别为您解释这些代码:
1. 泛型委托
```csharp
delegate T MyDelegate<T>(T arg);
MyDelegate<int> myDelegate = delegate (int arg) { return arg * 2; };
int result = myDelegate(5); // result = 10
```
这段代码定义了一个泛型委托`MyDelegate`,它接受一个类型为`T`的参数,并返回一个类型为`T`的结果。然后,我们使用`MyDelegate<int>`来实例化一个`myDelegate`对象,并且将一个匿名方法作为委托的实现。最后,我们调用`myDelegate(5)`,它将返回10,因为传入的参数是5,而匿名方法的实现是将参数乘以2。
2. 委托作为函数参数
```csharp
delegate void MyDelegate(string arg);
void MyFunction(MyDelegate myDelegate, string arg)
{
myDelegate(arg);
}
MyDelegate myDelegate = delegate (string arg) { Console.WriteLine(arg); };
MyFunction(myDelegate, "Hello, world!"); // 输出:"Hello, world!"
```
这段代码定义了一个函数`MyFunction`,它接受一个`MyDelegate`类型的参数和一个字符串参数`arg`。在函数内部,它调用了传入的委托并传递了`arg`参数。然后,我们实例化一个`myDelegate`对象,并将一个匿名方法作为委托的实现。最后,我们将`myDelegate`对象作为参数传递给`MyFunction`函数,并传递一个字符串参数"Hello, world!",它将在控制台输出"Hello, world!"。
3. Action和Func委托
```csharp
Action<string> myAction = delegate (string arg) { Console.WriteLine(arg); };
Func<string, int> myFunc = delegate (string arg) { return arg.Length; };
myAction("Hello, world!"); // 输出:"Hello, world!"
int length = myFunc("Hello, world!"); // length = 13
```
这段代码实例化了一个`Action`委托对象`myAction`和一个`Func`委托对象`myFunc`,它们分别接受一个字符串参数和返回一个整数值。我们使用匿名方法来实现这两个委托。然后,我们分别调用了`myAction`和`myFunc`,它们分别输出"Hello, world!"和返回字符串"Hello, world!"的长度13。
4. 委托的多播
```csharp
delegate void MyDelegate(string arg);
MyDelegate myDelegate1 = delegate (string arg) { Console.WriteLine("Delegate 1: " + arg); };
MyDelegate myDelegate2 = delegate (string arg) { Console.WriteLine("Delegate 2: " + arg); };
MyDelegate myDelegate3 = delegate (string arg) { Console.WriteLine("Delegate 3: " + arg); };
MyDelegate myMultiDelegate = myDelegate1 + myDelegate2 + myDelegate3;
myMultiDelegate("Hello, world!");
```
这段代码定义了三个`MyDelegate`委托对象`myDelegate1`、`myDelegate2`和`myDelegate3`,它们分别输出`"Delegate 1: "`、`"Delegate 2: "`和`"Delegate 3: "`前缀的字符串。然后,我们使用"+"运算符将这三个委托对象组合成一个多播委托`myMultiDelegate`。最后,我们调用`myMultiDelegate("Hello, world!")`,它将依次调用`myDelegate1`、`myDelegate2`和`myDelegate3`,并传递"Hello, world!"作为参数。
5. 事件
```csharp
class MyClass
{
public delegate void MyDelegate(string arg);
public event MyDelegate MyEvent;
public void DoSomething(string arg)
{
Console.WriteLine("DoSomething: " + arg);
MyEvent?.Invoke(arg);
}
}
class Program
{
static void Main(string[] args)
{
MyClass myClass = new MyClass();
myClass.MyEvent += delegate (string arg) { Console.WriteLine("MyEvent: " + arg); };
myClass.DoSomething("Hello, world!");
}
}
```
这段代码定义了一个`MyClass`类,它包含一个`MyDelegate`委托类型的`MyEvent`事件和一个`DoSomething`方法。在`DoSomething`方法中,我们输出一个字符串"DoSomething: "和传入的参数`arg`,然后调用`MyEvent`委托并传递`arg`参数。在`Program`类中,我们实例化一个`MyClass`对象`myClass`,并将一个匿名方法作为`MyEvent`事件处理程序。然后,我们调用`myClass.DoSomething("Hello, world!")`,它将输出"DoSomething: Hello, world!"和"MyEvent: Hello, world!"。
6. 普通匿名函数
```csharp
delegate int MyDelegate(string arg);
MyDelegate myDelegate = delegate (string arg)
{
Console.WriteLine("MyDelegate: " + arg);
return arg.Length;
};
int length = myDelegate("Hello, world!"); // 输出:"MyDelegate: Hello, world!"
// length = 13
```
这段代码定义了一个`MyDelegate`委托类型和一个`myDelegate`委托对象。我们使用匿名方法来实现`myDelegate`委托,并在实现中输出一个字符串"MyDelegate: "和传入的参数`arg`,然后返回`arg`字符串的长度。最后,我们调用`myDelegate("Hello, world!")`,它将输出"MyDelegate: Hello, world!"并返回字符串"Hello, world!"的长度13。
阅读全文