.NET编程:委托、事件和类型安全的函数指针解析

需积分: 10 3 下载量 79 浏览量 更新于2024-08-01 收藏 260KB PDF 举报
" Professional C# 4th Edition 中文版 " 本书深入探讨了C#编程语言的高级特性,尤其是关于委托和事件的章节。委托在.NET框架中扮演着至关重要的角色,它们是类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在变量中以供后续调用。这在实现诸如线程启动、回调机制以及构建事件驱动的程序时尤为关键。 委托的使用场景包括但不限于: 1. **启动线程**:在多线程编程中,`System.Threading.Thread` 类的 `Start()` 方法需要一个委托来指定线程应执行的方法。这意味着我们可以在运行时决定线程的具体工作内容。 2. **通用库类**:库开发者可能提供通用功能,但某些特定的实现细节需要由调用者决定。例如,排序算法可以接受一个比较函数,这是一个委托,由客户端代码提供具体的比较逻辑。 在C#中,委托还可以通过匿名方法和Lambda表达式进一步简化使用。匿名方法允许我们在不定义单独方法的情况下直接在需要的地方定义行为,而Lambda表达式则提供了更为简洁的语法,使得代码更易于阅读和理解。 例如,假设我们有一个排序方法,它接受一个委托来执行比较操作: ```csharp public void Sort<T>(T[] items, Comparison<T> comparison) { // 使用提供的comparison委托进行排序 } ``` 然后我们可以这样使用Lambda表达式来定义比较逻辑: ```csharp int[] numbers = { 5, 2, 8, 1, 9 }; Sort(numbers, (x, y) => x.CompareTo(y)); ``` 事件是另一种基于委托的机制,它允许对象发布通知,而其他对象可以订阅这些通知。事件处理程序就是通过委托注册的,这样当事件发生时,订阅者的方法会被自动调用。事件在用户界面编程中尤其常见,如按钮点击事件、文本框更改事件等。 本章7.1节详细讲解了委托的创建、使用和生命周期,7.2节可能涉及匿名方法的使用,7.3节可能讨论Lambda表达式的语法和应用,而7.4节则着重于事件模型,包括事件声明、订阅和触发事件的正确方式。 委托和事件是C#中实现异步编程、回调机制和事件驱动设计模式的核心工具,它们极大地提高了代码的灵活性和可扩展性。通过深入理解和熟练运用这些概念,开发者可以构建出更加高效和健壮的.NET应用程序。

td_s32 ret; ot_vpss_grp_attr grp_attr = { 0 }; ot_vpss_chn_attr chn_attr[OT_VPSS_MAX_PHYS_CHN_NUM] = { 0 }; td_bool chn_enable[OT_VPSS_MAX_PHYS_CHN_NUM] = { 0 }; if (vpss_chn >= OT_VPSS_MAX_PHYS_CHN_NUM) { sample_print("vpss_chn:%d invalid!\n", vpss_chn); return TD_FAILURE; } grp_attr.nr_en = TD_TRUE; grp_attr.ie_en = TD_TRUE; grp_attr.dci_en = TD_TRUE; grp_attr.nr_attr.compress_mode = OT_COMPRESS_MODE_FRAME; grp_attr.dei_mode = OT_VPSS_DEI_MODE_OFF; grp_attr.pixel_format = SAMPLE_PIXEL_FORMAT; grp_attr.frame_rate.src_frame_rate = -1; grp_attr.frame_rate.dst_frame_rate = -1; grp_attr.max_width = size->width; grp_attr.max_height = size->height; chn_enable[vpss_chn] = TD_TRUE; chn_attr[vpss_chn].chn_mode = OT_VPSS_CHN_MODE_AUTO; chn_attr[vpss_chn].width = size->width; chn_attr[vpss_chn].height = size->height; chn_attr[vpss_chn].pixel_format = OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420; chn_attr[vpss_chn].frame_rate.src_frame_rate = -1; chn_attr[vpss_chn].frame_rate.dst_frame_rate = -1; chn_attr[vpss_chn].border_en = TD_TRUE; chn_attr[vpss_chn].border_attr.color = COLOR_RGB_BLUE; chn_attr[vpss_chn].border_attr.top_width = 2; /* 2 : border top width */ chn_attr[vpss_chn].border_attr.bottom_width = 2; /* 2 : border bottom width */ chn_attr[vpss_chn].border_attr.left_width = 2; /* 2 : border left width */ chn_attr[vpss_chn].border_attr.right_width = 2; /* 2 : border right width */ ret = sample_common_vpss_start(vpss_grp, chn_enable, &grp_attr, chn_attr, OT_VPSS_MAX_PHYS_CHN_NUM); if (ret != TD_SUCCESS) { sample_print("failed with %#x!\n", ret); return TD_FAILURE; } return TD_SUCCESS;

2023-05-17 上传