C# 3.0特性

在本篇中我要介绍两个概念,我觉得这两个东西必须一起来介绍,这样才能 连贯。

C# 2.0里我们已经匿名方法了,现在类型也玩起匿名来了,怪不得大家 “举报”的时候都喜欢匿名,为啥?因为匿名被举报人就找不着报复 对象了呗,是的,匿名就是把名字隐藏起来,没有名字谁还能找得到你啊。

匿名类型

在C#里有这样一些类型,它是作为临时储存数据的,生命周期只在这个方法 内,方法结束了,这个类型的生命周期也没有了。那么这里我们就可以使用一个 匿名类型。

var KeyPair = new {Key=”yuyi”,Value=”20”};

这个KeyPair就是一个匿名类型,注意KeyPair这里是一个变量名,并不是类 的名字。嗯,前面还有一个var,这又是什么呢?这是C# 3.0里面的隐式局部变 量。

隐式类型局部变量

还是先介绍一下隐式类型局部变量吧:

在C# 3.0里多了一个关键字var,他表示这样的一种类型:C#编译器可以根据 上下文推断的出来比如var I = 5;编译器可以根据后面的赋值推断的出来i应该 是个整型。既然是局部变量,那么它就只能用在方法内部了,注意C#是强类型的 ,引入了一个var并不是像javascript那样,变成了一个弱类型的语言。在编译 器第一次编译后var就会被确定的类型所替代的。所以对于隐式类型局部变量要 注意以下几点:

1.它只能存在于方法内部

2.它不是一个新的类型,只是一个关键字,或者叫做一个占位符,在C#编译 器编译后它就会被确定的类型所替代

3.它是编译器根据上下文推断出来的,所以所有一切不能被编译器推断出来 的用法都是错误的。比如不能这样使用:var nullValue = null;因为null啥也 不是,他是一个空指针,是一个不确定的东西。也不能这样使用:var I = 5;I = “abc”;编译器根据第一个赋值会推断出它是一个整型,但是随后 又将一个字符串赋值给它,这是怎么回事呢?

对于var我的建议是不到逼不得已的时候不用,那什么是逼不得已呢?来看我 们的匿名类型吧。

回到匿名类型

刚才说了,匿名类型是没有名字的类型,没有名字你怎么来称呼它,怎么来 声明它?但是匿名类型真的是没有名字的么?

看看C#编译器又在我们背后干了些什么:

使用ILDASM打开编译过的程序集,发现多了一个类型:

<>f__AnonymousType0<<Key>j__TPar,<Value> j__TPar>

这个类型是直接继承自System.Object的,并且是internal seald(只在程序 集内可见,并且不能被继承)。有心的你也许会发现,这个类型还是一个泛型类 型,那么只要我们在使用一个匿名类型的时候参数个数,参数名称不发生变化, 编译器是不会为我们产生更多的类型的:

var KeyPair1 = new { Key="yuyi",Value="Programer"};var KeyPair2 = new { Key="y",Value=3};var KeyPair3 = new { Key=4,Value="abc"};

上面三个匿名类型,编译器只会为我们在背后产生一个新类型,一个泛型的 新类型。如果我们将这个匿名类型内的属性名修改一下:对

var KeyPair1 = new { Key="yuyi",Value="Programer"};var KeyPair2 = new { Key="y",Value1=3};

就会产生两个新泛型了:

<>f__AnonymousType0<<Key>j__TPar,<Value> j__TPar>
<>f__AnonymousType1<<Key>j__TPar,<Value1>j__TPar& gt;

看看,这个命名还是有规律可循哦。如果你给这个匿名类型添加一个新属性 呢?这样又产生了一个新类型了:

<>f__AnonymousType1<<Key>j__TPar,<Value1> ;j__TPar,<Test>j__TPar>

嗯,这个问题还是值得关注的,所以我们在使用匿名类型的时候应该尽量保 持“一致性”:

属性个数一致(这个尽量了)。

属性名称一致,这个比较好把握。

只要保持了这个一致性,编译器会为一致的产生同一个类型,而不一致的会 新产生一个类型,如果不一致的太多我想是不是会产生“代码爆炸” 而致使”WorkSet”过大造成性能的损失?这个只是我个人认为,没 有经过测试。

继续隐式类型局部变量

由于匿名类型在我们编写代码的时候并不存在,所以匿名类型也不能作为方 法的返回值和参数了。”var”一样,也是只能在方法内部使用。现 在是不是有点明白什么时候才是逼不得已使用”var”啊?就是在使 用匿名类型的时候,匿名类型编译器可以推断出来,但是靠人工又无法推断了。 所以我觉得只在编译器可推断而人不可推断的时候才使用隐式类型局部变量,靠 我们人工可以推断的还是不建议使用,显式的声明变量类型可以增强代码的可读 性,这是一个好的编程习惯,不要因为C# 3.0提供了这样的特性就大用而特用。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#
, 编译器
, 变量
, 类型
, 匿名对象赋值
, var
, 编译器 数据类型
一个
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-11-08 23:29:28

