zoukankan      html  css  js  c++  java
  • C#知识点:委托、事件、正则表达式、SVN、找按段等差递增至不变序列的规律



    using
    System; using System.Collections.Generic; using System.Text; namespace Delegate { //定义委托,它定义了可以代表的方法的类型 public delegate void GreetingDelegate(string Greet ,string name); class Program { private static void Greeting(string Greet , string name) { Console.WriteLine(Greet+", " + name); } //注意此方法,它接受一个GreetingDelegate类型的方法作为参数 private static void GreetPeople(string Greet , string name, GreetingDelegate MakeGreeting) { MakeGreeting(Greet , name); } static void Main(string[] args) { GreetPeople("Morning","Jimmy Zhang", Greeting); GreetPeople("早上好","张子阳", Greeting); Console.ReadKey(); } } } 输出如下: Morning, Jimmy Zhang 早上好, 张子阳

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

    既然给委托可以绑定一个方法,那么也应该有办法取消对方法的绑定,很容易想到,这个语法是“-=”:

    使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。

     事件其实没什么不好理解的,声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已。

    Observer设计模式:Observer设计模式是为了定义对象间的一种一对多的依赖关系,以便于当一个对象的状态改变时,其他依赖于它的对象会被自动告知并更新。Observer模式是一种松耦合的设计模式

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Delegate {
        // 热水器
        public class Heater {
           private int temperature;
           public delegate void BoilHandler(int param);   //声明委托
           public event BoilHandler BoilEvent;        //声明事件
    
           // 烧水
           public void BoilWater() {
               for (int i = 0; i <= 100; i++) {
                  temperature = i;
    
                  if (temperature > 95) {
                      if (BoilEvent != null) { //如果有对象注册
                          BoilEvent(temperature);  //调用所有注册对象的方法
                      }
                  }
               }
           }
        }
    
        // 警报器
        public class Alarm {
           public void MakeAlert(int param) {
               Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了:", param);
           }
        }
    
        // 显示器
        public class Display {
           public static void ShowMsg(int param) { //静态方法
               Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", param);
           }
        }
        
        class Program {
           static void Main() {
               Heater heater = new Heater();
               Alarm alarm = new Alarm();
    
               heater.BoilEvent += alarm.MakeAlert;    //注册方法
               heater.BoilEvent += (new Alarm()).MakeAlert;   //给匿名对象注册方法
               heater.BoilEvent += Display.ShowMsg;       //注册静态方法
    
               heater.BoilWater();   //烧水,会自动调用注册过对象的方法
           }
        }
    }
    输出为:
    Alarm:嘀嘀嘀,水已经 96 度了:
    Alarm:嘀嘀嘀,水已经 96 度了:
    Display:水快烧开了,当前温度:96度。
    // 省略...
    

      

     .Net Framework的编码规范:

    • 委托类型的名称都应该以EventHandler结束。
    • 委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
    • 事件的命名为 委托去掉 EventHandler之后剩余的部分。
    • 继承自EventArgs的类型应该以EventArgs结尾。

    再做一下说明:

    1. 委托声明原型中的Object类型的参数代表了Subject,也就是监视对象,在本例中是 Heater(热水器)。回调函数(比如Alarm的MakeAlert)可以通过它访问触发事件的对象(Heater)。
    2. EventArgs 对象包含了Observer所感兴趣的数据,在本例中是temperature。

    上面这些其实不仅仅是为了编码规范而已,这样也使得程序有更大的灵活性。比如说,如果我们不光想获得热水器的温度,还想在Observer端(警报器或者显示器)方法中获得它的生产日期、型号、价格,那么委托和方法的声明都会变得很麻烦,而如果我们将热水器的引用传给警报器的方法,就可以在方法中直接访问热水器了。

    改写之前的范例,让它符合 .Net Framework 的规范:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Delegate {
        // 热水器
        public class Heater {
           private int temperature;
           public string type = "RealFire 001";       // 添加型号作为演示
           public string area = "China Xian";         // 添加产地作为演示
           //声明委托
           public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
           public event BoiledEventHandler Boiled; //声明事件
    
           // 定义BoiledEventArgs类,传递给Observer所感兴趣的信息
           public class BoiledEventArgs : EventArgs {
               public readonly int temperature;
               public BoiledEventArgs(int temperature) {
                  this.temperature = temperature;
               }
           }
    
           // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
           protected virtual void OnBoiled(BoiledEventArgs e) {
               if (Boiled != null) { // 如果有对象注册
                  Boiled(this, e);  // 调用所有注册对象的方法
               }
           }
           
           // 烧水。
           public void BoilWater() {
               for (int i = 0; i <= 100; i++) {
                  temperature = i;
                  if (temperature > 95) {
                      //建立BoiledEventArgs 对象。
                      BoiledEventArgs e = new BoiledEventArgs(temperature);
                      OnBoiled(e);  // 调用 OnBolied方法
                  }
               }
           }
        }
    
        // 警报器
        public class Alarm {
           public void MakeAlert(Object sender, Heater.BoiledEventArgs e) {
               Heater heater = (Heater)sender;     //这里是不是很熟悉呢?
               //访问 sender 中的公共字段
               Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);
               Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.temperature);
               Console.WriteLine();
           }
        }
    
        // 显示器
        public class Display {
           public static void ShowMsg(Object sender, Heater.BoiledEventArgs e) {   //静态方法
               Heater heater = (Heater)sender;
               Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);
               Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);
               Console.WriteLine();
           }
        }
    
        class Program {
           static void Main() {
               Heater heater = new Heater();
               Alarm alarm = new Alarm();
    
               heater.Boiled += alarm.MakeAlert;   //注册方法
               heater.Boiled += (new Alarm()).MakeAlert;      //给匿名对象注册方法
               heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert);    //也可以这么注册
               heater.Boiled += Display.ShowMsg;       //注册静态方法
    
               heater.BoilWater();   //烧水,会自动调用注册过对象的方法
           }
        }
    }
    
    输出为:
    Alarm:China Xian - RealFire 001:
    Alarm: 嘀嘀嘀,水已经 96 度了:
    Alarm:China Xian - RealFire 001:
    Alarm: 嘀嘀嘀,水已经 96 度了:
    Alarm:China Xian - RealFire 001:
    Alarm: 嘀嘀嘀,水已经 96 度了:
    Display:China Xian - RealFire 001:
    Display:水快烧开了,当前温度:96度。
    // 省略 ...

    参考:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx

    正则表达式:

    IP地址(Regex.IsMatch(strIn,@ "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$ ");)

    参考:http://www.cnblogs.com/miniwiki/archive/2010/06/08/1754269.html#undefined

    参考:http://deerchao.net/tutorials/regex/regex.htm

    SVN:http://blog.csdn.net/qing_gee/article/details/47341381

    按段等差递增至不变序列的规律:
     1   try
     2                     {
     3                         if ((UnitPrice <= 0) || (Unit <= 0))
     4                         {
     5                             double[] arrPrice = new double[25];
     6                             double[,] arrNum = new double[6, 25];
     7                             for (int i = 1; i < 25; i++)
     8                                 arrPrice[i] = (double)row["Price" + i.ToString()];
     9                             for (int j = 1; j < 6; j++)
    10                             {
    11                                 for (int i = 0; (i + j+j ) < 25; i++)
    12                                 {
    13                                     arrNum[j, i+1] = arrPrice[i + j+j] - arrPrice[i + j];
    14                                 }
    15                             }
    16                             for (int i = 1; i < arrNum.GetLength(0); i++)
    17                             {
    18                                 int i1 = arrNum.GetLength(0);//6
    19                                 int i2 = arrNum.GetLength(1);//25
    20                                 int Icount1 = 0;
    21                                 int Icount2 = 0;
    22                                 int Icount3 = 0;
    23                                 double  unitPrice = 0;
    24                                
    25                                  for (int j = 1; j < (arrNum.GetLength(1)-2); j++)
    26                                 {                                                                      
    27                                         if ((arrNum[i, j] == 0) && (Icount2==0))
    28                                         {
    29                                             Icount1++;
    30                                         }
    31                                         else if ((arrNum[i, j] == arrNum[i, j + 1]) && (arrNum[i, j + 1] == arrNum[i, j + 1 + 1]) && (arrNum[i, j ] !=0 ))
    32                                         {
    33                                             Icount2++;
    34                                             unitPrice=arrNum[i, j];
    35                                         }
    36                                        else if ((arrNum[i, j+1] == 0) && (arrNum[i, j + 1+1] == 0))
    37                                         { 
    38                                              Icount3++;
    39                                         }
    40                                    }
    41                                  if ((Icount1 + Icount2 + Icount3) == (24 - 2-1))
    42                                  {
    43                                      UnitPrice = unitPrice;
    44                                       Unit = 30 * i;
    45                                      break;
    46                                 }                               
    47                             }
    48                         
    49                         }
    50                     }
    51                     catch (Exception ex)
    52                     {
    53                        
    54                     }


  • 相关阅读:
    我来说说博客评论的事
    SWFUpload+Javascript仿163邮件上传文件
    如何暂停和终止线程
    分享我的数据处理类库,欢迎拍砖
    求数列两两之差,再求和
    poj 1006 中国剩余定理
    Poj算法做题顺序
    poj 1328
    ZOJ 3279
    poj 2352 树状数组
  • 原文地址:https://www.cnblogs.com/2186009311CFF/p/6523936.html
Copyright © 2011-2022 走看看