最近工作较忙,手上有几个项目等着我独立开发设计,所以平时工作日的时候没有太多时间,下班累了就不想动,也就周末有点时间,今天我花了一个下午的时间来继续总结与整理书中要点,在整理的过程中,发现了书中的一些不足,我在以下的博文中都有说明,大家如果有这本书的可以对照着知识点及书本相结合的方式来看,没有这本本书的也可以对照着我整理的知识要点进行实际编码测试与学习,希望能对大家有所帮助,如果觉得可以的话,还请推荐哦,谢谢!

阅读《LEARNING HARD C#学习笔记》知识点总结与摘要系列文章从这篇博文开始,涉及的知识点的会越来越深入,希望大家能受益,若发现有不足之处,还请指出,谢谢!

首先补充之前的一个知识点:

委托只能定义在命名空间、类中,而不能定义在方法中(即:不能局部定义),这个在书中没有说明,我是在写代码的时候认识到的,也请大家测试一下,看能否找出根本原因。

经我测试,发现不只委托类型,所有的自定义类型均不能在方法体中定义,均报错,关于这个问题的思考与分析详见我的博文:

C#简单问题,不简单的原理:不能局部定义自定义类型(不含匿名类型)

十三.泛型可变性

协变:指泛型类型参数可以从一个派生类隐式地转换为基类,用out关键字标识类型参数,以标明其支持协变性。(即:可将子类型的类型参数泛型对象赋值给父类型的类型参数泛型对象),如:

List<object> objectList=new List<object>();

List<string> stringList=new List<string>();

objectList.AddRange(stringList);

逆变:指泛型类型参数可以从一个基类隐式的转换为派生类,用in关键字标识类型参数,以标明其支持逆变性。(即:可将父类型的类型参数泛型对象赋值给子类型的类型参数泛型对象)。

逆变与协变刚好相反,可以理解协变是泛型类型参数的子类替换为父类的过程,逆变是泛型类型参数的父类替换子类的过程。

注意:

  1. 只有接口和委托才支持协变与逆变
  2. 协变与逆变只支持引用类型,因为可变性存在引用转换,而值类型不具备
  3. 必需显式的用in或out 关键字来标识类型参数,否则默认是不支持的
  4. 委托的可变性不要在多播委托中使用

十四.可空类型

  1. Nullable<值类型>,值类型? 均表示为可空类型,即允许为null值的值类型。
  2. 空合并操作符:双问号(即:??),作用是若可空类型(这里的可空类型指的是可以为空的类型,包含引用类型)的值不为Null则返回其值否则返回指定的值,如:

Int? nullInt=null; nullInt= nullInt??0; nullInt的最终值是0;

  1. 可空类型若值为NULL,将其转换为引用类型时,不会发生装箱操作,因为引用类型本身就支持NULL值,而非NULL值则会发生装箱操作。若将已装箱的可空类型转换为可空类型时,会发生拆箱操作,若值为NULL则拆箱后的可空类型值也为NULL;
  2. 使用可空类型的GetType方法,返回的是实际的值类型,若使用typeof方法,则返回的是可空类型;若可空类型的实际值为NULL,则调用上述两种方法均会报错。

十五.匿名方法

  1. 匿名方法的定义与普通方法定义基本相同,但匿名方法无方法名称、返回类型,使用delegate关键字来定义方法,且在定义的同时必须将匿名方法赋值给相应的委托类型(即使用匿名方法来实例化委托),然后使用委托来执行,定义语法如下:

委托类型 anonymousMethod=delegate(形参列表)

{

//方法主体

};

  1. 匿名方法的生命周期与引用该匿名方法的委托对象生命周期相同;
  2. 被匿名方法引用的外部变量与匿名方法的生命周期相同;

十六.迭代器

1.foreach循环原理是,通过访问迭代器(IEumerator),然后不断的获取下一个对象(MoveNext、Current),直到找不到下一个对象为止才停止循环。一个对象若需使用foreach循环,则该对象的类型必须实现IEumerable或IEumerable<T>接口,同时必须实现GetEnumerator方法来返回迭代器。

2. 实现GetEnumerator方法可能通过yield return 关键字来动态生成迭代器(迭代器的生成由编译器来完成)

十七.C#3.0新特性

类的属性简化定义(自动实现属性):访问修饰符类型 属性名{get;set;},无需声明私有变量来存放属性的值,编译器在编译的时候会自动生成。

隐式类型:采用var关键字来取代定义变量的类型(类似Javascript的var),变量的实际类型等于其值的类型,因为隐式类型需要依据变量的值来得出其真实类型,所以定义隐式类型的变量同时必须进行变量初始化,未初始化的或其初始化的值无法直接获得实际类型的(比如:NULL)将会报错。

注意隐式类型(var)仅能声明在局部变量中,不能声明为类的成员类型(字段、属性、方法)以及方法的形参类型

隐式数组:实例化数组时无需指定数组的类型及个数,直接赋值数组各成员(利用的是集合初始化器),但需注意数组成员的类型必须统一,否则无法获得真实类型,也就不满足隐式类型的定义要求,会报错的。定义语法如下:

Var intArray=new[]{1,2,3,4,5,6,7,8,9,10};

对象初始化器:在通过new调用类型的构造函数的同时(任意一个可实例的公共构造函数,未限定为无参的构造函数),直接赋值各类型的成员,定义语法如下:

类型 变量名=new 类型(参数){  属性=值,… …};

