当前位置: 首页 > news >正文

C# 3.0语言特性

开场白:本文为个人笔记,参考微软MVP
  • 自动属性(Auto-Implemented Properties)

  • 隐含类型局部变量(Local Variable Type Inference)

  • 扩展方法(Extension Methods)

  • 对象与集合初始化器(Object and Collection Initializers)

  • 匿名类型(Anonymous Types)

  • Lambda表达式和Lambda表达式树 (Lambda Expression and Lambda Expression Trees)


自动属性(Auto-Implemented Properties)

在.Net2.0框架下,我们可以这样写一个User类:

public class User
{
    private int _id;
    private string _name;
    private int _age;
    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    public int Age
    {
        get { return _age; }
        set { _age = value; }
    }
}

现在,可以这样简化:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

隐含类型局部变量(Local Variable Type Inference)

var i = 5;//int
var j = 23.56;//double
var k = "C Sharp";//string
var a =new[]{1,34,45,45};//int[]
var x;//错误
var y = null;//错误
var z = { 1, 2, 3 };//错误

隐含类型局部变量要点

  1. var为关键字,可以根据后面的初始化语句自动推断类型,这个类型为强类型。
  2. 初始化语句必须为表达式,不可以为空。且编译时可以推断类型。一旦初始化之后,只可以存储这种类型。
  3. var声明的仅限于局部变量,不可用于字段。亦可以用于for,foreach,using 等语句中。
  4. 数组也可以作为隐含类型。
  5. 初始化语句不能是一个自身的对象或者集合初始化器,但是他可以是包含一个对象或者初始化器的一个new表达式。
  6. 如果局部变量声明包含了多个声明符,其类型必须相同。
  7. 如果该处包含了一个自定义的Var类型,则优先该自定义的Var类型

 


扩展方法(Extension Methods)

扩展方法允许我们在不改变源代码的情况下扩展(即添加不能修改)现有类型中的实例方法。

例如我们要检查一个字符串变量是否是合法的电子邮件地址?在.Net2.0框架下像这样:

var email = "aa@qq.com";
if (EmailValidator.IsValid(email))
{
    Response.Write("这是一个正确的邮件地址");
}

 

而使用扩展方法的话,我可以添加“IsValidEmailAddress()”方法到string类本身实例中去

if(email.IsValidEmailAddress()) //等同Extensions.IsValidEmailAddress(email)
{
    Response.Write("这是一个正确的邮件地址");
}

 先定义一个静态类,再定义“IsValidEmailAddress”这个静态的法来实现的。

public static class Extensions//静态类
{
    public static bool IsValidEmailAddress(this string s)//this关键词告诉编译器,这个特定的扩展方法应该添加到类型为“string”的对象中去   {
        Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
        return regex.IsMatch(s);
    }
}

实例背后的编译
Person p=new Person();
p.Bar();//IL编译会将其变成Bar(p); void Bar(Person p){} 所有东西都是全局函数

扩展方法要点

  1. 扩展方法的本质为将实例方法调用在编译期改变为静态类中的静态方法调用。事实上,它确实拥有静态方法所具有的所有功能。
  2. 扩展方法的作用域是整个namespace可见的,并且可以通过using namespace来导入其它命名空间中的扩展方法。
  3. 扩展方法的优先级:现有实例方法优先级最高,其次为最近的namespace下的静态类的静态方法,最后为较远的namespace下的静态类的静态方法。
  4. 扩展方法是一种编译时技术,注意与反射等运行时技术进行区别,并慎重使用。
  5. 扩展类:1继承  2包含 在一个新类里面执行另外一个类的方法,并添加新功能  3反射 动态的给一个类型添加行为 4扩展方法 this

 


对象与集合初始化器(Object and Collection Initializers)

  对象初始化器 (Object Initializers)-->

  User user = new User { Id = 1, Name = "a", Age = 22 };等价于User user=new Use(); user.Id=1;user.Name="a",user.Age=22;

 

//把二个人加到一个基于泛型的类型为User的List集合中:

List<User> user = newList<User>{
    newUser{Id=1,Name="YJingLee",Age=22},
    newUser{Id=2,Name="XieQing",Age=25},
};

  集合初始化器(Collection Initializers)-->

  集合初始化器可以简化把几个对象一起添加到一个集合,编译器会自动为你做集合插入操作。例如我把七个数加到一个基于泛型的类型为int的List集合中

  List<int> num = new List<int> { 0, 1, 2, 6, 7, 8, 9 };

 

对象与集合初始化器要点

 

  1. 对象初始化器实际上利用了编译器对对象中对外可见的字段和属性进行按序赋值。
  2. 对象初始化器允许只给一部分属性赋值,包括internal访问级别
  3. 对象初始化器可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行。
  4. 集合初始化器会对初始化器中的元素进行按序调用ICollection<T>.Add(T)方法。
  5. 注意对象初始化器和集合初始化器中成员的可见性和调用顺序。
  6. 对象与集合初始化器同样是一种编译时技术。

 


匿名类型(Anonymous Types)

var p1=new{Name="Law",Price=44.00};

var p2=new{Name="Shovel",Price=26.65};

p1=p2;//在局部范围内如果参数一样,认为两个类型是同一个类型,允许其赋值

 

匿名类型要点

 

  1. 可以使用new关键字调用匿名初始化器创建一个匿名类型的对象。
  2. 匿名类型直接继承自System. Object。
  3. 匿名类型的成员是编译器根据初始化器推断而来的一些读写属性。
  4. 优点是可以用来临时存数据用

转载于:https://www.cnblogs.com/shenqiboy/archive/2013/06/12/3133144.html

相关文章:

  • xcode中c语言scanf的问题
  • taobao开源项目
  • Vim升华之树形目录插件NERDTree安装图解
  • Manifest文件的配置
  • 最新JAVA编程题全集(50题及答案)
  • 强大的命令行工具wmic
  • cookie工具类,解决servlet3.0以前不能添加httpOnly属性的问题
  • 语音频谱语音信号处理之(四)梅尔频率倒谱系数(MFCC)
  • apache+php+mysql的分布安装
  • Lvs+keepalived+nginx+php的session 保持的算法
  • [免費軟體] 用15個「免費正版軟體」取代盜版軟體! (狂省10萬元!)
  • 【算法】算法的艺术(二)
  • 泛型回顾
  • 离线缓存
  • 字符串的提取
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2017-09-12 前端日报
  • create-react-app做的留言板
  • exif信息对照
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • java 多线程基础, 我觉得还是有必要看看的
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Javascript编码规范
  • Joomla 2.x, 3.x useful code cheatsheet
  • js数组之filter
  • Otto开发初探——微服务依赖管理新利器
  • Python进阶细节
  • Terraform入门 - 1. 安装Terraform
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 检测对象或数组
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 区块链分支循环
  • 实习面试笔记
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 数据科学 第 3 章 11 字符串处理
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 小程序button引导用户授权
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​水经微图Web1.5.0版即将上线
  • #1015 : KMP算法
  • #stm32驱动外设模块总结w5500模块
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $.each()与$(selector).each()
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (多级缓存)缓存同步
  • (六)vue-router+UI组件库
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (生成器)yield与(迭代器)generator
  • (转)大道至简,职场上做人做事做管理
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包