当前位置:  编程技术>.net/c#/asp.net

学习C#匿名类型与隐式类型变量

    来源: 互联网  发布时间:2014-08-30

    本文导语:  C#3.0中引入了Linq,使得对集合的操纵发生了深刻的变化,这个变化的幕后英雄便是扩展方法和匿名类型。 本文介绍下,C#中的匿名类型与隐式类型变量,希望对大家有所帮助。 一、匿名类型 所谓匿名类型顾名思义就是没有类...

C#3.0中引入了Linq,使得对集合的操纵发生了深刻的变化,这个变化的幕后英雄便是扩展方法和匿名类型。

本文介绍下,C#中的匿名类型与隐式类型变量,希望对大家有所帮助。

一、匿名类型
所谓匿名类型顾名思义就是没有类型名称的一种特殊的数据类型,这意味着不能显式的引用这种类型的名称。事实上它是由编译器在后台声明并帮你生成必要的代码。
 

代码示例:
class Program
{
 public static void Main(string[] args)
 {
    var T1 = new {Index = 10,Name = "CPU",Price = 200.0};
    var T2 = new {Index = 20,Name = "MethodBoard",Price = 499.0};
    var T3 = new {T1.Index, Name = "SoundCard",Price = 210.0};
  }
}
 

以上用var 声明了3个隐式类型的变量T1,T2,T3,并把创建(new)的3个匿名类型的实例分别赋给它们。
这里var相当于一个占位符,其变量(T1,T2,T3)的具体的类型是在代码编译时确定的,即是由赋给它们的值的数据类型而定的。
因而在最终生成的CIL中T1,T2,T3是有具体的类型的,也就是强类型的。

在上例中,可以看到T3中使用了T1的属性Index,这说明匿名类型的属性是完全可以访问的。它们使用了相同的属性名称,属性的数据类型也相同,并且属性的的顺序也是一致的,因而它们具有相同的类型,否则就不是兼容的类型了。

如以下均不是相同的类型了,其中T4与T5的属性不同,T4与T6的属性顺序不一样。
 

代码示例:
var T4 = new {Index = 10,Name = "CPU",Price = 200.0};
var T5 = new {Index = 20,Title = "MethodBoard",Price = 499.0};
var T6 = new {T1.Index, Price = 210.0, Name = "SoundCard" };

匿名类型是"不可变"的,也就是说匿名类型的实例是不能够更改它的属性的,否则会造成编译错误,如:
var T4 = new {Index = 10,Name = "CPU",Price = 200.0};
T4.Index = 11;//引发编译错误

二、隐式类型变量
隐式类型变量是用var关键字声明的局部变量,这个变量的具体类型是可以通过赋傎号右边的表达式推导出来的。其实在大多数情况下,隐式类型变量都是为匿名类型的实例而存在的。

隐式类型变量只能用于以下的场合:
1. 局部变量声明
2. for、foreach 语句中变量声明
3. using 语句初始化变量

特别注意:不能在类的字段中或方法的参数中使有隐式类型。
有没有办法在创建匿名类型的方法内部,将其实例传到方法的外部呢?
答案是肯定的,主要有两种方法:
1,利用object参数,因为隐式类型变量可以自动转换为objcet。
 

代码示例:
public void OutVarInstance1(out object obj)//把匿名类型的实例传到方法外1:使用object
{  
     var v1 = new
     {
        Name = "ZYS",
        Type = "CEO"
     };
     obj=v1;
}
 

在这里隐式类型变量可以自动的转换为object类型。当然对于调用者而言其操作仅限于object支持的那些。

2,利用方法类型推导,匿名类型的实例以一个方法的"类型参数"的形式来传递,编译器可以推导出具体的类型。
 

代码示例:

public void OutVarInstance2()//把匿名类型的实例传到方法外2:使用"类型参数"
{
     var v2 = new {Title = "2222",Text = "Ok"};
     Method(v2);
}

public void Method(T input)
{
  Console.WriteLine(string.Format("Text out {0}",input));
}
 

这样,在Method中就可以对匿名类型的实例进行访问了。


    
 
 

您可能感兴趣的文章:

  • 与MSSQL对比学习MYSQL的心得(四)--BLOB数据类型
  • Sql学习第一天——SQL 将变量定义为Table类型(虚拟表)
  • c# 类型构造器学习
  • SQL学习笔记七函数 数字,日期,类型转换,空值处理,case
  • C#学习笔记之用户定义类(或结构)的类型转换
  • C#学习笔记之匿名类型
  • c#反射机制学习和利用反射获取类型信息
  • C#学习笔记之C#的虚方法
  • C#学习笔记之C#中的类
  • C#学习笔记之C#类的初始化
  • C#.NET学习笔记5 C#中的条件编译
  • C#学习笔记之C#接口的索引器
  • C#学习笔记之C#只读字段
  • C# 全局变量的学习小结
  • c# 常量与字段学习
  • C#学习笔记之抽象类和抽象函数
  • c# MD5加密的代码(简单示例,仅供学习参考)
  • C# 泛型数组学习小结
  • C#学习笔记之C#结构
  • 实例学习C#中Ref,Out的用法
  • C#学习笔记之扩展方法
  • C#学习笔记之继承
  • C#类的学习笔记之C#构造函数
  • c#进度条ProgressBar学习笔记
  • C# 泛型数组实例学习与总结
  • 实例学习C#中is与As运算符号的用法
  • c#方法重写和隐藏的学习示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 学习C#静态函数及变量的一个精典例子与代码
  • pyv8学习python和javascript变量进行交互
  • PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
  • Shell编程之Shell变量学习总结
  • PHP介绍及学习网站推荐
  • 想深入学习Java应该学习哪些东西
  • 准备学习docker: docker version命令查看版本
  • 新手提问:学习c++同时也想学习unix和linux
  • HTML 学习总结及下一步学习教程推荐
  • 学习c后,学习pb,大家提点建议,谢谢哦
  • OpenStack相关学习资料搜集
  • 有最近开始学习Minix的吗?一起来学习吧
  • juqery的python实现:pyquery学习使用教程
  • 我想问问哪里有AIX下啊!~版本越新越好!~我想拿来学习学习
  • 想找共同学习Linux的新手,一起学习,共同成长
  • 学习java好 还是学习嵌入式开发好??
  • 学习linux网络编程需要学习些内核知识吗?
  • 我想学习linux桌面编程,那么有没有必要学习linux的内核以及内核的相关编程呢?
  • 从Delphi开始学习Java,如何学习Java.欢迎大家的光临!
  • 我想问一个大家,我现在刚学习LINUX,我想问一下在LINUX学习哪些知识有前途??? iis7站长之家
  • 谁有 电子版 mastering ejb 2e 多谢!!及学习EJB 集合什么实例学习比较快一点?
  • 我想学习Unix,请高手给个下载网址,用linux来学习Unix差别大吗?
  • 你们学习Linux是学习什么的?
  • 我想问一个大家,我现在刚学习LINUX,我想问一下在LINUX学习哪些知识有前途???
  • unix下C++代码中如何进行数据库操作?给个完整代码学习学习


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3