C#方法,屬性,和事件

1.7.3 方法
方法是一個執行可以由對像或類完成的計算或行爲的成員。方法有一個形式參數列表(可能爲空),一個返回數值(或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[])


1.7.4 屬性
屬性是提供對對像或類的特性進行訪問的成員。屬性的例子包括字符串的長度,字體的大小,窗口的焦點,用戶的名字,等等。屬性是域的自然擴展。兩者都是用相關類型成員命名,並且訪問域和屬性的語法是相同的。然而,與域不同,屬性不指示存儲位置。作爲替代,屬性有存取程序,它指定聲明的執行來對他們的進行讀或寫。
屬性是由屬性聲明定義的。屬性聲明的第一部分看起來和域聲明相當相似。第二部分包括一個get存取程序和一個set存取程序。在下面的例子類Button定義了一個Caption屬性。
public class Button
{
private string caption;
public string Caption {
get {
return caption;
}
set {
caption = value;
Repaint();
}
}
}
像Caption屬性一樣的讀寫都可以的屬性包括get和set存取程序。當屬性的值要被讀出的時候,會調用get存取程序;當要寫屬性值的時候,會調用set存取程序。 Properties 在set存取程序中,屬性的新值賦給一個名爲value的隱含參數。
屬性的聲明是相對直接了當的,但是屬性顯式它自己的數值是在使用的時候而不是在聲明的時候。可以按照對域進行讀寫的方法來讀寫Caption屬性:
Button b = new Button();
b.Caption = "ABC"; // set
string s = b.Caption; // get
b.Caption += "DEF”; // get & set


1.7.5 事件
事件是使得對像和類提供通知的成員。一個類通過提供事件聲明來定義一個事件,這看起來與域和事件聲明相當類似,但是有一個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的執行更靈活。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章