读书人

初学C#求指导、求优化、求砖。该如何解

发布时间: 2012-05-23 13:44:13 作者: rapoo

初学C#求指导、求优化、求砖。
今天看了“张子阳”的《C#委托和事件》教程,学着做了一个探头监控报警程序。
使用了Observer模式,但里面还是有不少的if判断,求各路神仙指点。谢谢!!

C# code
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Timers;namespace DetectorAlarm{    /// <summary>    /// 温湿度报警程序    /// </summary>    class Program    {        static void Main(string[] args)        {            Detector detector = new Detector();            SMSAlert sms = new SMSAlert();            DeviceAlert device = new DeviceAlert();            ServerAlert server = new ServerAlert();            detector.MonitorFaild += sms.SendSMS;            detector.MonitorFaild += device.DoAlert;            detector.MonitorFaild += server.DoAlert;            detector.DoMonitor();            Console.ReadLine();        }    }    /// <summary>    /// 枚举类型    /// </summary>    enum DetectorEventType    {        Normal = 0,        TemperatureHigh = 2,        TemperatureLow = 4,        HumidityHigh = 8,        HumidityLow= 16          }    /// <summary>    /// 探头对象    /// </summary>    class Detector    {        #region 内部成员        //探头参数:绑定的设备号,设备IP,通道号,楼层,所在地点        private int _detectorID = 0;        private int _deviceNo;        private string _deviceIP;        private int _channel;        private string _floor;        private string _place;        //内部参数:温/湿度当前值,报警上下限        private double _temperature;        private double _humidity;        private double _minTemperature;        private double _maxTemperature;        private double _minHumidity;        private double _maxHumidity;        #endregion        #region 只读属性        public int DeviceNo        {            get { return _deviceNo; }        }        public string DeviceIP        {            get { return _deviceIP; }        }        public int Channel        {            get { return _channel; }        }        public double Temperature        {            get { return _temperature; }        }        public double Humidity        {            get { return _humidity; }        }        #endregion        #region 事件与委托定义        //声明委托        public delegate void MonitorEventHandler(Object sender, MonitorEventArgs e);        //声明事件        public event MonitorEventHandler MonitorFaild;        /// <summary>        /// MonitorEventArgs类,用于传递参数        /// </summary>        public class MonitorEventArgs:EventArgs        {            public readonly double temperature;            public readonly double humidity;            public readonly int eventType;            public MonitorEventArgs(int eventType, double temperature, double humidity)            {                this.eventType = eventType;                this.temperature = temperature;                this.humidity = humidity;            }        }        #endregion        #region 自定义事件        /// <summary>        /// 温度过高        /// </summary>        /// <param name="e"></param>        protected virtual void OnMonitorFaild(MonitorEventArgs e)        {            if (MonitorFaild != null)            {                MonitorFaild(this, e);            }        }        #endregion        #region 公共方法        public void DoMonitor()        {            //从数据库读取探头信息            if(_detectorID==0)            {                GetDetectorInfo();            }            System.Timers.Timer timer = new System.Timers.Timer();            timer.Interval = 6000;            timer.Enabled = true;            timer.Elapsed += new ElapsedEventHandler(GetDetectorInfoByID);            timer.Start();        }        #endregion        #region 私有方法        /// <summary>        /// 获取探头信息        /// </summary>        private void GetDetectorInfo()        {            _detectorID = 1;            _deviceIP = "192.168.1.195";            _deviceNo = 1;            _floor = "一楼";            _channel = 1;            _place = "实验室";            _temperature = 28.0;            _humidity = 80.0;            _minTemperature = 25.0;            _maxTemperature = 30.0;            _minHumidity = 60.0;            _maxHumidity = 90.0;        }        /// <summary>        /// 获取温湿度信息        /// </summary>        private void GetDetectorInfoByID(object source, ElapsedEventArgs e)        {            Random random = new Random();            _temperature = random.Next(1,100);            _humidity = random.Next(1,100);            int detectorAlarmType = 0;            //判断温湿度,触发对应事件            if(_temperature > _maxTemperature)            {                detectorAlarmType += (int)DetectorEventType.TemperatureHigh;            }            if(_temperature < _minTemperature)            {                detectorAlarmType += (int)DetectorEventType.TemperatureLow;            }            if(_humidity > _maxHumidity)            {                detectorAlarmType += (int)DetectorEventType.HumidityHigh;            }            if(_humidity < _minHumidity)            {                detectorAlarmType += (int)DetectorEventType.HumidityLow;            }            Console.WriteLine("当前温度{0}℃,湿度{1}%", _temperature, _humidity);            MonitorEventArgs ev = new MonitorEventArgs(detectorAlarmType, _temperature, _humidity);            OnMonitorFaild(ev);        }        #endregion    }    /// <summary>    /// 短信报警    /// </summary>    class SMSAlert    {        public void SendSMS(Object sender,Detector.MonitorEventArgs e)        {            Detector dt = (Detector) sender;            Console.WriteLine("短信报警:设备IP:{0},警报代码:{1},警报内容:{2},当前温度{3}℃,湿度{4}%。", dt.DeviceIP,e.eventType, DeCode(e.eventType), e.temperature, e.humidity);        }        /// <summary>        /// 警报代码解析        /// </summary>        /// <param name="iCode"></param>        /// <returns></returns>        private string DeCode(int iCode)        {            string strCode = Convert.ToString(iCode, 2).PadLeft(8, '0');            string result = "温度正常";            if (strCode.Substring(6, 1) == "1")            {                result = "温度过高";            }            else if (strCode.Substring(5, 1) == "1")            {                result = "温度过低";            }            if (strCode.Substring(4, 1) == "1")            {                result += "、湿度过高";            }            else if (strCode.Substring(3, 1) == "1")            {                result += "、湿度过低";            }            else            {                result += "、湿度正常";            }            return result;        }    }    /// <summary>    /// 设备上的警号报警    /// </summary>    class DeviceAlert    {        public void DoAlert(Object sender, Detector.MonitorEventArgs e)        {            Detector dt = (Detector) sender;            Console.WriteLine("设备呱呱叫了。");        }    }    /// <summary>    /// 服务器上的警号报警    /// </summary>    class ServerAlert    {        public void DoAlert(Object sender, Detector.MonitorEventArgs e)        {            Detector dt = (Detector)sender;            Console.WriteLine("服务器哇哇叫了。");            Console.WriteLine("");        }    }} 



[解决办法]
怎么了,if判断怎么了,有什么疑问
[解决办法]
是啊,你完全可以用数组:
C# code
string[] ErrMessage = { "温度正常", "温度过高", "温度过低", ... };string result = string.Join("、", Enumerable.Range(-1, 6).Select(x => iCode | (1 << x) == iCode ? ErrMessage[x - 1] : "").Where(x => x != ""));
[解决办法]
switch
case
效率高些
[解决办法]
private int GetDetectorAlarmTypeCode()
{
int detectorAlarmType = 0;
detectorAlarmType += CalcValue(_temperature, _maxTemperature, (int)DetectorEventType.TemperatureHigh);
detectorAlarmType += CalcValue(_minTemperature, _temperature, (int)DetectorEventType.TemperatureLow);
detectorAlarmType += CalcValue(_humidity, _maxHumidity, (int)DetectorEventType.HumidityHigh);
detectorAlarmType += CalcValue(_minHumidity, _humidity, (int)DetectorEventType.HumidityLow);
return detectorAlarmType;
}

====================================
我觉得方法应该尽量通用且有意义,
这个方法的返回值有什么意义呢?

读书人网 >C#

热点推荐