关于自定义事件的一点体会

作者在msdn搜索文章时看到自定义事件部分,回顾了在windows开发环境下IDE自带事件,整理了C#中自定义事件的实现。包括定义事件的函数签名、声明事件名称与触发逻辑、定义事件处理函数并连接,调用相关函数可触发事件及处理函数,还可将事件定义放组件中。
今天在msdn上搜索文章的时候无意中看到一个涉及 自定义事件 的部分,整天用到的基本都是windows开发环境下Ide的自带事件,比如click什么的,一时竟没看懂,回头翻书查了查,才稍微理解了,并加深了印象。虽然以前在java里也用过事件,但在c#里事件必须先定义委托,一时比较乱,整理一下先。

首先定义一个事件的函数签名(参数的格式)--代理
public delegate void ComputeSalaryCallback(string EmpID,double Salary);

在类型中声明类型所包含的事件名称,与事件触发的逻辑
public event ComputeSalaryCallback OnComputeSalaryDone;

在一个函数中,声明事件触发的逻辑,换句话说,当如下函数被调用的时候,触发OnComputeSalaryDone事件:
public virtual double computeSalary( )
{ OnComputeSalaryDone( mstrEmpID,mdblBaseSalary);
   return mdblBaseSalary;
}

定义事件处理函数,以及将事件连接到事件处理函数,连接就像是 委托 到那个函数
public static void SalaryHander(string EmpID,double Salary)
{
    Console.WeiteLine(”员工:员工代号={0},工资={1}”,EmpID,Salary);
}

OnComputeSalaryDone+=new ComputeSalaryCallback(SalaryHandler);


以上就完成了一个事件的整体,一旦调用computesalary()函数,就会触发事件OnComputeSalaryDone,并引发事件处理函数。如果连接到多个事件处理函数,则会依次执行连接的时间处理函数。

另外可以把事件定义放到组件当中,然后在其他类里声明事件处理函数,进行处理。
<think>嗯,用户问的是C语言中函数是否可以返回自定义类型。首先,我需要回忆一下C语言的基本知识。根据之前学过的内容,C函数的返回值类型通常是基本数据类型,比如int、char、float等,或者是指针类型。不过用户提到的是自定义类型,也就是结构体(struct)或者联合体(union)这类用户自己定义的类型。 接下来,我得确认C语言是否允许函数返回结构体。我记得在C99标准之前,可能有些限制,但C99及之后的版本是支持直接返回结构体的。不过早期的编译器可能不支持,或者需要特定的设置。需要查阅相关的资料或者标准文档来确认这一点。 然后,用户提供的引用中,引用[1]提到直接返回数组类型会报错,因为数组作为局部变量在函数结束后会被销毁,导致返回的指针失效。但结构体的情况不同,结构体是值类型,返回时会进行拷贝,所以即使函数结束,结构体的值会被复制到调用者的变量中,不会有悬空指针的问题。 需要进一步解释结构体和数组在返回时的区别。结构体作为返回值时,整个结构体的内容会被复制,而数组名在函数中退化为指针,返回指针会导致问题,因为指向的内存可能已经被释放。因此,返回结构体是安全的,而返回数组则不行,除非使用静态数组或者动态内存分配。 另外,引用[2]和[3]提到函数的返回值类型可以是任意数据类型,包括自定义类型,只要return语句返回的数据类型匹配。因此,结构体作为自定义类型,是可以作为返回值的。 可能还需要提供一个示例代码,展示如何定义返回结构体的函数。比如定义一个结构体,然后在函数中创建该结构体的实例,并返回它。同时,也要提到如果结构体很大,直接返回可能会影响性能,这时候可以考虑返回指针,但要注意指针指向的内存必须是有效的,比如使用动态分配(malloc)并在调用后释放。 用户可能还会关心返回结构体的效率问题,以及不同C标准(如C89和C99)之间的差异。需要指出在C89中可能不支持直接返回结构体,但大多数现代编译器遵循C99或更高标准,都支持这一特性。 最后,总结一下,C语言支持函数返回自定义结构体类型,但需要注意内存管理和编译器兼容性问题。同时,返回结构体是值传递,可能涉及拷贝开销,对于大型结构体建议使用指针。</think>### C语言函数返回自定义类型的支持情况 在C语言中,**函数可以返回自定义类型**,例如通过`struct`或`typedef`定义的结构体或联合体类型。以下是具体分析: --- #### 1. **直接返回结构体** C语言允许函数直接返回结构体(`struct`),但需注意以下几点: - **语法要求**:结构体需要先定义后使用。 - **编译器兼容性**:需支持C99及以上标准(现代编译器如GCC、Clang均支持)。 - **示例代码**: ```c struct Point { int x; int y; }; struct Point create_point(int a, int b) { struct Point p = {a, b}; return p; } ``` 调用时可直接接收结构体: ```c struct Point p1 = create_point(10, 20); ``` --- #### 2. **与返回数组的区别** 虽然结构体可以直接返回,但**数组无法直接作为返回值**,原因如下[^4]: - **生命周期问题**:函数内局部数组在函数结束后会被销毁,返回其指针会导致未定义行为。 - **语法限制**:C语言规定函数返回值不能是数组类型。 若需返回数组,需通过**动态内存分配**或**静态数组**实现: ```c int* create_array(int size) { int* arr = (int*)malloc(size * sizeof(int)); return arr; // 需调用者手动释放内存 } ``` --- #### 3. **性能与注意事项** - **拷贝开销**:返回结构体会触发值拷贝,若结构体较大,可能影响性能。此时建议返回指针(需注意内存管理)。 - **内存安全**:若返回指针,需确保指针指向的内存有效(如堆内存)。 --- #### 4. **自定义类型的其他应用** 通过`typedef`简化类型名: ```c typedef struct { char name[20]; int age; } Person; Person get_person() { Person p = {"Alice", 30}; return p; } ``` --- ### 总结 - **支持性**:C语言支持函数返回自定义结构体类型,但需注意编译标准。 - **安全性**:返回结构体是安全的(值拷贝),而返回数组需谨慎处理内存生命周期。 - **效率**:大型结构体建议通过指针传递或返回。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值