委托是C#中的一种高级特性,它允许我们将方法的引用作为参数传递给其他方法,从而实现类似函数指针的功能。在面试中,理解委托的关键在于其核心概念、用途和实际应用。
**委托基础**
1. **定义与实例化**:
- 委托是一种类型,类似于C++中的函数指针。例如,`delegate void DGSayHi(string uName)` 定义了一个名为 `DGSayHi` 的委托类型,接受一个字符串参数并无返回值。
- 创建委托对象时,通过委托类型的构造函数将具体的方法(如 `SayHi`)作为实例化时的参数,如 `DGSayHi dgObj = new DGSayHi(SayHi)`。
- 调用委托就像调用对象的方法,但实际上是执行委托类型中关联的方法,如 `dgObj("JamesZou")`,输出 "Hi~JamesZou!"。
2. **委托的概念**:
- 委托是一种封装了方法引用的特殊类型,可以在运行时动态绑定调用方法。它允许程序在编译时不确定具体调用哪个方法,只需传递委托类型即可。
- 可以将其比喻为一个方法调用列表,其中包含一系列预定义的方法,当调用委托时,会按照指定顺序执行这些方法。
3. **委托的应用场景**:
- 委托常用于事件处理、异步编程和回调函数,比如控制多线程执行、响应用户输入、或根据条件动态执行不同的操作。
- 举个例子,你可以定义一个委托来代表打开机器的操作,这样在接收到不同命令(电话指示)时,可以根据需要动态调用对应的打开机器方法,如 `SayHi` 和 `DaZhaoHu`。
**使用示例**:
- 有三个方法 `SayHi`、`DaZhaoHu` 和 `Greeting(name)`,它们可以分别代表不同的任务。通过委托,程序员可以在运行时决定执行哪个方法,如:
```csharp
void SayHi(string name) { Console.WriteLine("Hi~" + name + "!"); }
void DaZhaoHu(string name) { Console.WriteLine("Hello, " + name + "!"); }
// 创建委托对象并关联方法
DGSayHi greeting = new DGSayHi(SayHi);
DGSayHi welcome = new DGSayHi(DaZhaoHu);
// 根据需求动态调用
if (condition1)
greeting("James");
else if (condition2)
welcome("James");
```
总结来说,委托是C#中强大的功能,它简化了方法的动态调用,增强了代码的灵活性和可扩展性。在面试中,了解委托的基础用法、应用场景以及其与接口的区别,可以帮助你更好地理解和应对相关问题。