例子:Person p=new Person(){Name=”zuowenjun”,Age=29}; Person p=new Person(“zuowenjun”){ Age=29,Sex=”男”};

 

集合初始化器:在通过new调用类型的构造函数的同时(任意一个可实例的公共构造函数,未限定为无参的构造函数),直接赋值各类型的成员,但需要注意的是必需实现Add方法,编译器是通过自动调用Add方法来实现集合的添加的。

定义语法如下:

类型 变量名=new 类型(参数){成员对象,… …};

例子:

List< Person> personList=new List< Person>(){new Person{Name=“张三”,Age=10}, new Person{Name=“李四”,Age=20}};

String[] strs=new[]{“a”,”b”,”c”,”d”};

Dictionary<int, string> dic = new Dictionary<int, string>(4) { { 1, "a" }, { 2, "b" }, { 3, "c" }, { 4, "d" } };

 

匿名类型:即无需定义类型,通过隐式类型和对象初始化器两种特性来实例化一个未知类型的对象,定义语法如下:

Var 变量名=new{属性名=值};

注意:匿名类型的访问范围默认为Internal且不可更改,只能进行属性成员赋值,不能定义除属性外的其它成员(事件,索引器等),且属性成员不能添加访问修饰符默认为公共,属性的类型就是其值的实际类型,属性值的类型不限。

例子:

Func<string,string> sayFunc=delegate(string yourname){return yourname + ",您好。很高兴认识你!";};

var Person = new { Name = "zuowenjun", Age = 29, Sex = "男", WebSite = "www.zuowenjun.cn", Say = sayFunc};

Console.WriteLine(Person.Say("博客园"));

输出:博客园,,您好。很高兴认识你!

阅读《LEARNING HARD C#学习笔记》知识点总结与摘要三的更多相关文章

  1. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要系列文章索引

    从发表第一篇文章到最后一篇文章,时间间隔有整整一个月,虽只有5篇文章,但每一篇文章都是我吸收<LEARNING HARD C#学习笔记>这本书的内容要点及网上各位大牛们的经验,没有半点废话 ...

  2. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要二

    今天继续分享我的阅读<LEARNING HARD C#学习笔记>知识点总结与摘要二,仍然是基础知识,但可温故而知新. 七.面向对象 三大基本特性: 封装:把客观事物封装成类,并隐藏类的内部 ...

  3. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要一

    本人有幸在Learning Hard举行的整点抢书活动<Learninghard C#学习笔记>回馈网友,免费送书5本中免费获得了一本<LEARNING HARD C#学习笔记> ...

  4. Deep learning with Python 学习笔记(11)

    总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...

  5. Deep learning with Python 学习笔记(10)

    生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...

  6. Deep learning with Python 学习笔记(9)

    神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...

  7. Deep learning with Python 学习笔记(8)

    Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...

  8. Deep learning with Python 学习笔记(7)

    介绍一维卷积神经网络 卷积神经网络能够进行卷积运算,从局部输入图块中提取特征,并能够将表示模块化,同时可以高效地利用数据.这些性质让卷积神经网络在计算机视觉领域表现优异,同样也让它对序列处理特别有效. ...

  9. Deep learning with Python 学习笔记(6)

    本节介绍循环神经网络及其优化 循环神经网络(RNN,recurrent neural network)处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息. ...

随机推荐

  1. nsq初探

    一. 安装 参考:http://nsq.io/deployment/installing.htmlhttp://www.baiyuxiong.com/?p=873    (推荐.) 不推荐直接把官方的 ...

  2. 【腾讯Bugly干货分享】深入源码探索 ReactNative 通信机制

    Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 本文从源码角度剖析 RNA 中 J ...

  3. chrome的自动缓存真是讨厌。

    最近老是遇到这样一个问题,为什么我的代码改了,页面却一点变化都没有,难道代码错了,打开chrome的调试窗口一看,md,页面根本就没有刷新,逗你爹玩儿呢. 不过幸好,这该死的缓存是可以关闭的. F12 ...

  4. 【T-SQL基础】02.联接查询

    概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

  5. 一个App完成入门篇(四)- 完成反馈页面

    上一节中我们学会了如何通过点击不同按钮切换页面,这节专注于完成反馈页面的功能以及细节动画. 导入项目 添加新组件 同步新组件 完成页面布局 输入时加动画效果 弹出日期选择 直接引用UI页面 将要学习的 ...

  6. [.net 面向对象程序设计进阶] (4) 正则表达式 (三) 表达式助手

    [.net 面向对象程序设计进阶] (2) 正则表达式(三) 表达式助手 上面两节对正则表达式的使用及.NET下使用正则表达式作了详细说明,本节主要搜集整理了常用的正则表达式提供参考. 此外为了使用方 ...

  7. C#调试入门篇

    DotNet程序的调试,是DotNet程序员必备的技能之一,开发出稳定的程序.解决程序的疑难杂症都需要很强大的调试能力.DotNet调试有很多方法和技巧.现在本文就介绍一下借助DebugView工具进 ...

  8. 支持断点续传的文件上传插件——Huploadify-V2.0来了

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  9. 用 C 扩展 python

    本文介绍如何用 C 语言来扩展 python.所举的例子是,为 python 添加一个设置字符串到 windows 的剪切板(Clipboard)的功能.我在写以下代码的时候用到的环境是:window ...

  10. Linux xargs将输出数据流转换成命令参数

    200 ? "200px" : this.width)!important;} --> 介绍 我们可以利用管道将一个命令的“标准输出”作为另一个命令的“标准输入”:但是这里的 ...