您的位置:首页 > 其它

Delegate与Event的区别[转]

2011-08-25 10:15 260 查看
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
namespace
Delegate_vs_Event
{
class
Program
{
public
delegate
string
TestDelegate(
string
input);
public
static
TestDelegatemyDelegate;
public
static
event
TestDelegatemyEvent;
static
void
Main(
string
[]args)
{
///1.在声明委托和事件的类内部,对于Delegate与Event的实例的初始化和调用操作没有任何区别;
myDelegate=
new
TestDelegate(TestEvent);
myEvent=
new
TestDelegate(TestEvent);
myDelegate(
"Delegate"
);
myEvent(
"Event"
);
Subjectsubject=
new
Subject();
Observerob=
new
Observer(subject);
subject.Start();
Console.Read();
}
static
string
TestEvent(
string
param)
{
Console.WriteLine(
"Hello"
+param);
return
string
.Empty;
}
}
class
Subject
{
public
delegate
void
TestHandleForReg(
string
param);
public
event
TestHandleForRegTestHandleEvent;
public
TestHandleForRegTestHandleDelegate;
public
void
Start()
{
Console.WriteLine(
"Callexternalmethodresult:"
);
TestHandleEvent(
"Start"
);
Console.WriteLine();
///2.对于Delegate与Event的实例,其订阅(Subscribe,即+=)或取消订阅(Unsubscribe,即-=)的操作没有任何区别;
TestHandleDelegate+=Method_Subject1;
TestHandleDelegate+=Method_Subject2;
TestHandleDelegate-=Method_Subject2;
TestHandleEvent+=Method_Subject1;
TestHandleEvent+=Method_Subject2;
TestHandleEvent-=Method_Subject2;
Console.WriteLine(
"Callinternalmethodresultby[Delegate]"
);
TestHandleDelegate(
"Delegate"
);
Console.WriteLine();
Console.WriteLine(
"Callinternalmethodresultby[Event]"
);
TestHandleEvent(
"Event"
);
Console.WriteLine();
}
public
void
Method_Subject1(
string
str)
{
Console.WriteLine(
"Method_Subject1"
);
}
public
void
Method_Subject2(
string
str)
{
Console.WriteLine(
"Method_Subject2"
);
}
public
static
string
Static_Method_Subject()
{
return
"Static_Method_Subject"
;
}
}
class
Observer
{
public
Observer(Subjectsubject)
{
subject.TestHandleEvent+=Method_Observer;
subject.TestHandleDelegate+=Method_Observer;
///3.Delegate与Event唯一区别就在于以下2点:Event提供了更严格的封装访问控制,其目的是为了防止其他类破坏委托的多播链,故不允许在声明事件的类外初始化或调用.
///即除了声明Event的类,其它类只能订阅(Subscribe,即+=)或取消订阅(Unsubscribe,即-=)该Event;
////*1*/
///subject.TestHandleEvent=newSubject.TestHandleForReg(Method_Observer);
///subject.TestHandleDelegate=newSubject.TestHandleForReg(Method_Observer);///Error:Theevent'Delegate_vs_Event.Subject.TestHandleEvent'canonlyappearonthelefthandsideof+=or-=(exceptwhenusedfromwithinthetype'Delegate_vs_Event.Subject')
////*2*/
///subject.TestHandleDelegate("test");
///subject.TestHandleEvent("test");///Error:Theevent'Delegate_vs_Event.Subject.TestHandleEvent'canonlyappearonthelefthandsideof+=or-=(exceptwhenusedfromwithinthetype'Delegate_vs_Event.Subject')
}
public
void
Method_Observer(
string
info)
{
Console.WriteLine(
"Observer'smethod["
+info+
"]"
);
}
}
}
1.在声明委托和事件的类内部,对于Delegate与Event的实例的初始化和调用操作没有任何区别;
2.对于Delegate与Event的实例,其订阅(Subscribe,即+=)或取消订阅(Unsubscribe,即-=)的操作没有任何区别;
3.Delegate与Event唯一区别就在于以下2点:Event提供了更严格的封装访问控制,其目的是为了防止其他类破坏委托的多播链,故不允许在声明事件的类外初始化或调用.即除了声明Event的类,其它类只能订阅(Subscribe,即+=)或取消订阅(Unsubscribe,即-=)该Event;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: