C#进化史

C#进化史

C#进化史
从数据类型看C#演化
C# 1写的产品类
C# 强类型集合——解决限制1和2
c# 自动属性——解决限制3
c# 4 命名实参
C# 1~C# 4的演变历程
排序
C# 1——提供一个IComparer实现
C# 2——泛型比较器
C# 3——Lambda表达式、扩展方法
C# 1~C# 3简化排序的历程
查询集合
C# 1——循环测试条件
C# 2——测试和打印分开
C# 3——移除委托逻辑的复杂包裹
C# 1~c# 3查询集合的演化
处理未知数据
处理可空值的方式
可选参数和默认值
小结
C# 3的重大改进——LINQ
查询表达式和进程内查询
查询XML
查询SQL
C# 4的重大改进——互操作性(COM和动态语言)
简化的COM互操作
与动态语言互操作——dynamic
C# 5的重大改进——异步函数

C# 1可以看做是2001年Java语言的升级版——额外的特性:语言特性的属性、委托和事件,foreach循环,using语句,显式方法重载,操作符重载,自定义值类型等。

从数据类型看C#演化

C# 1写的产品类


存在的三个限制:

  1. ArrayList不能提供编译时信息,不小心添加错误类型的数据不会被编译器发现;
  2. 属性有公共的取值方法,对应的赋值方法也必须是公共的;
  3. 封装字段有点麻烦,需要先声明字段,然后封装属性。

C# 强类型集合——解决限制1和2

  1. C# 2中最重要的改进——引入了泛型,试图添加错误类型的数据时会得到编译时错误;
  2. 属性拥有了私有的赋值方法。

c# 自动属性——解决限制3


C# 3还提供了Lambda表达式等特性。

c# 4 命名实参

非常不幸的是,对于需要只读属性,没有快捷方式。

C# 4增加了命名实参——当包含多个参数,参数类型相同,或某个参数为null时——使代码的含义更清楚。

C# 1~C# 4的演变历程


Product类型的演变历程,展示了越来越好的封装性、越来越强的类型化以及越来越容易的初始化。

排序

按名称排序。

C# 1——提供一个IComparer实现



存在的限制:

  1. 必须引入一个额外的类型来帮助排序;
  2. Copare方法中需要强制类型转换,foreach语句中也需要隐式的强制类型转换,由于ArrayList不是强类型,所以可能会造成执行时失败。

C# 2——泛型比较器


C# 2不仅解决了限制2,还解决了限制1:

现在无需额外的比较器类了,而是创建一个委托实例。

C# 3——Lambda表达式、扩展方法


Lambda表达式简化了委托——无需delegate关键字,也无需指定参数类型。

扩展方法——为List提供了原本没有的排序方法。

C# 1~C# 3简化排序的历程

查询集合

找出最贵的产品。

C# 1——循环测试条件


foreach进行循环,用if测试条件,再显示产品。

C# 2——测试和打印分开


变量test的初始化使用了匿名方法,print变量的初始化使用了方法组转换。并不是上述代码比C# 1的代码简单,它只是鼓励你多做分解。下面是C# 2的另一个版本。

C# 3——移除委托逻辑的复杂包裹

C# 1~c# 3查询集合的演化

处理未知数据

处理可空值的方式

  • C# 1有三种解决方案:
    比如产品价格,decimal类型:
  1. 围绕decimal建立一个引用包装类型;
  2. 维护一个单独的Boolean标识,它表示价格是否已知;
  3. “魔法数”——使用一个特殊值表示未知价格。
  • C# 2引入可空类型,
    C# 2引入Nullable<T>类型,甚至提供了一些语法糖decimal? price;。如此一来可以将null作为参数传递。

