永发信息网

C#对象的方法与对象的事件方法有何异同.

答案:1  悬赏:60  手机版
解决时间 2021-02-12 00:23
如题
最佳答案
方法是一个执行可以由对像或类完成的计算或行为的成员。方法有一个形式参数列表(可能为空),一个返回数值(或void),并且可以是静态也可以是非静态。静态方法要通过类来访问。非静态方法,也称为实例方法,通过类的实例来访问。例子
using System;
public class Stack
{
public static Stack Clone(Stack s) {...}
public static Stack Flip(Stack s) {...}
public object Pop() {...}
public void Push(object o) {...}
public override string ToString() {...}
...
}
class Test
{
static void Main() {
Stack s = new Stack();
for (int i = 1; i < 10; i++)
s.Push(i);
Stack flipped = Stack.Flip(s);
Stack cloned = Stack.Clone(s);
Console.WriteLine("Original stack: " + s.ToString());
Console.WriteLine("Flipped stack: " + flipped.ToString());
Console.WriteLine("Cloned stack: " + cloned.ToString());
}
}
介绍了Stack,它有许多静态方法(Clone和Flip)和许多实例方法(Push、Pop和ToString)。
方法可以被重复调用,这意味着只要有一个唯一的签名,多个方法可能有相同的名称。方法的签名包括方法、数据、修饰符和它的形式参数的各种类型的名称。方法的签名不包括return类型。例子
class Test
{
static void F() {
Console.WriteLine("F()");
}
static void F(object o) {
Console.WriteLine("F(object)");
}
static void F(int value) {
Console.WriteLine("F(int)");
}
static void F(int a, int b) {
Console.WriteLine("F(int, int)");
}
static void F(int[] values) {
Console.WriteLine("F(int[])");
}
static void Main() {
F();
F(1);
F((object)1);
F(1, 2);
F(new int[] {1, 2, 3});
}
}
介绍了有一个成员方法F的类。程序的输出为
F()
F(int)
F(object)
F(int, int)
F(int[])
事件是使得对像和类提供通知的成员。一个类通过提供事件声明来定义一个事件,这看起来与域和事件声明相当类似,但是有一个event关键字。这个声明的类型必须是delegate类型。
在这个例子中
public delegate void EventHandler(object sender, Event e);
public class Button
{
public event EventHandler Click;
public void Reset() {
Click = null;
}
}
Button类定义了一个类型为EventHandler的Click事件。在Button类中,Click成员与一个EventHandler类型的私有域相对应。然而,在Button类外,Click成员只能用在+=和-=操作符的左边。这在添加和删除事件句柄方面限制客户代码。例子
using System;
public class Form1
{
public Form1() {
// Add Button1_Click as an event handler for Button1’s Click event
Button1.Click += new EventHandler(Button1_Click);
}
Button Button1 = new Button();
void Button1_Click(object sender, Event e) {
Console.WriteLine("Button1 was clicked!");
}
public void Disconnect() {
Button1.Click -= new EventHandler(Button1_Click);
}
}
介绍了类Form1,它为Button1的Click事件添加了Button1_Click作为事件句柄。在Disconnect方法中,去掉了事件句柄。
如例子中所示,类Button需要被重写来使用像属性一样的事件声明而不是像域一样的事件声明。
public class Button
{
public event EventHandler Click {
get {...}
set {...}
}
public void Reset() {
Click = null;
}
}
这个改变不会影响到客户代码,但是因为Click的事件句柄不需要用域来实现,所以允许类Button的执行更灵活
再举个例子,假设当狗叫的时候,王大妈就要去看看菜有没有被偷了,那么本例中,“狗叫”就相当于事件,“王大妈”就是客户代码。“看看菜是否被偷”就是事件处理回调(callback)、那楼主你是不是认为,当狗叫的时候,直接调用 【王大妈.看看菜被偷了没();】就可以了?因为这边只有王大妈需要知道“狗有没有叫”这条信息,没有其他人需要知道了,但如果有很多人需要在狗叫的时候做对应的事情,你就必须在“狗叫”的时候写上一堆堆的客户调用代码了。【一大爷.看看鸡被偷了没();】【二大爷.看看饭煮好了没();】... 一堆堆。这样,就变成了狗叫到时候,这些人必须做这些事情了。反之,如果王大妈,一大爷,二大爷都只是注册“狗叫”这个事件的话,那么他们可以随时解除事件关联,也就是说,狗照样叫,但这些大妈大爷们是否需要做他们的事情,是他们自己决定的。。。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
如何有好人缘 我的交际能力很差
列式计算:①一个数的23
福力得地板我想知道这个在什么地方
谁帮我取个炫舞类似“花花花,如梦”这样的名
白马渡邮政所地址有知道的么?有点事想过去
华为g7显示phone locked
某地某年8月发生了一起由食用蛋、奶糖制作雪
有利于祛除雀斑食物有哪些?
今天我过生日,老爸给我买了一架飞机,我开飞
中国邮政(祥霖铺邮政支局)地址在什么地方,我
宁夏职业技术学院新校区怎么去啊,有知道地址
自己房子不小心失火了连别人的房子一烧了怎么
《死神雇佣兵》txt全集下载
关于车辆未办理过户的系列问题
艾美秀化妆·造型怎么去啊,有知道地址的么
推荐资讯
瑞豪专业烫染连锁(驷马桥店)地址有知道的么?
中石化森美(永定恒发站2加油站)地址有知道的
我想去纹身求八个字关于兄弟的,或者其他的比
富源便利超市地址有知道的么?有点事想过去
瑞风发动机灯怠速常亮加油一闪一闪
深圳市易省油节能科技有限公司在哪里啊,我有
头发刚烫完20天左右可以把头发帘软化吗?
油石放水还是放油?
dnf瞎子打光卢克需要注意什么
书虫读后感500字以上,急需!!!
【我没有办法忍耐下去 用英语怎么说】
耳麦的麦克不出声了,昨天摔断了,哪位会修,
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?