zoukankan      html  css  js  c++  java
  • C#进化史

    C#进化史

    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元素。

    使用异步函数:





  • 相关阅读:
    黄页js-sdk开发总结分享
    最近的shell脚本(updating)
    nginx location 的配置
    nodejs 的安全
    paypal之nodejs 框架 Kraken-js 源码分析
    nodejs express 框架解密5-视图
    nodejs express 框架解密4-路由
    nodejs express 框架解密3-中间件模块
    nodejs express 框架解密2-如何创建一个app
    nodejs express 框架解密1-总体结构
  • 原文地址:https://www.cnblogs.com/qianzi067/p/6019615.html
Copyright © 2011-2022 走看看