注意:可空类型和null进行比较,总是会返回false,因此,对于price > 10等价的!(price <= 10会得到错误的答案。

可选参数和默认值

对于方法的某些参数可能总是使用特定的值,传统的方式是使用方法重载。C# 4引入了可选参数来简化这一操作。——public Product(string name, decimal? price = null)

小结

C# 3的重大改进——LINQ

C# 2更像是对C# 1各种不足之处的修修补补,而C# 3几乎所有的特性都是为了构建LINQ。

查询表达式和进程内查询


上述代码使用了LINQ,如果不用反而更简单,但是在一些复杂情况下,换成方法调用来写,代码会变得难以阅读,这时LINQ就显得非常好用了。

LINQ借用了SQL的语法和一些思路。但它可以从任意源(比如XML)获取数据。

查询XML

查询SQL


为什么将所有数据从数据库拽回来,然后使用.NET查询和排序?为什么不直接让数据库做它擅长的事?
事实上,这正是LINQ to SQL所做的事——用C#代码表示查询,但却是作为SQL来执行的。

C# 4的重大改进——互操作性(COM和动态语言)

简化的COM互操作

  1. 使用命名实参调用SaveAs,并且许多可选参数被省略(正常情况下,SaveAs有十个额外的实参);
  2. C# 4将PLA(Primary Interop Assembly, 主互操作程序集)的相关部分内嵌到调用代码中,因此无需单独部署PLA。

与动态语言互操作——dynamic

dynamic——它对C#编译器来说是一个类型,但CLR并不认识它。下例展示与Python代码进行交互。

动态类型可能会在执行时才暴露代码编写错误。

C# 5的重大改进——异步函数

Windows Forms中的线程有两条金科玉律:

  1. 不能阻塞UI线程;
  2. 不能在任何线程中访问UI元素。

使用异步函数:



来自为知笔记(Wiz)


转载于:https://www.cnblogs.com/qianzi067/p/6019615.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防篡改对象之密封对象

const person {name: 啦啦德玛西亚}console.log(Object.isExtensible(person))// trueconsole.log(Object.isSealed(person))// false// 使用Object.seal()将对象修改为密封对象// 密封对象不可扩展&#xff0c;而且已有成员的[[Configurable]]特性将被设置为false// 意味着不…

配套自测连载(三)

接上期(答案已给出)本期是专门针对《深入理解计算机网络》图书第4章而编写的10道计算机网络体系架构中的物理层技术自测题&#xff0c;可以检验你对本章的学习效果。把你的答案直接写在评论中即可&#xff0c;笔者将在每期发表10天后给出正确答案。本书是国内最通俗、最系统的计…

[json] JSON for Modern C++

有幸能接触到这个&#xff0c;这是我遇到的使用最方便的json了&#xff0c;效率没研究过&#xff01; 简单了使用了下&#xff0c;感觉非常好用&#xff0c;记录下&#xff1a; 要使用这个json&#xff0c;只需要使用json.hpp就行&#xff0c;放入自己的工程里&#xff0c;但…

面向对象的需求分析方法

面向对象的需求分析方法 面向对象的需求分析方法的核心是利用面向对象的概念和方法为软件需求建造模型。它包含面向对象风格的图形语言机制和用于指导需求分析的面向对象方法学。 面向对象的思想最初起源于 20世纪 60年代中期的仿真程序设计语言Simula67。20世纪80年代初出现的…

js防篡改对象之冻结对象

const person {name: 啦啦德玛西亚,_job: 无业}Object.defineProperty(person, job, {get: function() {return this._job},set: function(newValue) {this._job newValue}})console.log(Object.isFrozen(person))// false//使用Object.freeze()将对象修改为冻结对象&#xf…

libinject的编译

libinject是一个Android进程注入实例&#xff0c;其下载地址为&#xff1a;http://download.csdn.net/download/ljhzbljhzb/3680780 libinject的编译需要NDK开发环境&#xff0c;在NDK安装成功之后&#xff0c;可以先将其自带的实例中的HelloJni导入到eclipse中&#xff0c;编译…

Boost - 序列化 (Serialization)

From: https://blog.csdn.net/zj510/article/details/8105408 程序开发中&#xff0c;序列化是经常需要用到的。像一些相对高级语言&#xff0c;比如JAVA, C#都已经很好的支持了序列化&#xff0c;那么C呢&#xff1f;当然一个比较好的选择就是用Boost&#xff0c;这个号称C准…

Linux Supervisor 守护进程基本配置

supervisor:C/S架构的进程控制系统&#xff0c;可使用户在类UNIX系统中监控、管理进程。常用于管理与某个用户或项目相关的进程。 组成部分supervisord&#xff1a;服务守护进程supervisorctl&#xff1a;命令行客户端Web Server&#xff1a;提供与supervisorctl功能相当的WEB操…

ES6使用object的is()方法比较两个值

此前js比较两个值是否相等时&#xff0c;一般使用 或 符号&#xff0c;我之前倾向使用后者&#xff0c;因为可以避免比较时触发强制类型转换&#xff0c;但某些情况使用 依然有问题&#xff0c;比如再比较NaN NaN时&#xff0c;返回的是false&#xff0c;需要使用isNaN()才能…

关闭子窗口 父窗口自动刷新

function clsoseForm(){window.opener.location.hrefwindow.opener.location.href; window.opener.location.reload();window.close();}转载于:https://blog.51cto.com/congwa/1199250

使用vue的sync修饰符进行子父组件的数据绑定

官方文档 父组件代码 <template><div><input type"button" value"我是父组件的按钮" click"show" /><!-- 在需要子组件修改的数据后加上.sync即可 --><child :isShow.syncisShow v-show"isShow" />&l…

三阶魔方还原公式

From: https://www.cnblogs.com/zqifa/p/mofang-1.html 1. 第二层棱块归位&#xff1a; 2. 顶层十字 3. 顶层棱中间块归位 这一步的目的是使顶层的4个棱中间块全部归位。 转动顶层(U)&#xff0c;若可以使一个棱中间块归位(如下图左&#xff0c;这里以[红-黄]块为例)&#x…

选项板概述

2019独角兽企业重金招聘Python工程师标准>>> 1、选项板概述 选项面板是一个包括一个或多个选项卡(Tab)&#xff0c;同一时刻只显示一个选项卡的这种用户界面。比如下图的IE选项设置界面中&#xff0c;就是一个选项板的应用&#xff0c;选项板上有“常规”、“安全”…

Vue 跳转相同路由携带不同参数,而页面不刷新

由于组件是复用的&#xff0c;若要对路由参数的变化作出响应的话&#xff0c;就需要在此组件上使用 watch&#xff08;监测变化&#xff09; $route 对象 created() {this.listQuery.code this.$route.query.id;this.getList();},watch: {$route(to, from) {//当参数改变时就会…

三阶魔方的入门教程

From: http://www.rubik.com.cn/beginner.htm 下面是三阶魔方图文教程&#xff0c;想直接看更好懂的三阶魔方视频教程请点这里 魔方别看只有26个小方块&#xff0c;变化可真是不少&#xff0c;魔方总的变化数为 或者约等于4.31019。如果你一秒可以转3下魔方&#xff0c;不计重…

oracle技术之查询初始化参数的方法(六)

查询初始化参数的方法很多&#xff0c;比如SHOW PARAMETER&#xff0c;或查询V$PARAMETER等&#xff0c;这里简单总结一下。这一篇描述CREATE PFILE的方法检查初始化参数。前面介绍了很多种方法&#xff0c;这些方法都是在数据库中查询初始化参数的设置。其实还有一种方法更加的…

MySQL LIST分区(转载)

LIST分区和RANGE分区非常的相似&#xff0c;主要区别在于LIST是枚举值列表的集合&#xff0c;RANGE是连续的区间值的集合。二者在语法方面非常的相似。同样建议LIST分区列是非null列&#xff0c;否则插入null值如果枚举列表里面不存在null值会插入失败&#xff0c;这点和其它的…

vue组件化通信之父向子传值

vue组件化通信之子向父传值 vue组件化通信之兄弟组件传值 父向子组件传值 常用的方法主要有三种&#xff1a;props、$refs、$children 建议使用前两种 使用props进行传值 parent.vue <template><div><childTest :msgmsg></childTest></div> …

Openssl的证书格式转换

PKCS 全称是 Public-Key Cryptography Standards &#xff0c;是由 RSA 实验室与其它安全系统开发商为促进公钥密码发展而制订的一系列标准。PKCS 目前共发布过 15 个标准。常用的有&#xff1a;1. PKCS#7 Cryptographic Message Syntax Standard2. PKCS#10 Certification Requ…

啦啦

Y2错题解析 数据流程图描述信息的来龙去脉和实际流程&#xff0c;反映信息在系统中流动、处理和存储的情况。程序结构图用来描述程序结构&#xff0c;一般由构成系统的要素和表达要素间关系的连线或箭头构成。因果图是一种发现问题“根本原因”的分析方法。 Spring依赖检查的常…