与C/C++指针相似的C#代表元及事件触发

代表元是C#中比较复杂的概念,C#中的代表元和C/C++中的函数指针非常相似使用代表元可以把代表元内部方法的引用封装起来然后通过它使用代表元引用的方法。

它有一个特性就是不需要知道被引用的方法属于那一个类对象只要函数的参数个数与返回类型与代表元对象一致。这样说可能比较抽象我下面举几个简单的例子希望能给广大初学者一些基本的认识。

//定义一个返回值为string的无参数的代表元
注意这个代表元只能引用对象中
返回值为string的无参数方法
delegate string MyDelegate();
public class MyClass
{
public string SayHello()
{
return "Hello the world!";
}

}
public class TestMyClass
{
public static void Main(string[] args)
{
MyClass myClass1=new MyClass();
MyDelegate myDelegate1=new MyDelegate(myClass1.SayHello);
//下面就使用myDelegate1代替对象myClass1的SayHello方法
System.Console.WriteLine(myDelegate1());
//输出结果为hello the world!
与调用myClass1.SayHello();效果相同
}
}

如果代表元只有这点功能它就没有什么太大的用处了,代表元还有一个非常有用的功能就是定义复合代表元对象只有同样类型的代表元才能够复合起来 + 能定义复合代表元对象 - 从一个复合代表元中去掉一个代表元对象:

delegate void MyDelegate(string s);
public class MyClass
{
public void SayHello(string who)
{
System.Console.WriteLine( who+"hello!");
}
public void SayGoodBye(string who)
{
System.Console.WriteLine( who+"good bye!");
}

}

public class TestMyClass
{
public static void Main(string[] args)
{
MyClass myClass1=new MyClass();
MyDelegate myDelegate,myDelegate1;
myDelegate=new MyDelegate(myClass1.SayHello);
myDelegate1=new MyDelegate(myClass1.SayGoodBye);
myDelegate+=myDelegate1;
//这样调用myDeletage就相当于同时调用了
myClass1.SayHello和myClass1.SayGoodBye
myDelegate("love.net ");
//执行结果输出love.net hello! love.net good bye!
}
}

时间: 2024-10-07 05:02:27

与C/C++指针相似的C#代表元及事件触发的相关文章

C#代表元及事件触发(Love.NET原创)

原创   代表元是C#中比较复杂的概念,C#中的代表元和C/C++中的函数指针非常相似使用代表元可以把代表元内部方法的引用封装起来然后通过它使用代表元引用的方法.它有一个特性就是不需要知道被引用的方法属于那一个类对象只要函数的参数个数与返回类型与代表元对象一致.这样说可能比较抽象我下面举几个简单的例子希望能给广大初学者一些基本的认识 //定义一个返回值为string的无参数的代表元注意这个代表元只能引用对象中返回值为string的无参数方法delegate string MyDelegate()

《.net编程先锋C#》第五章 类(转)

编程 第五章 类前一章讨论了数据类型和它们的用法.现在我们转移到C#中至关重要的结构--类.没有了 类,就连简单的C#程序都不能编译.这一章假定你知道了一个类的基本组成部分:方法.属性.构 造函数和析构函数. C#在其中增加了索引和事件.在这一章中,你学到下列有关类的话题.. 使用构造函数和析构函数.给类写方法.给一个类增加属性存取标志.实现索引.创建事件并通过代表元为事件关联客户.应用类.成员和存取修饰符. 5.1 构造函数和析构函数在你可以访问一个类的方法.属性或任何其它东西之前, 第一条执

> 第五章 类(rainbow 翻译)*1 (来自重粒子空间)

<<展现C#>> 第五章 类(rainbow 翻译)出处:http://www.informit.com\matter\ser0000002正文:第五章  类       前一章讨论了数据类型和它们的用法.现在我们转移到C#中至关重要的结构--类.没有了类,就连简单的C#程序都不能编译.这一章假定你知道了一个类的基本组成部分:方法.属性.构造函数和析构函数. C#在其中增加了索引和事件.       在这一章中,你学到下列有关类的话题.      . 使用构造函数和析构函数    

&amp;gt; 第五章 类(rainbow 翻译)*2 (来自重粒子空间)

5.3  类属性    有两种途径揭示类的命名属性--通过域成员或者通过属性.前者是作为具有公共访问性的成员变量而被实现的:后者并不直接回应存储位置,只是通过 存取标志(accessors)被访问.    当你想读出或写入属性的值时,存取标志限定了被实现的语句.用于读出属性的值的存取标志记为关键字get,而要修改属性的值的读写符标志记为set.在你对该理论一知半解以前,请看一下清单5.9中的例子,属性SquareFeet被标上了get和set的存取标志.清单 5.9  实现属性存取标志 1: u

《.net编程先锋C#》第五章 类(下)(转)

编程 5.2.3 方法屏蔽重定义方法的一个不同手段就是要屏蔽基类的方法.当从别人提供的类派生类时,这个功能特 别有价值.看清单 5.6,假设BaseClass由其他人所写,而你从它派生出 DerivedClass . 清单 5.6 Derived Class 实现一个没有包含于 Base Class中的方法 1: using System;2: 3: class BaseClass4: {5: }6: 7: class DerivedClass:BaseClass8: {9: public vo

HTML5实战与剖析之触摸事件(touchstart、touchmove和touchend)_经验交流

HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主要是触摸事件:touchstart.touchmove和touchend. 一开始触摸事件touchstart.touchmove和touchend是iOs版Safari浏览器为了向开发人员传达一些信息新添加的事件.因为iOs设备既没有鼠标也没有键盘,所以在为移动Safari浏览器开发交互性网页的时

指针-【C语言】为什么指向char整数数组的char*相减得到的是long类型?

问题描述 [C语言]为什么指向char整数数组的char*相减得到的是long类型? 解决方案 事实上, char *p,*p1都是指针,一个指向数组第一个元素,一个指向第五个元素,指针的减法表示地址之间的差,而这是指向char的指针,因此得到的是两地址差/8的值,即sizeof() 解决方案二: 你测试一个问题的时候 把结果贴出来 方便解决 解决方案三: 指针运算得出的结果与指针指向的类型和系统位数有关.比如上述例子:p和p1指针指向的都是char,那么指针运算的单位是一个字节长度. 根据上述

C的指针

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址. 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让我们分别说明. 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3]; (5)int*(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文章<<如何理解c和c ++的复杂类型声明&g

C/C++指针小结_C 语言

第一章.指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区.让我们分别说明. 先声明几个指针放着做例子: 例一: (1)int *ptr; (2)char *ptr; (3)int **ptr; (4)int (*ptr)[3]; (5)int *(*ptr)[4]; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文章<<如何理解c和