本文是要写的下篇《C#反射及优化用法》的前奏,不能算是下一篇文章的基础的基础吧,有兴趣的朋友请关注一下我的blog,这也有助于提高本人写作的动力。

随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变。既然是强类型语言,那编写任一程序均要求满足下面的基本条件:

1、变量声明必须指明其类型

2、变量类型明确后,其类型在Runtime亦不能改变

代码如下:

    public  class Student
{
public string Name { get; set; }
public int Age { get; set; }
public string Like { get; set; }
}
static void Main(string[] args)
{
int a = ;
string s = "abc";
Student student = new Student();
//下面出现编译错误,变量类型在声明后无法再变更
s = a;
student = s;
a = 10.1f;
}

然而,在实际开发中我们经常面临如下几种常见问题:

1、在一个较大的程序程序中,只有一处或很少几处(不超过3处)需要用到 某个或某些类型(如上 Student),其他地方不再需要这些类型。单独声明一个Student类型,所需代码量,可能超过使用该类型时的代码量,投入产出比不划算。

2、在一处程序中,只需要某种类型对象的部分属性或方法参与运算。在这种情况下将该类型对象临时转换为程序所需的部分属性和方法的对象,可使程序更加精简。

3、其他情况........我暂未留意到......欢迎补充........

上面这些 C# 实际开发中常见问题,在 JavaScript 开发中有着比较好的解决方案,如下:

//在此处js中需要模拟一个学生对象
student = {"name":"张三","age":20,"like":"LOL"};
//在此处js中需要模拟一个老师对象
teacher = {"name":"李老师","like":"没收学生手机,自己LOL"};
//此处需要将学生student转换成只有name和age的对象
person = {"name":student.name,"age":student.age};

如果你不熟悉上面的js语法,你可以去百度搜索 “json语法”,告诉你很简单哦(而且很重要)。

匿名对象(匿名类型)

因此C#在3.0版本中吸收了JavaScript脚本语言的这种语法优点,对C#做了相应升级使其也支持这种语法形式(C#依然是强类型语言)。示例代码如下:

static void Main(string[] args)
{
new {Name="张三",Age=,Like="LOL"};
}

上面的C#代码 通过new关键字告诉编译器要创建一个对象,该对象具有Name,Age,Like三个属性,=后为属性对应的值。如此我们避开了“创建一个对象首先要有该对象类型的约束”,因此在开发过程中对于使用较少的类型我们无需再创建单独的类了,上面提到的问题1被解决

现在创建出来的对象没指定具体类型,因此称为匿名对象

Var登场

现在要使用匿名对象,则需要使用变量引用它。虽然我们在创建时没有指定对象的类型,但编译器会在编译过程中帮我们创建一个具有相关属性和方法的类型。此时编译出的类型名称是随机生成的,因此变量类型无法确定。示例如下:

static void Main(string[] args)
{
//XXX为类型声明
//x为引用变量
XXX x = new {Name="张三",Age=,Like="LOL"};
}

虽然我们不知道编译器生成的类型名称,但我们可 让编译器自己根据编译的结果来推断变量类型。此时var关键字便发挥作用了:

static void Main(string[] args)
{
var x = new {Name="张三",Age=,Like="LOL"};
}

var 关键字说明 x 的类型由赋于的值来决定(推定),并能根据编译器推定给出智能提示,如下图:

var使用注意事项:

1、var 仅能声明方法内的局部变量

2、var 声明的变量在被赋值后类型即确定下了,后续程序中不能在赋其他类型的值

3、var x = new object() 没有意义,不要写这样的代码...............

现在有匿名对象和var推断类型的支持,我们就能处理上面提到的问题2。示例代码如下:

        static void Main(string[] args)
{
var x = new { Name = "张三", Age = , Like = "LOL" };
var s = new { Name = x.Name, Age = x.Age };
}

上面仅为示例,如果你熟悉Linq或Entity Framework,那问题2对应的用法将是铺天盖地的.......

动态类型 dynamic 出场

对于匿名类型的使用一般局限于方法的局部,可理解为:随用随定义,用完就消失。有如下情况应该怎么办?

        static void Main(string[] args)
{
var x = GetObject();
} private static XXX GetObject()
{
return new { Name = "张三", Age = , Like = "LOL" };
}

通过GetObject方法返回一个匿名对象,所以方法返回值 类型名称无法确定,此处暂时用XXX代替。在这种情况下返回的类型不确定,可以使用 dynamic 来指明。如下:

        static void Main(string[] args)
{
var x = GetObject();
Console.WriteLine(x.Name);
} private static dynamic GetObject()
{
return new { Name = "张三", Age = , Like = "LOL" };
}

此时方法不会出现语法错误,程序可以成功编译并执行。那么 dynamic 到底做了什么,可以使上面的程序成功编译呢?

dynamic的作用:

1、dynamic 表示动态类型,动态类型的含义就是 程序编写、编译阶段 类型不确定,在Runtime时再通过反射机制确定相关对象的属性或方法。因此编写阶段不会进行语法检测。

2、dynamic 可用来声明 字段、属性、方法参数、方法返回值

3、dynamic 不支持智能提示,因为你写代码时 dynamic  是什么没法知晓(反射)

dynamic 声明的变量,可理解为 object 类型变量。所以给dynamic变量赋任何类型值都正确,但在使用变量来取得某个属性值或调用某方法时(此时程序肯定处于Runtime状态),CLR会检查(反射)所调用的属性或方法是否存在,不存在报运行时异常。