C# 3.0特性的相关文章

BlogEngine.Net架构与源代码分析系列part7:Web2.0特性

Pingback&Trackback 今天这篇文章主要向大家讲述一下Blog系统中应用最多的,具有Web2.0特性的,也是一种标准化的--Pingback&Trackback.分析一下BlogEngine.Net提供的比较全面的Pingback&Trackback支持.本文内容相对来说比较独立,如果您对整个系列感兴趣请参照这里. Pingback&Trackback参考 简单地说,Pingback&Trackback是博客在链接.引用其他博客内容时通知对方博客的一种

Spark的RDD原理以及2.0特性的介绍(转)

Spark 是什么  Spark 是 Apache 顶级项目里面最火的大数据处理的计算引擎,它目前是负责大数据计算的工作.包括离线计算或交互式查询.数据挖掘算法.流式计算以及图计算等.全世界有许多公司和组织使用或给社区贡献代码,社区的活跃度见 www.github.com/apache/spark. 2013 年开始 Spark开发团队成立 Databricks,来对 Spark 进行运作和管理,并提供 Cloud 服务.Spark 社区基本保持一个季度一个版本,不出意外的话 Spark 2.0

【转载】OpenEJB 3.0支持对枚举和集合的依赖注入及OSGi和EJB 3.0特性

    开源轻量级EJB实现框架OpenEJB的最新版支持对枚举.集合和Maps的依赖注入(Dependency Injection,即DI),并且支持OSGi和EJB 3.0规范.在经历了一年半的开发后,OpenEJB 3.0最终版近期发布了.该版本还支持@EJB引用其他EAR文件中的本地接口.事务日志及基于HTTP协议的EJBd,同时它还支持EJB 3.0的新特性如Business Interfaces.Java Persistence API (JPA)及JAX-WS Web Servic

spring boot 2.0 特性之springApplication

SpringApplication SpringApplication 类提供了在main函数中启动spring应用程序的便利性,通过调用其静态方法其实运行,代码如下: public static void main(String[] args) { SpringApplication.run(MySpringConfiguration.class, args); } 1. 默认情况下,其日志级别为info.如果上述启动失败,会注册FailureAnalyzers分析器获取一个对应的错误信息以及

spring boot 2.0特性之外部化配置

简介 spring boot允许你外部化其配置以便你能够在不同的环境中使用相同的代码.可以通过使用properties,YAML 文件,环境变量,以及命名行参数等形式外部化其配置.属性值可以通过@value的形式直接注入到bean中去(其通过spring 的抽象或者是通过使用@ConfigurationProperties绑定其结构化对象) spring boot使用了一种特别的 PropertySource允许你覆盖其值,其覆盖顺序如下: 1. devtools的环境变量被设置,则优先使用(其

C# 3.0特性之Lambda表达式

Attention: 本文内容包括示例来源均参考自Joseph C. Rattz, Jr.的Pro Linq一书. Lambda表达式是MS在C# 3.0中引入的.Lambda表达式最早可见于LISP语言,美国数学家Alonzo Church在1936年将其概念化.这种表达式为描述算法提供了一种简便的手段. 在引入Lambda表达式之前,我们先看一看在这之前,将一个算法作为参数传递给一个方法是如何做到的. 使用命名方法(Named Methods) 在C# 2.0之前,可以使用委托(delega

InfoSphere Streams 2.0特性简介: 使用集合

您还将学习如何使用基础 C++++ Streams 运算符访问集合. 本文介绍目前可供 InfoSphere Streams 2.0 http://www.aliyun.com/zixun/aggregation/7155.html">开发人员使用的 3 种集合类型.集和映射复合类型不仅可用于 Streams 2.0 版,还为基础和复合类型的嵌套增添了灵活性.本文将同时使用 Streams 处理语言和 C++ 的一些示例展示新类型的强大功能. 前提条件 本文是为拥有 Streams 编程语

spring boot 2.0特性之profile与日志

profile 简介 profile提供了应用的隔离,使其在某种特定的环境下才能生效,任何的@Component与@Configuration能够被@Profile标记限制其何时加载,如下代码所示: @Configuration @Profile("production") public class ProductionConfiguration { // ... } 通常情况下,spring可以使用spring.profiles.active Environment 去指定哪一个pr

PHP 6.0新特性

     PHP下一个备受关注的版本6.0,已经进入snapshot阶段,不久即将发布.PHP 6.0将包含很多新的特性.语法改进,会让面向对象编程更加简单,另外还有很多重要的改进,比如Unicode的核心支持,这将让PHP更适合全球范围支 持和更加的健康发展.PHP是已经风靡全球的开源脚本语言,在数以万计的网站上运行着,PHP 6.0将完全向前兼容,同时增加许多令人激动的特性. 更加好的Unicode支持 NameSpace:名字空间,将更好的避免在函数及类之间的变量名冲突. 令人激动的Web