知识大全 了解C#特性匿名类型与隐式类型局部变量

Posted 类型

篇首语:努力一点,现在想要的以后你都会有。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 了解C#特性匿名类型与隐式类型局部变量相关的知识,希望对你有一定的参考价值。

了解C#特性匿名类型与隐式类型局部变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

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

  匿名类型

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

  varKeyPair=newKey= yuyi Value= ;

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

  隐式类型局部变量

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

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

   它只能存在于方法内部

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

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

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

  回到匿名类型

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

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

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

  <>f__AnonymousType <<Key>j__TPar <Value>j__TPar>

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

  varKeyPair =newKey= yuyi Value= Programer ;varKeyPair =newKey= y Value= ;varKeyPair =newKey= Value= abc ;

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

  varKeyPair =newKey= yuyi Value= Programer ;varKeyPair =newKey= y Value = ;

  就会产生两个新泛型了

  <>f__AnonymousType <<Key>j__TPar <Value>j__TPar><>f__AnonymousType <<Key>j__TPar <Value >j__TPar>

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

  <>f__AnonymousType <<Key>j__TPar <Value >j__TPar <Test>j__TPar>

  

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

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

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

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

  继续隐式类型局部变量

cha138/Article/program/net/201311/12067

相关参考

知识大全 C#教程:隐式类型的局部变量

C#教程:隐式类型的局部变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  隐式类型的局部变量 

知识大全 新增匿名类[1]

  一用var定义变量  在C#中提供了一种新的声明变量的方式这就是var通过这个关键字在声明变量时就无需指定类型了变量类型是在初始化时由编译器确定的代码如下:varss=abcd;MessageBo

知识大全 C# 2.0 局部类型、空属类型、静态类[1]

C#2.0局部类型、空属类型、静态类[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  局部类

知识大全 C# 2.0 局部类型、空属类型、静态类[2]

C#2.0局部类型、空属类型、静态类[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  局部类

知识大全 C# 2.0 局部类型、空属类型、静态类[3]

C#2.0局部类型、空属类型、静态类[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  局部类

知识大全 为什么匿名内部类参数必须为final类型

   在线文档阅读开发手记(一)) 从程序设计语言的理论上局部内部类(即定义在方法中的内部类)由于本身就是在方法内部(可出现在形式参数定义处或者方法体处)因而访

知识大全 struts2类型转化器详解(带例子)

  Struts有两种类型转化器  一种局部一种全局  如何实现  第一步定义转化器  第二部注册转化器  下面做一个局部类型转化器的实例  我们在上面一片日志说过有个变量date类型的只有我们输入格

知识大全 JS的数据类型和变量

JS的数据类型和变量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!JavaScript有六种数据类

知识大全 Java变量类型之间的相互转换

Java进阶:Java变量类型之间的相互转换  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我们

知识大全 .net的编程之路(一)

  一预定义数据类型  char字符类型单引号例如charx=this;  c#中的每个数据类型其实就是一个静态的类每个变量都是一个类的实例  例如将int型的数据转化为stringstringx=i