using System;
class DChatServer {
public delegate void OnMsgArrived(String message);
private static OnMsgArrived onMsgArrived;
private DChatServer() {}
public static void ClientConnect(OnMsgArrived onMsgArrived) {
DChatServer.onMsgArrived = (OnMsgArrived)
Delegate.Combine(DChatServer.onMsgArrived, onMsgArrived);
}
public static void ClientDisconnect(OnMsgArrived onMsgArrived) {
DChatServer.onMsgArrived = (OnMsgArrived)
Delegate.Remove(DChatServer.onMsgArrived, onMsgArrived);
}
public static void SendMsg(String msg) {
SendMsg(msg, null);
}
public static void SendMsg(String msg, Object excludeClient) {
if (excludeClient == null) {
onMsgArrived(msg);
///////////////////////////////////////////////////////////////////////////////////
//疑问:为什么在程序运行到此处时直接调用了 private void onMsgArrived(String msg)此事件?((OnMsgArrived) DelegateList[i])(msg);同样效果。难道public delegate void OnMsgArrived(String message);定义的代理指向该方法吗?可是他们不再同一个类里?此例子出处为,Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Technologies\DelegatesAndEvents
//////////////////////////////////////////////////////////
} else {
Delegate[] DelegateList = onMsgArrived.GetInvocationList();
for (int i = 0; i < DelegateList.Length; i++) {
if (DelegateList[i].Target != excludeClient) {
((OnMsgArrived) DelegateList[i])(msg);
}
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
class DChatClient {
private void onMsgArrived(String msg) {
Console.WriteLine("Msg arrived (Client {0}): {1}", clientName, msg);
}
private String clientName;
public DChatClient(String clientName) {
this.clientName = clientName;
DChatServer.ClientConnect(new DChatServer.OnMsgArrived(onMsgArrived));
}
public void Dispose() {
DChatServer.ClientDisconnect(new DChatServer.OnMsgArrived(onMsgArrived));
GC.SuppressFinalize(this);
}
~DChatClient() {
Dispose();
}
}
///////////////////////////////////////////////////////////////////////////////
class Application {
private static void DelegateChatServerDemo() {
Console.WriteLine("Demo start: Delegate Chat Server.");
DChatClient cc1 = new DChatClient("1");
DChatClient cc2 = new DChatClient("2");
DChatClient cc3 = new DChatClient("3");
DChatServer.SendMsg("Hi to all clients");
DChatServer.SendMsg("Hi to all clients except client 2", cc2);
cc1.Dispose();
cc2.Dispose();
cc3.Dispose();
Console.WriteLine("Demo stop: Delegate Chat Server.");
}
public static void Main() {
DelegateChatServerDemo();
Console.ReadLine();
}
}
class DChatServer {
public delegate void OnMsgArrived(String message);
private static OnMsgArrived onMsgArrived;
private DChatServer() {}
public static void ClientConnect(OnMsgArrived onMsgArrived) {
DChatServer.onMsgArrived = (OnMsgArrived)
Delegate.Combine(DChatServer.onMsgArrived, onMsgArrived);
}
public static void ClientDisconnect(OnMsgArrived onMsgArrived) {
DChatServer.onMsgArrived = (OnMsgArrived)
Delegate.Remove(DChatServer.onMsgArrived, onMsgArrived);
}
public static void SendMsg(String msg) {
SendMsg(msg, null);
}
public static void SendMsg(String msg, Object excludeClient) {
if (excludeClient == null) {
onMsgArrived(msg);
///////////////////////////////////////////////////////////////////////////////////
//疑问:为什么在程序运行到此处时直接调用了 private void onMsgArrived(String msg)此事件?((OnMsgArrived) DelegateList[i])(msg);同样效果。难道public delegate void OnMsgArrived(String message);定义的代理指向该方法吗?可是他们不再同一个类里?此例子出处为,Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Technologies\DelegatesAndEvents
//////////////////////////////////////////////////////////
} else {
Delegate[] DelegateList = onMsgArrived.GetInvocationList();
for (int i = 0; i < DelegateList.Length; i++) {
if (DelegateList[i].Target != excludeClient) {
((OnMsgArrived) DelegateList[i])(msg);
}
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
class DChatClient {
private void onMsgArrived(String msg) {
Console.WriteLine("Msg arrived (Client {0}): {1}", clientName, msg);
}
private String clientName;
public DChatClient(String clientName) {
this.clientName = clientName;
DChatServer.ClientConnect(new DChatServer.OnMsgArrived(onMsgArrived));
}
public void Dispose() {
DChatServer.ClientDisconnect(new DChatServer.OnMsgArrived(onMsgArrived));
GC.SuppressFinalize(this);
}
~DChatClient() {
Dispose();
}
}
///////////////////////////////////////////////////////////////////////////////
class Application {
private static void DelegateChatServerDemo() {
Console.WriteLine("Demo start: Delegate Chat Server.");
DChatClient cc1 = new DChatClient("1");
DChatClient cc2 = new DChatClient("2");
DChatClient cc3 = new DChatClient("3");
DChatServer.SendMsg("Hi to all clients");
DChatServer.SendMsg("Hi to all clients except client 2", cc2);
cc1.Dispose();
cc2.Dispose();
cc3.Dispose();
Console.WriteLine("Demo stop: Delegate Chat Server.");
}
public static void Main() {
DelegateChatServerDemo();
Console.ReadLine();
}
}
是分少还是题太简单呀?
自己顶了!
好冷场呀!
谢谢了!
顶也给分
C#技术内幕中介绍了.