一些武侠小说里的大人物,为了争夺武林盟主,号召天下,常常闭关修炼一段时间,闭关期间仅仅能接触送饭的人,而且关外还有非常多守卫的人员。还有,不管是篮球还是足球运动员,他们在真正接触球之前,都必须做非常长一段时间的身体素养锻炼,像长跑之类。


假设我们想成为程序界的武林至尊,那么我们也必须得闭关修炼,细致修炼基本功。

那么我们做Windows移动开发的程序猿们的基本功是什么呢?事实上,基本功有非常多,最重要的是逻辑思维和解决这个问题的能力,话又说回来,逻辑思维和解决这个问题的能力从何而来呢?不断的做、练,熟能生巧在程序界内是最能得到体现的了。

我们这些Windows移动开发的“屌丝们”该做、练些什么呢?我是用C#做Windows移动开发的,所以我所用的武器是C#,全部的招数也都是C#打出来的,在闭关这个环节,我主要修炼托付、继承、多态、垃圾回收以及泛型,这一次,我主要练习C#中的托付。

1.1 什么是托付
学过C和C++的人都知道指针,当我们想把方法来作为參数来传递的时候,我们能够传递函数的指针,也就是函数的内存地址,这样做会导致类型不安全,非常难控制,在C#中,为了避免这个问题,推出了托付,托付是一个特殊类型的对象,它和类应该是平级别的,也就是说,托付能够声明在命名空间内,也能够在类内部声明,托付也是一个内存地址,但它是类型安全的。
  1.1.1 托付的声明
托付和类一样,须要提前声明,声明的格式:
delegate int DGetResult(int a,int b);
  1.1.2 托付实例的声明
声明好一个托付后,我们须要给他声明一个方法实例,方法实例必须与托付保持签名同样,即方法返回值类型和托付一致,方法參数的类型、个数、顺序和托付一致。上面托付的一个实例方法:
private int GetAddResult(int a,int b)
{
 return a+b; 
}
以下,我们就能够在Main函数里面调用这个托付了,调用托付和类一样,也必须申请一个托付对象,通过对象调用托付,例如以下:
DGetResult getResult = GetAddResult;     //此处不须要加參数和括号,把托付对象的地址指向方法
Console.WriteLine(getResult(2,4).ToString());   //通过托付对象运行
Console.ReadKey();
1.1.3 托付对象的赋值、方法的加减
一个托付对象能够同一时候调用多个方法,我们能够给一个托付对象加入多个实例方法,例如以下:
int GetMinusResult(int a, int b)    //新实例方法
 {
  return a - b;
  }
在Main函数中调用方法:
getResult +=GetMinusResult;
Console.WriteLine(getResult(2,4).ToString()); 
运行结果是-2,假设我们在方法GetAddResult内部加断点运行,我们会发现,方法GetAddResult也被运行了。
既然托付对象能够加入方法,那么托付对象也能够删减方法。
gerResult-=GetMinusResult;
Console.WriteLine(getResult(2,4).ToString()); 
这回程序的执行结果就是6了。
1.1.4多播托付方法受阻问题
事实上,我们上面所使用的托付叫多播托付,多播托付会有一个问题,当多播托付方法组中的前面的方法出现异常,那么托付对象方法的迭代将会停止,后面的方法将不会被运行,怎么处理这个问题呢?
看以下代码:
Delegate[] del=getResult.GetInvocationList();
 foreach (DGetResult _getResult in del) 
  { 
 try 
  { 
  _getResult(4,2); 
  } 
  catch(Exception) 
  { 
  Console.WriteLine("异常被引发了");
  } 
  }
此种方法是,托付对象通过GetInvocationList()方法返回一个Delegate对象数组,然后遍历这个Delegate数组,进行自己定义处理,这样,前面的方法出现异常了,托付对象还会迭代方法,后面的方法就不会因前面的异常而受阻了。
1.2 为什么要有托付
首先,托付是类型安全的,托付easy控制,效率高;另外大型应用程序中使用托付能够降低依赖性和层的耦合,为开发出更高性能的组件提供支持。
1.3 Lambda表达式
C#中有匿名方法,可是匿名方法写起来还是不怎么方便,所以C#3.0開始,出现了Lambda表达式,这样的语法仅仅能用超爽两个字来习惯,这是C#给他的程序猿给开的小灶,C#的程序猿们一定要为之感到庆幸。
Lambda表达式组成:(參数1,參数2..)=>{详细实现};
一切具有托付參数类型的地方,都能够使用Lambda表达式,匿名方法假设用Lambda表达式写那应该是很爽的一件事情。
Lambda表达式的举例会在以下两个经常使用托付中进行。
1.4 Action托付和Func托付
我们在查阅MSDN帮助文档的时候,可以看见非常多Action<T>和Func<T>的形式存在,曾经没有见过这样的结构的代码呢?它们究竟是什么呢?
不要恐慌,他们都是托付,仅仅只是他们更简单更经常使用而已。
1.4.1 Action托付
Action托付表示引用一个void返回类型的方法,參数能够自己定义。
如:Action<int,string,bool>表示带三个參数返回void托付,我们能够用Lambda表达式简写托付的定义和调用:
      Action<int, string> action = (a, b) =>
             {
                 Console.WriteLine(a.GetType().ToString());
                  Console.WriteLine(b.GetType().ToString());
             };   //Action托付的定义
             action(1,"1");  //调用托付对象
