一個事件是一個使對象或類可以提供公告的成員
一個事件聲明既可以是一個事件域聲明也可以是事件屬性聲明
一個事件聲明的類型必須是一個代表類型
一個事件域聲明與一個聲明了一個或多個代表類型域的域聲明相應
一個事件屬性聲明與聲明了一個代表類型屬性的屬性聲明相應
在包含一個事件成員聲明的類或結構的程序文字中
如果一個類或結構的程序文字外面包含一個事件成員聲明
由於+= 和
在例子中
public delegate void EventHandler(object sender
public class Button: Control
{
public event EventHandler Click;
protected void OnClick(Event e) {
if (Click != null) Click(this
}
public void Reset() {
Click = null;
}
}
對使用Button類中的Click事件域沒有限制
在類Button的聲明外面
b
它把一個代表附加到事件Click的調用列表中
b
它把一個代表從Click事件的調用列表中刪除
在一個形式為x += y 或 x
下面的例子介紹了事件句柄如何附加到上面的類Button的實例中
public class LoginDialog: Form
{
Button OkButton;
Button CancelButton;
public LoginDialog() {
OkButton = new Button(
OkButton
CancelButton = new Button(
CancelButton
}
void OkButtonClick(object sender
// Handle OkButton
}
void CancelButtonClick(object sender
// Handle CancelButton
}
}
這裡
事件成員是典型域
在例子中
class Control: Component
{
// Unique keys for events
static readonly object mouseDownEventKey = new object();
static readonly object mouseUpEventKey = new object();
// Return event handler associated with key
protected Delegate GetEventHandler(object key) {
// Set event handler associated with key
protected void SetEventHandler(object key
// MouseDown event property
public event MouseEventHandler MouseDown {
get {
return (MouseEventHandler)GetEventHandler(mouseDownEventKey);
}
set {
SetEventHandler(mouseDownEventKey
}
}
// MouseUp event property
public event MouseEventHandler MouseUp {
get {
return (MouseEventHandler)GetEventHandler(mouseUpEventKey);
}
set {
SetEventHandler(mouseUpEventKey
}
}
}
類Control為事件提供了一種內部存儲機制
當一個構造函數沒有構造初始化函數或一個形式為base(
構造函數執行
可以把一個實例變量初始化函數和一個構造函數初始化函數
using System
class A
{
int x =
public A() {
count =
}
public A(int n) {
count = n;
}
}
class B: A
{
double sqrt
ArrayList items = new ArrayList(
int max;
public B(): this(
items
}
public B(int n): base(n
max = n;
}
}
包含了許多變量初始化函數
using System
class A
{
int x
public A() {
x =
y =
object(); // Invoke object() constructor
count =
}
public A(int n) {
x =
y =
object(); // Invoke object() constructor
count = n;
}
}
class B: A
{
double sqrt
ArrayList items;
int max;
public B(): this(
B(
items
}
public B(int n): base(n
sqrt
items = new ArrayList(
A(n
max = n;
}
}
注意變量初始化函數被轉換為賦值語句
class A
{
public A() {
PrintFields();
}
public virtual void PrintFields() {}
}
class B: A
{
int x =
int y;
public B() {
y =
}
public override void PrintFields() {
Console
}
}
當new B() 被用來創建B的實例時
x =
因為變量初始化函數在基類構造函數被調用前執行
默認構造函數
如果一個類不包含任何構造函數聲明
public C(): base() {}
這裡C是類的名稱
class Message
{
object sender;
string text;
}
因為類不包含構造函數聲明
class Message
{
object sender;
string text;
public Message(): base() {}
}
私有構造函數
當一個類只聲明了私有的構造函數時
public class Trig
{
private Trig() {} // Prevent instantiation
public const double PI =
public static double Sin(double x) {
public static double Cos(double x) {
public static double Tan(double x) {
}
可選的構造函數參數
構造函數的this(
class Text
{
public Text(): this(
public Text(int x
public Text(int x
// Actual constructor implementation
}
}前兩個構造函數只是為丟失的參數提供了默認的數值
Text t
Text t
Text t
析構函數
析構函數是一個實現破壞一個類的實例的行為的成員
一個析構函數聲明的標識符必須為聲明析構函數的類命名
析構函數聲明的主體指定了為了對類的新實例進行初始化而執行的語句
例子
class Test
{
static void Main() {
A
B
}
}
class A
{
static A() {
Console
}
public static void F() {
Console
}
}
class B
{
static B() {
Console
}
public static void F() {
Console
}
}
會產生或者是下面的輸出
Init A
A
Init B
B
或者是下面的輸出
Init B
Init A
A
B
From:http://tw.wingwit.com/Article/program/net/201311/12463.html