文件Connection.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;namespace Ch13Ex02
{
public delegate void MessageHandler(string messageText);
public class Connection
{
public event MessageHandler MessageArrived;
private Timer pollTimer;
public Connection()
{
pollTimer = new Timer(100);
pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
}
public void Connect()
{
pollTimer.Start();
}
public void Disconnect()
{
pollTimer.Stop();
}
private static Random random = new Random();
private void CheckForMessage(object source, ElapsedEventArgs e)
{
Console.WriteLine("Checking for new mesages.");
if ((random.Next(9) == 0) && (MessageArrived != null))
{
MessageArrived("Hello Mum!");
}
}
}}
文件Display:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Ch13Ex02
{
public class Display
{
public void DisplayMessage(string message)
{
Console.WriteLine("Message arrived:{0}", message);
}
}
}
文件:Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Ch13Ex02
{
class Program
{
static void Main(string[] args)
{
Connection myConnection = new Connection();
Display myDisplay = new Display();
myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage);
myConnection.Connect();
Console.ReadKey();
}
}
}
我不知道当Program中创建一个Connection的对象之后Connection类if ((random.Next(9) == 0) && (MessageArrived != null))中的MessageArrived是怎么判断是否是空值的,请教各位
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;namespace Ch13Ex02
{
public delegate void MessageHandler(string messageText);
public class Connection
{
public event MessageHandler MessageArrived;
private Timer pollTimer;
public Connection()
{
pollTimer = new Timer(100);
pollTimer.Elapsed += new ElapsedEventHandler(CheckForMessage);
}
public void Connect()
{
pollTimer.Start();
}
public void Disconnect()
{
pollTimer.Stop();
}
private static Random random = new Random();
private void CheckForMessage(object source, ElapsedEventArgs e)
{
Console.WriteLine("Checking for new mesages.");
if ((random.Next(9) == 0) && (MessageArrived != null))
{
MessageArrived("Hello Mum!");
}
}
}}
文件Display:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Ch13Ex02
{
public class Display
{
public void DisplayMessage(string message)
{
Console.WriteLine("Message arrived:{0}", message);
}
}
}
文件:Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Ch13Ex02
{
class Program
{
static void Main(string[] args)
{
Connection myConnection = new Connection();
Display myDisplay = new Display();
myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage);
myConnection.Connect();
Console.ReadKey();
}
}
}
我不知道当Program中创建一个Connection的对象之后Connection类if ((random.Next(9) == 0) && (MessageArrived != null))中的MessageArrived是怎么判断是否是空值的,请教各位
解决方案 »
- 取消没有起作用!
- debug 在线修改的问题
- 如何捕获另一个方法的异常
- c# 中实现 选中 excel 的sheet 的问题
- 如何将system.windows.forms.datagrid中的checkbox设置为灰色。
- C#调用C++的dll出现CrossThreadMessagingException异常
- 怎么判断一个应用程序是Web应用程序还是Windows应用程序?
- 自定义菜单项,如何才能作出没有浮雕效果的菜单,就像vs.net一样的2d边框
- 怎样用按钮控制for循环,使他循环中断、暂停、继续??
- 请问各位有没有用mouse任意画mouse轨迹的例子?
- 如何获得被拖拉文件的路径?
- c#界面设计
这句话就会在MessageArrived事件列表中添加一个事件处理函数,即myDisplay中的DisplayMessage事件。事实上,并不是所有的调用方都必须对事件进行订阅,也就是说,myConnection.MessageArrived += new MessageHandler(myDisplay.DisplayMessage); 这句话可有可无。那么在没有这句话的时候,也就是调用方并没有去订阅事件,那么MessageArrived事件列表中没有事件处理函数,也就为空了。因此,在使用MessageArrived之前必须判断其是否为空。楼主可以参考一下这篇文章:
http://www.sunnychen.org/chinese/article.asp?id=17
if ((random.Next(9) == 0) && (MessageArrived != null))
{
if(MessageArrived!=null)//这里就是判断事件是否为空
{
MessageArrived("Hello Mum!");
}
}
建议定义事件的时候首字母最好不要大写,或者以On开始都可以,你这样变量名称和委托的名称一致了,虽然一般不会出什么问题,不过这样感觉不是很好.
public event MessageHandler messageArrived;
上面:
new MessageHandler(myDisplay.DisplayMessage);
这个new的过程,已经把两个对象建立了联系当定义委托的地方,没有检查到有关联时当然会返回null
在定义委托的地方,就像有一张表一样,这个表里面存放了所有委托的关联列表
楼主可以看到c#中是用+、-号来关联和取消关联事件的,vb.net里面是addhandler和removehandler
上面:
new MessageHandler(myDisplay.DisplayMessage);
这个new的过程,已经把两个对象建立了联系 当定义委托的地方,没有检查到有关联时当然会返回null
在定义委托的地方,就像有一张表一样,这个表里面存放了所有委托实例的关联列表
楼主可以看到c#中是用+、-号来关联和取消关联事件的,vb.net里面是addhandler和removehandler