博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#设计模式第一天
阅读量:7238 次
发布时间:2019-06-29

本文共 3197 字,大约阅读时间需要 10 分钟。

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

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

例子是最好的说明

先看一段代码

public static class EnumerableHelper    {        ///         /// Execute Action for each element in 
///
public static void ForEach
(this IEnumerable
sequence, Action
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;

有了这个之后,它像什么呢,像这篇文章里面的扩展类的使用,其实我理解是一个道理

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
(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);

转载地址:http://uwgfm.baihongyu.com/

你可能感兴趣的文章
网上转账全免?多家银行网上转账免费
查看>>
《数据虚拟化:商务智能系统的数据架构与管理》一 1.6 数据虚拟化的定义
查看>>
戴尔发布面向制造、生命科学和研究的高性能计算系统
查看>>
赛迪顾问:大数据带来大机会 运营商需关注四大课题
查看>>
双11阿里核心交易系统上云 为全球首次
查看>>
互联网金融 最不该放松安全这根神经
查看>>
既然无法击败AI,何不投身其中:Elon Musk重返脑机接口业务
查看>>
黑客可通过 USB 3.0 端口完全控制使用英特尔第六/七代处理器的PC
查看>>
大数据特区风起张北“中国数坝”
查看>>
制造企业要如何正确看待大数据?
查看>>
大数据计算架构三国争霸胜负未明
查看>>
数据中心布线系统构成及不同规模范例
查看>>
小心升级!iOS 10.2可能会让更多iPhone突然关机
查看>>
李开复:AI 创业的十个真相 | 深度
查看>>
Windows 10可能会限制你的网速,如何改变或提速?
查看>>
Apache Kylin优化之—Cube的高级设置
查看>>
以静制动的TensorFlow Fold
查看>>
IT管理中的安全痛点及解决方法
查看>>
《VMware Virtual SAN权威指南(原书第2版)》一1.6 从管理员角度来看VSAN的样子...
查看>>
全球区块链商业理事会中国中心成立,推动全球区块链共识教育
查看>>