从.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 strs
                where s.Length > 3
                select 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 strs
                where s.Length > 3
                select 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 strs
                    where s.Length > 3
                    select new { Key = s.Length, Value = s };
            foreach (var item in o)
            {
                Console.WriteLine(item.Key);
            }

        }
    }

以上,var类型变量o接收匿名类型集合,该集合的每个元素也是强类型。也就是说,编译器在编译的时候自动推断类型。

总结:
○ 通过var关键字声明的变量,变量类型是在编译期确定的,而不是在运行时确定
○ 对于LINQ表达式返回的匿名类型,可以用var关键字声明的变量接收
○ 对于一些名称比较长的类,类实例化的时候,可以用var关键字声明的变量接收

C#关键字var是什么,在何种情况下使用的更多相关文章

  1. 【SpringCloud】Zuul在何种情况下使用Hystrix

    首先,引入spring-cloud-starter-zuul之后会间接引入: hystrix依赖已经引入,那么何种情况下使用hystrix呢? 在Zuul的自动配置类ZuulServerAutoCon ...

  2. 简述C#中关键字var和dynamic的区别

    C#中关键字var和dynamic的区别如下: 1.var申明的变量必须初始化,dynamic申明的变量无需初始化. 2.var关键字只能在方法内部申明局部变量,dynamic关键字可用于局部变量,字 ...

  3. 变量声明关键字var ,let,const

    今天带大家了解的是比较有趣的几个变量声明关键字var,let,const. 我们在最初接触JS的时候,变量是我们重要的一个组成部分,在使用时规定必须要先进行声明,否则网页将会报错: console.l ...

  4. mysql 是如何保证在高并发的情况下autoincrement关键字修饰的列不会出现重复

    转载自 https://juejin.im/book/5bffcbc9f265da614b11b731/section/5c42cf94e51d45524861122d#heading-8 mysql ...

  5. 【DATAGUARD】物理dg在主库丢失归档文件的情况下的恢复(七)

    [DATAGUARD]物理dg在主库丢失归档文件的情况下的恢复(七) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到 ...

  6. 把cookie以json形式返回,用js来set cookie.(解决手机浏览器未知情况下获取不到cookie)

    .继上一篇随笔,链接点我,解决手机端cookie的问题. .上次用cookie+redis实现了session,并且手机浏览器可能回传cookies有问题,所以最后用js取出cookie跟在请求的ur ...

  7. 关于xamarin.forms在MVVM情况下如何DisplayActionSheet

    最近一直在研究Xmarin.forms,碰到了一个棘手的问题,就是在MVVM的情况下如何在ViewModel中去使用DisplayActionSheet,然而我使用的是XAML模式,也就是说,只有在后 ...

  8. 端口限制情况下php+xdebug环境配置

    PHP程序在开发的时候调试是比较方便的,大体情况下,输出,打log是可以解决几乎所有问题. 但是还不够,有些问题,用打log的形式定位问题是相当痛苦的事情,有些时候测试环境没配好的话,你可能需要做许多 ...

  9. 关于WCF服务在高并发情况下报目标积极拒绝的异常处理

    最近弄了个wcf的监控服务,偶尔监控到目标服务会报一个目标积极拒绝的错误.一开始以为服务停止了,上服务器检查目标服务好好的活着.于是开始查原因. 一般来说目标积极拒绝(TCP 10061)的异常主要是 ...

随机推荐

  1. PHP array_diff 计算数组的差集

    array_diff (PHP 4 >= 4.0.1, PHP 5) array_diff — 计算数组的差集 说明 array array_diff ( array $array1 , arr ...

  2. OnClickListener接口

    package com.example.wang.testapp2; import android.support.v7.app.AppCompatActivity; import android.o ...

  3. vue2.0组件通信各种情况总结与实例分析

    Props在vue组件中各种角色总结 在Vue中组件是实现模块化开发的主要内容,而组件的通信更是vue数据驱动的灵魂,现就四种主要情况总结如下: 使用props传递数据---组件内部 //html & ...

  4. 用html5实现的flappy-bird

    可能网上早就有几个flappy-bird的html5版本啦,到这个时候flappy-bird可能也没有之前那么火了,但是作为一个新手,自己思考,自己动手写一个flappy-bird的demo还是很有成 ...

  5. PHP isset和empty 详细比较

    找了几篇博文,这应该是说的最清楚的.链接如下:http://blog.chinaunix.net/uid-25311424-id-3966622.html

  6. 在控制台连接oracle

    Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\lijt>sqlplus ...

  7. MIT-6.828-JOS-环境搭建

    MIT 6.828是操作系统中最经典的一门课程.完成所有的lab就相当于完成了一个迷你的操作系统.我跟的是2018年的课程,课程首页在6.828课程官网.当然所有资料都是英文的,所以难度也不低,这里推 ...

  8. HDU - 1754 A - I Hate It 线段树

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. 深度学习基础系列(九)| Dropout VS Batch Normalization? 是时候放弃Dropout了

    Dropout是过去几年非常流行的正则化技术,可有效防止过拟合的发生.但从深度学习的发展趋势看,Batch Normalizaton(简称BN)正在逐步取代Dropout技术,特别是在卷积层.本文将首 ...

  10. mysql正则表达式,实现多个字段匹配多个like模糊查询

    现在有这么一个需求 一个questions表,字段有题目(TestSubject),选项(AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) 要求字段不包含png,jpg ...