c#设计模式第一天

  最近在升级软件版本,升级是一件让我非常头疼的事情,里面太过于复杂,每次都得要重新理一次,自己也不得不承认自己的设计不合理,后来读了一些设计模式的文章觉得受益匪浅,设计模式是软件的灵魂所在,精华的总结,很长一段时间自己在看别人源码的时候什么bll,DAL,之类的文件夹,当时很不解为什么要这么做,尽管自己也去用一些比如数据库多支持之类的类,为什么人家用接口,当时觉得自己按照自己的想法,没必要用这些,非常遗憾过了三年自己猜领悟接口与设计模式的重要性,以及为何要用它,今天开始自己记录下自己的每日总结,并把一些经验与大家一起分享,作为一个自学者,相信会引起自学者的共鸣,欢迎大家跟我一起学设计模式,我会把自己的理解分享给大家

今天第一次阅读,还没进入正文,那先说说我对泛型和lamp表达式的一些简单的理解吧,以后写的多数都是来自设计模式一书的例子,记录出来主要1是为了自己学习的进度,2是方便自己复习

例子是最好的说明

先看一段代码

  public static class EnumerableHelper
    {
        /// <summary>
        /// Execute Action for each element in <see cref="IEnumerable<T>"/>
        /// </summary>
        public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action)
        {
            if (sequence == null)
                throw new ArgumentNullException("sequence");
            if (action == null)
                throw new ArgumentNullException("action");
            foreach (var item in sequence)
                action(item);
        }

      
    }

  这是来自设计模式一文作者的部分源码

首先这个类定义了一个泛型方法,需要 using System.Linq;

有了这个之后,它像什么呢,像http://bbs.csdn.net/topics/390162519这篇文章里面的扩展类的使用,其实我理解是一个道理

using System;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public static class Extensions
    {
        public static void SafeCall(this Control ctrl, Action callback)
        {
            if (ctrl.InvokeRequired)
                ctrl.Invoke(callback);
            else
                callback();
        }
    }
}

  这样子,那么调用时候点一下就有

label1.SafeCall(() =>
                    {
                        label1.Text = i.ToString();
                    });

  

其实他对Ctrol做了一个扩展,你可以把Control是所有控件泛型一样,这里定义了一个泛型之后,那么所有类型都会具备这么个方法了,于是乎我们就有了这样的调用

  string[] data = { "A", "B", "CDE", "FG" };
            int[] lens = new int[data.Length];
            int i = 0;
            //第一种用法,对于泛型可以支持所有,所以它也会有这样的扩展
            data.ForEach(
                 delegate(string item)
                 {
                     lens[i++] = item.Length;
                     Trace.WriteLine(lens[i - 1]);
                 });

  如果我按照以前的思维调用是

            EnumerableHelper.ForEach<string>(data,
                delegate(string item)
                {
                    lens[i++] = item.Length;
                    Trace.WriteLine(lens[i - 1]);
                });

  那么再看,其实泛型经常与lamp表达式搭配

怎么改写成lamp表达式

   data.ForEach(
               t =>
               {
                   lens[i++] = t.Length;
                   Trace.WriteLine(lens[i - 1]);
               }
                );

  或者

data.ForEach(
(t) => { lens[i++] = t.Length; Trace.WriteLine(lens[i - 1]); }
);


  

其实是一个道理,很少写文章,我表达的意思不知道大家可否看得明白

 

 

另外给大家说一个关键字params这个我平时用的比较少,今天也算遇到,我想或许以后数据库操作参数一类会用到或者自己扩展,其实这个参数我估计大家都遇到过,就是在数据库通用类之类的地方相信大家估计只用却很少留意

它的意思是

params 构造函数声明数组 而不知道数组长度 用的
在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
也就是不固定参数,也就是说 参数的维数不固定,你想几个,就可以几个,
在获取参数的地方也相应读取的就可以了
例如

 public static void UseParams2(params object[] list) 
    {
        for (int i = 0 ; i < list.Length; i++)
        {
            Console.WriteLine(list[i]);
        }
        Console.WriteLine();
    }

  调用就是

 

UseParams2(1, 'a', "test"); 

   public static void UseParams(params int[] list) 
    {
        for (int i = 0 ; i < list.Length; i++)
        {
            Console.WriteLine(list[i]);
        }
        Console.WriteLine();
    }

  调用就是

 UseParams(1, 2, 3);

posted on 2013-03-25 17:03  HOT SUMMER  阅读(249)  评论(0编辑  收藏  举报

导航