C#关键字var是什么,在何种情况下使用
从.NET 3.0开始,在方法内部可以使用var关键字声明局部变量。var关键字到底是什么?在何种情况下使用呢?
□ var关键字用来隐式地声明一个数据类型,变量类型是在编译期确定的,而不是在运行时确定的
声明一个var变量a,把整型数10赋值给a,接着把一个字符串赋值给变量a。运行发现报错:无法将类型string隐式转换为int。
这说明:用var声明一个变量时,虽然不是显式声明,但在编译期,已经确定了变量的类型。
通过反编译同样可以证明以上推断。
→把a = "abc";这行代码去掉,并生按F6生成解决方案。
→打开"VS2012开发人员命令提示",输入如下命令
→在"解决方案资源管理器"中右键项目的名称,选择"在文件资源管理器中打开文件夹",再点击bin,Debug文件夹,在地址栏中赋值Debug文件夹的路径
→点击"IL DASM"的文件--打开,输入刚才拷贝的Debug文件夹路径,再选择.exe后缀的可执行文件,双击"Main:void(string[])"。在IL代码中:
可以看出:变量a已经是Int类型,并且是一个局部变量。
□ var关键字让编码更简短
对于一些名称比较长的类,当创建类实例的时候,用var关键字看上去更简短。当然这个理由是比较牵强的~~
class Program{static void Main(string[] args){HelloIHaveALongLongName<string, string> obj = new HelloIHaveALongLongName<string, string>();}}public class HelloIHaveALongLongName<T, T>{public string Name;}
如果使用var关键字,就变成:
var obj = new HelloIHaveALongLongName<string, string>();obj.Name = "hello";
可见,用var关键字,让写法更简短,并且var变量是一个强类型。
□ var关键字与匿名类型
通过LINQ表达式返回一个匿名类型。
static void Main(string[] args){string[] strs = {"hello", "world", "nice", "to", "meet", "you"};object o = from s in strswhere s.Length > 3select new {s.Length, s};}
以上,object类型变量o并不是一个强类型变量。
如果我们用强类型的类来接收LINQ返回的集合。
class Program{static void Main(string[] args){string[] strs = {"hello", "world", "nice", "to", "meet", "you"};IEnumerable<SomeData> o = from s in strswhere s.Length > 3select new SomeData() {Key = s.Length, Value = s};foreach (SomeData item in o){Console.WriteLine(item.Key);}}}public class SomeData{public int Key;public string Value;}
以上,在IEnumerable<SomeData>类型集合中,每一个集合元素都是强类型。
如果用var关键字来接收LINQ返回的匿名类型集合。
class Program{static void Main(string[] args){string[] strs = { "hello", "world", "nice", "to", "meet", "you" };var o = from s in strswhere s.Length > 3select new { Key = s.Length, Value = s };foreach (var item in o){Console.WriteLine(item.Key);}}}
以上,var类型变量o接收匿名类型集合,该集合的每个元素也是强类型。也就是说,编译器在编译的时候自动推断类型。
总结:
○ 通过var关键字声明的变量,变量类型是在编译期确定的,而不是在运行时确定
○ 对于LINQ表达式返回的匿名类型,可以用var关键字声明的变量接收
○ 对于一些名称比较长的类,类实例化的时候,可以用var关键字声明的变量接收
C#关键字var是什么,在何种情况下使用的更多相关文章
- 【SpringCloud】Zuul在何种情况下使用Hystrix
首先,引入spring-cloud-starter-zuul之后会间接引入: hystrix依赖已经引入,那么何种情况下使用hystrix呢? 在Zuul的自动配置类ZuulServerAutoCon ...
- 简述C#中关键字var和dynamic的区别
C#中关键字var和dynamic的区别如下: 1.var申明的变量必须初始化,dynamic申明的变量无需初始化. 2.var关键字只能在方法内部申明局部变量,dynamic关键字可用于局部变量,字 ...
- 变量声明关键字var ,let,const
今天带大家了解的是比较有趣的几个变量声明关键字var,let,const. 我们在最初接触JS的时候,变量是我们重要的一个组成部分,在使用时规定必须要先进行声明,否则网页将会报错: console.l ...
- mysql 是如何保证在高并发的情况下autoincrement关键字修饰的列不会出现重复
转载自 https://juejin.im/book/5bffcbc9f265da614b11b731/section/5c42cf94e51d45524861122d#heading-8 mysql ...
- 【DATAGUARD】物理dg在主库丢失归档文件的情况下的恢复(七)
[DATAGUARD]物理dg在主库丢失归档文件的情况下的恢复(七) 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到 ...
- 把cookie以json形式返回,用js来set cookie.(解决手机浏览器未知情况下获取不到cookie)
.继上一篇随笔,链接点我,解决手机端cookie的问题. .上次用cookie+redis实现了session,并且手机浏览器可能回传cookies有问题,所以最后用js取出cookie跟在请求的ur ...
- 关于xamarin.forms在MVVM情况下如何DisplayActionSheet
最近一直在研究Xmarin.forms,碰到了一个棘手的问题,就是在MVVM的情况下如何在ViewModel中去使用DisplayActionSheet,然而我使用的是XAML模式,也就是说,只有在后 ...
- 端口限制情况下php+xdebug环境配置
PHP程序在开发的时候调试是比较方便的,大体情况下,输出,打log是可以解决几乎所有问题. 但是还不够,有些问题,用打log的形式定位问题是相当痛苦的事情,有些时候测试环境没配好的话,你可能需要做许多 ...
- 关于WCF服务在高并发情况下报目标积极拒绝的异常处理
最近弄了个wcf的监控服务,偶尔监控到目标服务会报一个目标积极拒绝的错误.一开始以为服务停止了,上服务器检查目标服务好好的活着.于是开始查原因. 一般来说目标积极拒绝(TCP 10061)的异常主要是 ...
随机推荐
- 一步步教你编写不可维护的 PHP 代码
译者注:这是一篇很棒文章,使用有趣的叙述方式,从反面讲解了作为一个优秀的 PHP 工程师,有哪些事情是你不能做的.请注意哦,此篇文章罗列的行为,都是你要尽量避免的. 随着失业率越来越高,很多人意识到保 ...
- epoll测试实例
C++ Code 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...
- 《HBase实战》学习笔记
第二章 入门 HBase写路径: 增加新行和修改已有的行,内部机制是一样的. 写入的时候,会写到预写日志(WAL)和MemStore中. MenmStore是内存里的写入缓冲区.填满后,会将数据刷写 ...
- Chrome-Adobe Flash 无法正常使用
https://support.google.com/chrome/answer/6258784 该网站因是是google.com,被强了,所以一般打不开. 故将google官方说明记录以下: 如果 ...
- Asp.net Vnext 模块化实现
概述 本文已经同步到<Asp.net Vnext 系列教程 >中] 在程序中实现模块化可以加快开发效率,通过替换模块实现升级. 架构 vnext 没有 Virtualpathprovide ...
- markdown 语法规则
markdown 语法规则 参考Markdown--入门指南 也可以参考这篇 Markdown: Basics (快速入门) 一级标题 二级标题 三级标题 列表 无序 1 2 3 有序 1 2 3 需 ...
- File.separator与 \分隔符
在Windows下的路径分隔符和Linux下的路径分隔符是不一样的,当直接使用绝对路径时,跨平台会暴出“No such file or diretory”的异常. 比如说要在temp目录下建立一个te ...
- 8-4 奖品的价值 uva11491(贪心)
题意:给出一个n位整数 请删除d个数字 使得剩余数字最大 一开始写成窗口扫描 非常的麻烦易错 只要保证前d+1 降序即可 如果非降序 则删除 很巧妙的贪心 每次读入和已经保存的数组相比较 ...
- xshell连接不上linux问题
1.首先确定linux系统有网络. 使用ipconfig查看是否有ip地址,没有的话需要先配置. 2.打开sshd服务:service sshd start 3.关闭防火墙服务:service ipt ...
- Ionic Tabs
Ionic 默认的 Tabs 模板 ,Android的在上方,IOS的在下方.在www/js/app.js修改配置,添加一个变量,再修改相应属性: .config(function($statePro ...