C#方法,属性,和事件

1.7.3 方法
方法是一个执行可以由对像或类完成的计算或行为的成员。方法有一个形式参数列表(可能为空),一个返回数值(或void),并且可以是静态也可以是非静态。静态方法要通过类来访问。非静态方法,也称为实例方法,通过类的实例来访问。

 1 using System;
 2 public class Stack
 3 {
 4 public static Stack Clone(Stack s) {...}
 5 public static Stack Flip(Stack s) {...}
 6 public object Pop() {...}
 7 public void Push(object o) {...}
 8 public override string ToString() {...}
 9 ...
10 }
11 class Test
12 {
13 static void Main() {
14 Stack s = new Stack();
15 for (int i = 1; i < 10; i++)
16 s.Push(i);
17 Stack flipped = Stack.Flip(s);
18 Stack cloned = Stack.Clone(s);
19 Console.WriteLine("Original stack: " + s.ToString());
20 Console.WriteLine("Flipped stack: " + flipped.ToString());
21 Console.WriteLine("Cloned stack: " + cloned.ToString());
22 }
23 }

介绍了Stack,它有许多静态方法(Clone和Flip)和许多实例方法(Push、Pop和ToString)。
方法可以被重复调用,这意味着只要有一个唯一的签名,多个方法可能有相同的名称。方法的签名包括方法、数据、修饰符和它的形式参数的各种类型的名称。方法的签名不包括return类型。

 1 class Test
 2 {
 3     static void F()
 4     {
 5         Console.WriteLine("F()");
 6     }
 7     static void F(object o)
 8     {
 9         Console.WriteLine("F(object)");
10     }
11     static void F(int value)
12     {
13         Console.WriteLine("F(int)");
14     }
15     static void F(int a, int b)
16     {
17         Console.WriteLine("F(int, int)");
18     }
19     static void F(int[] values)
20     {
21         Console.WriteLine("F(int[])");
22     }
23     static void Main()
24     {
25         F();
26         F(1);
27         F((object)1);
28         F(1, 2);
29         F(new int[] { 1, 2, 3 });
30     }
31 }

介绍了有一个成员方法F的类。程序的输出为

1 F()
2 F(int)
3 F(object)
4 F(int, int)
5 F(int[])

1.7.4 属性
属性是提供对对像或类的特性进行访问的成员。属性的例子包括字符串的长度,字体的大小,窗口的焦点,用户的名字,等等。属性是域的自然扩展。两者都是用相关类型成员命名,并且访问域和属性的语法是相同的。然而,与域不同,属性不指示存储位置。作为替代,属性有存取程序,它指定声明的执行来对他们的进行读或写。
属性是由属性声明定义的。属性声明的第一部分看起来和域声明相当相似。第二部分包括一个get存取程序和一个set存取程序。在下面的例子类Button定义了一个Caption属性。 

 1 public class Button
 2 {
 3     private string caption;
 4     public string Caption
 5     {
 6         get
 7         {
 8             return caption;
 9         }
10         set
11         {
12             caption = value;
13             Repaint();
14         }
15     }
16 }

像Caption属性一样的读写都可以的属性包括get和set存取程序。当属性的值要被读出的时候,会调用get存取程序;当要写属性值的时候,会调用set存取程序。 Properties 在set存取程序中,属性的新值赋给一个名为value的隐含参数。
属性的声明是相对直接了当的,但是属性显式它自己的数值是在使用的时候而不是在声明的时候。可以按照对域进行读写的方法来读写Caption属性:

1 Button b = new Button();
2 b.Caption = "ABC"; // set
3 string s = b.Caption; // get
4 b.Caption += "DEF”; // get & set

1.7.5 事件
事件是使得对像和类提供通知的成员。一个类通过提供事件声明来定义一个事件,这看起来与域和事件声明相当类似,但是有一个event关键字。这个声明的类型必须是delegate类型。 
在这个例子中

1 public delegate void EventHandler(object sender, Event e);
2 public class Button
3 {
4     public event EventHandler Click;
5     public void Reset()
6     {
7         Click = null;
8     }
9 }

Button类定义了一个类型为EventHandler的Click事件。在Button类中,Click成员与一个EventHandler类型的私有域相对应。然而,在Button类外,Click成员只能用在+=和-=操作符的左边。这在添加和删除事件句柄方面限制客户代码。例子

 1 using System;
 2 public class Form1 
 3 {
 4 public Form1() {
 5 // Add Button1_Click as an event handler for Button1’s Click event
 6 Button1.Click += new EventHandler(Button1_Click);
 7 }
 8 Button Button1 = new Button();
 9 void Button1_Click(object sender, Event e) {
10 Console.WriteLine("Button1 was clicked!");
11 }
12 public void Disconnect() {
13 Button1.Click -= new EventHandler(Button1_Click);
14 }
15 }

介绍了类Form1,它为Button1的Click事件添加了Button1_Click作为事件句柄。在Disconnect方法中,去掉了事件句柄。
如例子中所示,类Button需要被重写来使用像属性一样的事件声明而不是像域一样的事件声明。

 1 public class Button 
 2 {
 3 public event EventHandler Click {
 4 get {...}
 5 set {...}
 6 }
 7 public void Reset() {
 8 Click = null;
 9 }
10 }

这个改变不会影响到客户代码,但是因为Click的事件句柄不需要用域来实现,所以允许类Button的执行更灵活。 

转自http://blog.csdn.net/chenyuling/article/details/1569590

原文地址:https://www.cnblogs.com/Kekeluotu/p/4739258.html