C#对象的方法与对象的事件方法有何异同.
答案:1 悬赏:60 手机版
解决时间 2021-02-12 00:23
- 提问者网友:遮云壑
- 2021-02-10 23:30
如题
最佳答案
- 五星知识达人网友:往事埋风中
- 2021-02-11 00:04
方法是一个执行可以由对像或类完成的计算或行为的成员。方法有一个形式参数列表(可能为空),一个返回数值(或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)、那楼主你是不是认为,当狗叫的时候,直接调用 【王大妈.看看菜被偷了没();】就可以了?因为这边只有王大妈需要知道“狗有没有叫”这条信息,没有其他人需要知道了,但如果有很多人需要在狗叫的时候做对应的事情,你就必须在“狗叫”的时候写上一堆堆的客户调用代码了。【一大爷.看看鸡被偷了没();】【二大爷.看看饭煮好了没();】... 一堆堆。这样,就变成了狗叫到时候,这些人必须做这些事情了。反之,如果王大妈,一大爷,二大爷都只是注册“狗叫”这个事件的话,那么他们可以随时解除事件关联,也就是说,狗照样叫,但这些大妈大爷们是否需要做他们的事情,是他们自己决定的。。。。
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)、那楼主你是不是认为,当狗叫的时候,直接调用 【王大妈.看看菜被偷了没();】就可以了?因为这边只有王大妈需要知道“狗有没有叫”这条信息,没有其他人需要知道了,但如果有很多人需要在狗叫的时候做对应的事情,你就必须在“狗叫”的时候写上一堆堆的客户调用代码了。【一大爷.看看鸡被偷了没();】【二大爷.看看饭煮好了没();】... 一堆堆。这样,就变成了狗叫到时候,这些人必须做这些事情了。反之,如果王大妈,一大爷,二大爷都只是注册“狗叫”这个事件的话,那么他们可以随时解除事件关联,也就是说,狗照样叫,但这些大妈大爷们是否需要做他们的事情,是他们自己决定的。。。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