C#中的方法(函数),委托和事件

1. 先有方法,然后再有委托,最后再有事件

2. 思考能不能将 A方法 作为参数,传递给 B方法呢?

eg: 在传统的编程方式中,A方法 调用 B方法的方式如下:

//洗菜
public void Washing(string vegetables){
     Console.WriteLine("清洗"+ vegetables);
}

//做家务
public void DoingHousework( ){
    //洗菜..    Washing("土豆");//直接调用
}

能不能像vegetables作为Washing()的参数那样,来实现

DoingHousework()调用Washing()呢,那代码应该怎么写呢,

//洗菜 public void Washing(string vegetables){      Console.WriteLine("清洗"+ vegetables); }

/*
    能不能将Washing()作为参数,
    传递给DoingHousework()呢
*/
//做家务
public void DoingHousework( ){//貌似以前没怎么听说过,可以将方法作为另一个方法的参数哦,那这个参数的类型应该是
    //洗菜..
}

貌似以前没怎么听说过,可以将方法作为另一个方法的参数哦,那这个参数的类型应该是 没错就是委托

3. 委托 delegate(方法的类型):

类似于C/C++中的函数指针

委托的声明:

public delegate void HouseworkDelegate(string str);

注意:

delegate:是委托的关键字,由上面委托的声明可以看出,它除了多了delegate关键字,其他部分跟方法的声明完全一样

那么上面的例子使用委托后,应该改为:

//声明委托
public delegate void HouseworkDelegate(string str);

//洗菜
public void Washing(string vegetables){
     Console.WriteLine("清洗"+ vegetables);
}

//DoingHousework()拥有一个HouseworkDelegate类型的参数
public void DoingHousework(HouseworkDelegate houseworkDelegate){
    //洗菜
    houseworkDelegate("西红柿");
}

更多委托相关的信息,可以查看另一篇博客:C#中的委托 Delegate(委托 也叫代表,代表一类方法)

4. 事件 event:

如果说 委托 是对方法的抽象(其实是方法的类型);那么事件 则是在委托的基础上 进行了一些特殊的处理,加工

所以 事件 本质还是委托。

4.1. 事件的声明:

public event HousewordDelegate housewordEvent;

注意:

event:是事件的关键字, event后面紧接的是 委托的类型 HousewordDelegate,

所以声明事件之前,必须先声明事件所要使用的Delegate,由声明更可以看出,事件就是加工过后的委托!!

借助Reflactor来对 event的声明语句做一探究,看看为什么会发生这样的错误:

public event GreetingDelegate MakeGreet;

5. 总结:

委托,事件,归根到底其实就是对方法的加工和特殊处理后的产物。

更多内容,请查看:http://www.tracefact.net/csharp-programming/delegates-and-events-in-csharp.aspx

时间: 2024-07-29 13:16:58

C#中的方法(函数),委托和事件的相关文章

PHP5中魔术方法函数有哪几个,请举例说明各自的用法

魔术方法: __construct() :实例化对象时被调用: __destuct():当删除一个对象或者对象操作终止是被执行: __call():调用对象不存在方法时被调用: __get():调用对象不存在的属性时被调用: __set():设置对象不存在的属性时被调用: __toString():打印一个对象时被调用,比如echo $obj,print($obj); __clone():克隆对象时被调用,比如$t = new Test();$tt = clone $t; __sleep():s

python中的嵌套类(内部类调用外部类中的方法函数)

在为书中版本是3.X的,但2.X不太支持直接调用. 所以,在PYTHON2.X中,要在内部类中调用外部类的方法,就必须得实例化外部类,然后,传入实例进行调用. 花了我两个小时啊,资料没找到,自己一个一个想法调试,真的失败了三四十次,PRINT了N多~~~:) class DiagramFactory: @classmethod def make_diagram(Class, width, height): return Class.Diagram(width, height) @classmet

PHP5中魔术方法函数有哪几个

__sleep __wakeup __tostring __set_state __contruct __destruct __call __get __set __isset __unset __clone __autoload

鼠标点击单元格显示在相应文本框中的方法(单元格事件)

1 //点击单元格显示此行相应内容 2 private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 3 { 4 // 找到鼠标点击的行 5 int index = e.RowIndex; 6 DataGridViewRow currenRow = this.dataGridView1.Rows[index]; 7 //找到每一个单元格的值 8 this.textBox2.Text=

C#委托和事件详解

委托Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".它所实现的功能与C/C++中的函数指针十分相似.它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点.首先,函数指针只

转:委托和事件详解

Delegate delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".它所实现的功能与C/C++中的函数指针十分相似.它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比,delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优点.首先,函数指针只能指

c# 委托和事件(总结篇)

c# 委托和事件(总结篇) 概念: delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类.与其它的类不同,delegate类能够 拥有一个签名(signature),并且它"只能持有与它的签名相匹配的方法的引用".它所实现的功能与C/C++中的函数指针 十分相似.它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m.但与函数指针相比, delegate有许多函数委托和事件在 .Net Framework中的应用非常广泛指针不具备的优

浅谈委托,事件,异步调用,回调等概率

直接说题. 委托         首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托.       委托是某一类方法的总定义.    事件           事件是某个类用于传递消息的方式.事件之余委托,犹如属性之余变量即是委托的封装.     好了,明确了概念,接下来说示例.    示例         有3个对象  鼠标,button,winform .鼠标点击button对象,触发button的c

分别用委托和事件和接口实现多窗体间的传值

委托实现多窗口传值的一般流程是1.创建委托类型 private Action<string> AfterMsgSend { get; set; }2.创建窗体对象 ChildFrm frm = new ChildFrm();3.给委托注册方法(追加),注意此处的方法是窗体的方法 即frm.方法 AfterMsgSend += frm.SetText;//窗体打开之前给委托注册方法4.frm.Show();5.触发方法 AfterMsgSend(txtMessage.Text.Trim());