dynamic在 Asp.net Mvc web开发中处处使用,虽然看上去很复杂,本质就上面所说内容。

说明:

var 和 dynamic 看似功能类似,但它们是不同的:

  var dynamic
 声明字段  ×  √
 局部变量  √  √
 方法参数类型  ×  √
 方法返回值类型  ×  √

C# 匿名对象(匿名类型)、var、动态类型 dynamic的更多相关文章

  1. c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic

    比如有一个匿名对象,var  result =......Select( a=>new {  id=a.id, name=a.name});然后Object  obj =  result ;我怎 ...

  2. 六.OC基础--1. id和instancetype类型,2.动态类型检测,3.响应方法,构造方法,4.重写构造方法,5.自定义构造方法

    1. id和instancetype类型, id和instancetype类型区别: 1. id和instancetype都可以用来作为方法的返回值 2. id可以用来定义类型,instancetyp ...

  3. c++ :OOP之静态类型与动态类型

    所谓静态类型即类型指针或引用的字面类型:而动态类型即类型指针或引用的实际类型. 这一对概念一般发生在基类和派生类之间. 如: class Base { ..... } class Derived : ...

  4. C# 匿名对象(匿名类型)、var、动态类型 dynamic——实用之:过滤类属性、字段实用dynamic

    例子 返回一个LIst<oject>类型 而oject含有 30个字段 而我只需要两个字段.这里实用dynamic 和 linq. 上代码: 注意select new {} 为匿名类型,这 ...

  5. 当类型为dynamic的视图模型遭遇匿名对象

    当年在ASP.NET MVC 1.0时代我提到,在开发时最好将视图的Model定制为强类型的,这样可以充分利用静态检查功能进行排错.不过有人指出,这么做虽然易于静态检查,但是定义强类型的Model类型 ...

  6. [javase学习笔记]-6.5 类类型參数与匿名对象

    这一节我们来说说类类型參数和匿名对象. 我们继续用之前的小汽车类吧 class Car { int num;//这是轮胎数属性 String color;//这是颜色属性 String brand;/ ...

  7. var和dynamic的应用 var、动态类型 dynamic 深入浅析C#中的var和dynamic ----demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 利用dynamic解决匿名对象不能赋值的问题

    原文:利用dynamic解决匿名对象不能赋值的问题 关于匿名对象 匿名对象是.Net Framework 3.0提供的新类型,例如: }; 就是一个匿名类,搭配Linq,可以很灵活的在代码中组合数据, ...

  9. C# 匿名对象随笔

      最新更新请访问: http://denghejun.github.io   C#中匿名对象的一般写法是这样的: object o=new {Name="TestName"}; ...

随机推荐

  1. Mybatis Dynamic Query 简单筛选

    在框架中,筛选描述类有两种(FilterDescriptor, FilterGroupDescriptor),这里我们主要举例来说明FilterDescriptor用法. FilterDescript ...

  2. jdk配置java_home的两种方式

    在开发java项目的时候,要先安装jdk,安装完jdk之后我们要配置环境变量.今天说一下java home环境变量. 配置环境变量有两种方式,一种就是在计算机的环境变量里面配置.这个是很简单的.如果你 ...

  3. PHPsthdy+xdebug

    PHPsthdy下载后查看phpinfo后会发现没有xdebug这一项: 1.phpStudy集成了XDebug扩展,所以不用单独下载XDebug. 2.打开XDebug扩展:右击PHPstudy的图 ...

  4. 电脑只能上QQ,不能上网浏览网站怎么解决

    这个问题通常是因为网络的DNS解析出错引起的.QQ一类的聊天软件有自动的网络解析,不需要DNS便可以使用,而一般的浏览器是需要DNS解析来访问网页的.所谓DNS,即域名服务器(Domain Name ...

  5. windows本地提权对照表(转载)

    2003     systeminfo>C:\Windows\Temp\temp.txt&(for %i in (KB3057191 KB2840221 KB3000061 KB2850 ...

  6. Backpropagation 算法的推导与直观图解

    摘要 本文是对 Andrew Ng 在 Coursera 上的机器学习课程中 Backpropagation Algorithm 一小节的延伸.文章分三个部分:第一部分给出一个简单的神经网络模型和 B ...

  7. docker - 设置HTTP/HTTPS 代理

    背景 将docker的服务器环境切换到新的网络之后,由于服务器的internet是受限制的(需要连接配置远程代理,不能直接上网).因此,在使用docker连接docker hub 的时候,就会出错: ...

  8. ABP+AdminLTE+Bootstrap Table权限管理系统第七节--登录逻辑及abp封装的Javascript函数库

    经过前几节,我们已经解决数据库,模型,DTO,控制器和注入等问题.那么再来看一下登录逻辑.这里算是前面几节的一个初次试水. 首先我们数据库已经有的相应的数据. 模型和DTO已经建好,所以我们直接在服务 ...

  9. 小兴趣:用python生成excel格式座位表

    脚本分两个文件: 1.生成二维随机列表:GenerateLocaltion.py 2.将列表导入excel文件:CreateExcel.py 先上GenerateLocaltion.py: impor ...

  10. HTML <img>标签 创建图像映射

    初级前端一枚 下面代码是在图片上创建图像映射 自己整理了下 做个笔记 希望也可以帮助后来学习的朋友! <map name="planetmap"> <area s ...