zoukankan      html  css  js  c++  java
  • C#关键字var是什么,在何种情况下使用

    从.NET 3.0开始,在方法内部可以使用var关键字声明局部变量。var关键字到底是什么?在何种情况下使用呢?
     

    □ var关键字用来隐式地声明一个数据类型,变量类型是在编译期确定的,而不是在运行时确定的

    声明一个var变量a,把整型数10赋值给a,接着把一个字符串赋值给变量a。运行发现报错:无法将类型string隐式转换为int。
    1
    这说明:用var声明一个变量时,虽然不是显式声明,但在编译期,已经确定了变量的类型。

     

    通过反编译同样可以证明以上推断。

    →把a = "abc";这行代码去掉,并生按F6生成解决方案。
    →打开"VS2012开发人员命令提示",输入如下命令
    2
    →在"解决方案资源管理器"中右键项目的名称,选择"在文件资源管理器中打开文件夹",再点击bin,Debug文件夹,在地址栏中赋值Debug文件夹的路径
    →点击"IL DASM"的文件--打开,输入刚才拷贝的Debug文件夹路径,再选择.exe后缀的可执行文件,双击"Main:void(string[])"。在IL代码中:
    3
    可以看出:变量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并不是一个强类型变量。
    4   


    如果我们用强类型的类来接收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关键字声明的变量接收

     

     

     

     

  • 相关阅读:
    画江恩线
    从装饰者模式的理解说JAVA的IO包
    Form表单标签的Enctype属性的作用及应用示例介绍
    spring中的通配符
    简析SynchronousQueue,LinkedBlockingQueue,ArrayBlockingQueue
    Java数据封装成树形结构,多级
    详解InitializingBean、initMethod和@PostConstruct
    SpringCloud确保服务只能通过gateway转发访问,禁止直接调用接口访问
    Spring中的InitializingBean接口的使用
    Linux下Centos7对外开放端口
  • 原文地址:https://www.cnblogs.com/darrenji/p/3959516.html
Copyright © 2011-2022 走看看