程序输出:
System.Int32
System.String
1.4.2 Func托付
Func<T1,T2,T3>托付表示一个带有2个參数,返回T3类型的托付,即最后一个參数是返回类型,前面全部參数均是參数表,看以下代码。
Func<int,string,bool> function=(a,b)=>
             {
                 Console.WriteLine(a.GetType().ToString());
                 Console.WriteLine(b.GetType().ToString());
                 return false;
             };
             function(1,"1");
程序输出:
System.Int32
System.String
托付这个知识点属于.Net高级技术,所以对于刚開始学习的人来说理解和应用起来都有点难度,越是感觉生疏,就越是闭关练习,由于这是修仙成佛的必经之路。
托付总结:

最后,给大家推荐一本认为能够推荐一千次一万次的书籍,这本书叫C#高级编程,书籍作者是美国的Christian Nagel,Bill Evjen和Jay Glynn等,中文版由李铭翻译,为什么推荐这本书呢?由于这本书差点儿囊括了全部.Net知识点,解说的也很到位,如今出版到第八版,网上有第七版的中文版和第八版的英语版,看哪个版本号看你的喜好了。

Windows移动开发(二)——闭关修炼的更多相关文章

  1. C++第三十八篇 -- 研究一下Windows驱动开发(二)--WDM式驱动的加载

    基于Windows驱动开发技术详解这本书 一.简单的INF文件剖析 INF文件是一个文本文件,由若干个节(Section)组成.每个节的名称用一个方括号指示,紧接着方括号后面的就是节内容.每一行就是一 ...

  2. Kinect for Windows SDK开发学习相关资源

    Kinect for Windows SDK(K4W)将Kinect的体感操作带到了平常的应用学习中,提供了一种不同于传统的鼠标,键盘及触摸的无接触的交互方式,在某种程度上实现了自然交互界面的理想,即 ...

  3. Windows Service 开发,安装与调试

    Visual Studio.net 2010 Windows Service 开发,安装与调试 本示例完成一个每隔一分钟向C:\log.txt文件写入一条记录为例,讲述一个Windows Servic ...

  4. windows原生开发之界面疑云

        windows桌面开发,界面始终是最大的困惑.我们对前端工具的要求,其实只有窗体设计器.消息映射,过分点的话自适应屏幕.模型绑定.能够免于手工书写,其实这个问题并不复杂,但VS不实现.QT语法 ...

  5. Windows驱动开发(中间层)

    Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385 ...

  6. Windows Phone开发-开发环境和结构

    Windows Phone 7.1的开发工具发布了,一直对WP7很关注,现在终于可以开始学习了.其实09年就学习过silverlight,看过3的SDK文档,当时因为工作,断断续续也没有坚持下来,所以 ...

  7. Windows 10开发基础——文件、文件夹和库(一)

    原文:Windows 10开发基础--文件.文件夹和库(一) 主要内容: 1.枚举查询文件和文件夹 2.文本文件读写的三种方法——创建写入和读取文件 3.获得文件的属性 枚举查询文件和文件夹 先了解一 ...

  8. Windows Phone开发人员必看资料

    win phone开发必看资料,下载地址收藏啦!收藏后可有选择性的下载,希望大家喜欢! 完整附件下载:http://down.51cto.com/data/414417 附件预览: Windows E ...

  9. Windows Phone开发(43):推送通知第一集——Toast推送

    原文:Windows Phone开发(43):推送通知第一集--Toast推送 好像有好几天没更新了,抱歉抱歉,最近"光荣"地失业,先是忙于寻找新去处,唉,暂时没有下文.而后又有一 ...

随机推荐

  1. css书写步骤

    CSS整体书写步骤1:CSS RESET 重置2:CSS GLABAL 全局属性3: CSS分模块属性,(先写默认样式和设计图相差最大的部分,先大块布局,后细致调整) <style>/*C ...

  2. css样式之边框和内外边距

    1.css样式之边框:border 实心的边框: <!DOCTYPE html><html> <head> <meta http-equiv="co ...

  3. 各种乱码,编码问题设置方法整理(UTF-8)

    一.tomcat中文乱码问题 打开tomcat安装目录,在conf文件夹中找到server.xml文件 ,找到   <Connector port="8009" protoc ...

  4. java使用内部类的好处及其初始化

    java使用内部类的原因 每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响          java内部类初始化 ForeCatal ...

  5. 在SPItemEventReceiver中使用BeforeProperties和AfterProperties

    当你利用这些事件时,就很快会发现存在前(同步)后(异步)两种事件.其方法的后缀分别为“ing”(比如,ItemAdding)和“ed”(比如,ItemAdded),分别代表了变更发生前调用和发生后调用 ...

  6. Phonegap 版本minSdkVersion为8的时候的自动更新与升级

    清单文件中: <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8"/> ...

  7. ManagedPipelineHandler IIS

    IIS上部署MVC网站,打开后500错误:处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandl ...

  8. cocos2d-x创建新项目模板

    1.起因 长期使用项目中自带的HelloWorldScene来创建模板工程,不知大家有木有感到厌烦? 我是个懒人,所以就弄了个新的模板工程.这样最起码可以不用每次都把HelloWorldScene删掉 ...

  9. C# 配置文件读取与修改(转)

    C# 配置文件读取与修改   配置文件在很多情况下都使用到, 配置文件分为两种 一种是应用程序的配置文件, 一种是web的配置文件. 两种配置文件最大的区别是web的配置文件更新之后会实时更新, 应用 ...

  10. JS函数与call()apply()详解

    JavaScript中的每个函数都是一个对象. 因为函数都是对象,它们有自己的属性和方法.我们可以把它们看作数据(data). 函数和方法的区别? 函数立足于它们自己(例如:alert()), 而方法 ...