举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > c#委托的用法 C# 通用委托

c#委托的用法 C# 通用委托

2023-02-28 09:18 C#教程

c#委托的用法 C# 通用委托

c#委托的用法

C#委托是一种特殊的类,它可以引用一个或多个方法,并允许在运行时调用这些方法。它可以将一个方法的调用封装到一个对象中,从而使得该方法可以作为参数传递给其他方法。C#委托是一种强大的工具,它可以帮助我们构建更加灵活和可重用的代码。

C#委托有三个重要的部分:声明、实例化和调用。首先,我们需要声明一个委托:

public delegate void MyDelegate(int x, int y);

然后,我们需要实例化该委托:

MyDelegate myDelegate = new MyDelegate(MyMethod);

最后,我们需要调用该委托:

myDelegate(10, 20);

C#中的委托也可以使用多播来实现多个方法的合并调用。多播是将多个方法封装到一个单独的委托中并将其作为单独的对象传递给其他方法。例如:

MyDelegate myDelegate1 = new MyDelegate(MyMethod1); 
MyDelegate myDelegate2 = new MyDelegate(MyMethod2); 
MyDelegate myMultiCast = (MyDelegate) Delegate.Combine(myDelegate1, myDelegate2); 
myMultiCast(10, 20); 

上面代码中的myMultiCast将会同时调用MyMethod1和MyMethod2这两个方法。此外,C#还提供了异步回调功能来帮助我们在不影响UI界面性能的情况下实现异步处理。例如:

public delegate void AsyncCallback();   // 声明回调函数   AsyncCallback ac = new AsyncCallback(CallBackFunc);   // 实例化回调函数   IAsyncResult ar = BeginInvoke(ac, null);   // 启动异步回调 

上面代码中BeginInvoke()函数会首先触发CallBackFunc()函数来进行异步回调处理。

< p >总之,C#中的委托是一种强大而有效的工具,它可以帮助我们更好地封装代码、实现多重回调和异步处理。

C# 通用委托

C# 通用委托

委托类型可以包含通用类型参数。例如:

public delegate T Converter<T> (T arg);

有了这个定义,我们可以编写一个适用于任何类型的通用方法:

public class Util {
    public static void Process<T> (T[] values, Converter<T> t) {
       for (int i = 0; i < values.Length; i++)
           values[i] = t (values[i]);
    }
}

class Main {
    static void Main() {
       int[] values = { 1, 2, 3 };
       Util.Process (values, Square); // Hook in Square
       foreach (int i in values){
           Console.Write (i + " "); // 1 4 9
       }
    }
    static int Square (int x) { 
       return x * x; 
    }
}

Func 和 Action委托

使用通用委托,我们可以写一小组委托类型来覆盖任何返回类型和任意数量的参数的方法。

这些委托是Func 和Action委托,在系统命名空间中定义:

delegate TResult Func <out TResult> ();
delegate TResult Func <in T, out TResult> (T arg);
delegate TResult Func <in T1, in T2, out TResult> (T1 arg1, T2 arg2);

...等等,直到 T16

delegate void Action ();
delegate void Action <in T> (T arg);
delegate void Action <in T1, in T2> (T1 arg1, T2 arg2);

...等等,直到 T16

这些代表可以覆盖几乎所有的方法。


例子

以下代码显示了如何使用Func委托,该委托接受T类型的单个参数并返回相同类型的值:

public static void Process<T> (T[] values, Func<T,T> transformer) {
    for (int i = 0; i < values.Length; i++)
        values[i] = transformer (values[i]);
}

这些代理没有涉及的唯一实际场景是ref/out和指针参数。

代理类型彼此不兼容,即使它们的签名相同。

如果它们以相同的顺序引用相同的方法,则多播委托被认为是相等的。

阅读全文
以上是编程学为你收集整理的c#委托的用法 C# 通用委托全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • c#中输出型参数类型 C# 类型参数

    c#中输出型参数类型 C# 类型参数

    2023-02-27 C#教程

    C#类型参数类型参数可以在类,结构,接口,委托和方法的声明中引入。其他构造(如属性)不能引入类型参数,但可以使用一个。例...

  • c#泛型约束 C# 泛型约束

    c#泛型约束 C# 泛型约束

    2023-02-28 C#教程

    C#泛型约束默认情况下,类型参数可以用任何类型替换。约束可以应用于类型参数,以需要更具体的类型参数。这些是可能的约束:wher...

  • c#对象初始化器 C# 对象初始化

    c#对象初始化器 C# 对象初始化

    2023-02-27 C#教程

    C#对象初始化任何可访问的字段或对象的属性可以在构造之后通过对象初始化器直接设置。例如,考虑下面的类:public class Person ...

  • c#接口的作用 C# 接口

    c#接口的作用 C# 接口

    2023-02-27 C#教程

    C#接口接口提供了一个规范而不是其成员的实现。接口作为定义和实现之间的联系。接口成员都是隐式抽象的。类或结构可以实现多个...

  • c语言布尔类型 C# 布尔类型/运算符

    c语言布尔类型 C# 布尔类型/运算符

    2023-02-26 C#教程

    C#布尔类型/运算符C#的bool类型别名System.Boolean类型是一个逻辑值,可以分配文本true或false。我们使用bool类型来表示一个tu...

© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部