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 = 10; 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=20,Like="LOL"}; }
上面的C#代码 经由过程new关键字通知编译器要建立一个对象,该对象具有Name,Age,Like三个属性,=后为属性对应的值。云云我们避开了“建立一个对象起首要有该对象范例的束缚”,因而在开辟过程当中关于运用较少的范例我们无需再建立零丁的类了,上面提到的题目1被处置惩罚。
如今建立出来的对象没指定细致范例,因而称为匿名对象。
Var上台
如今要运用匿名对象,则须要运用变量援用它。虽然我们在建立时没有指定对象的范例,但编译器会在编译过程当中帮我们建立一个具有相干属性和要领的范例。此时编译出的范例称号是随机生成的,因而变量范例没法一定。示例以下:
static void Main(string[] args) { //XXX为范例声明 //x为援用变量 XXX x = new {Name="张三",Age=20,Like="LOL"}; }
虽然我们不知道编译器生成的范例称号,但我们可 让编译器本身依据编译的效果来揣摸变量范例。此时var关键字便发挥作用了:
static void Main(string[] args) { var x = new {Name="张三",Age=20,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 = 20, 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 = 20, Like = "LOL" }; }
经由过程GetObject要领返回一个匿名对象,所以要领返回值 范例称号没法一定,此处临时用XXX替代。在这类状况下返回的范例不一定,能够运用 dynamic 来指明。以下:
Main( x = { Name = , Age = , Like =
此时要领不会涌现语法毛病,顺序能够胜利编译并实行。那末 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的详解的细致内容,更多请关注ki4网别的相干文章!