服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

2022-01-21 13:50DW039 C#

随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。下面通过本文给大家分享C# 匿名对象(匿名类型)、var、动态类型 dynamic,需要的的朋友参考下吧

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

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

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

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 = 10;
 string s = "abc";
 student student = new student();
 //下面出现编译错误,变量类型在声明后无法再变更
 s = a;
 student = s;
 a = 10.1f;
}

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

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

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

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

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

?
1
2
3
4
5
6
//在此处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#依然是强类型语言)。示例代码如下:

?
1
2
3
4
static void main(string[] args)
{
  new {name="张三",age=20,like="lol"};
}

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

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

var登场

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

?
1
2
3
4
5
6
static void main(string[] args)
{
 //xxx为类型声明
 //x为引用变量
  xxx x = new {name="张三",age=20,like="lol"};
}

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

?
1
2
3
4
static void main(string[] args)
{
  var x = new {name="张三",age=20,like="lol"};
}

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

详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

var使用注意事项:

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

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

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

详解C# 匿名对象(匿名类型)、var、动态类型 dynamic

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

?
1
2
3
4
5
static void main(string[] args)
 {
  var x = new { name = "张三", age = 20, like = "lol" };
  var s = new { name = x.name, age = x.age };
 }

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

动态类型 dynamic 出场

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

?
1
2
3
4
5
6
7
8
9
static void main(string[] args)
 {
  var x = getobject();
 }
 
 private static xxx getobject()
 {
  return new { name = "张三", age = 20, like = "lol" };
 }

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

?
1
2
3
4
5
6
7
8
9
static void main(string[] args)
 {
  var x = getobject();
  console.writeline(x.name);
 }
 private static dynamic getobject()
 {
  return new { name = "张三", age = 20, 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,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:http://www.cnblogs.com/dw039/p/7472119.html

延伸 · 阅读

精彩推荐
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10