C#隐式类型变量(var)的使用与限制

宇托 15 0 条

从3.0开始,C#引入了隐式类型变量的关键字cs#var。这是一个用得很爽的关键字,在很多地方都可以用,不过它也有一些注意点。在使用时我们要注意以下几个方面。

  • cs#var申明的隐式类型变量也是强类型的。
  • cs#var只能用于局部变量,不能用于类属性和字段。
  • cs#var在申明后必须初始化,用更通俗的话来说,cs#var只不过是类型的简写,在编译时会把cs#var替换成对应的类型。如果编译器不能推断出类型(比如cs#null),就会出现编译错误。

我个人觉得它主要可以用于以下几个方面。

  • for语句里,如cs#for (var i = 1; i < 10; i++)
  • foreach语句里,如cs#foreach (var item in list)
  • using语句里,如cs#using (var sreader = new StreamReader("C:\\myfile.txt"))
  • 用在linQ语句里,如cs#var expr = from c in customers select c.name;
  • 用在比较长的类型里,如cs#var list = new List<Dictionary<string, Customer>>();

cs#var申明的数字变量的编译器推断。

  • 在没有用数字申明后缀(D,L,F)的整数推断为int(System.Int32)
  • 在没有用数字申明后缀(D,L,F)的小数推断为double(System.Double)。

下面用一些例子来说明

1. 用cs#var申明的隐式类型变量也是强类型的。比如下面的代码会出现编译错误。

var intVal = 10;
// intVal是int类型,不能再把字符串赋值给int型
intVal = "test";

2. cs#var只能用于局部变量,不能用于类属性和字段。比如下面的代码会出现编译错误。

class Test {
    // 不能用于类字段
    private var intVal = 10;
    // 不能用于类属性
    private var TestVal { get; set; }
}

3. cs#var在申明后必须初始化。比如下面的代码会出现编译错误。

// intVal未初始化
var intVal;
intVal = 10;

4. 编译器不能推断出类型。比如下面的代码会出现编译错误。

// 编译器无法从null推断出类型
var testValue = null;

5. cs#var的默认数字类型。比如下面的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var intVal = 1;
            var doubleVal = 1.0;

            Console.WriteLine(intVal.GetType());
            Console.WriteLine(doubleVal.GetType());
        }
    }
}

其输出为

System.Int32
System.Double

参考地址:
隐式类型的局部变量(C# 编程指南)
2.2.2 隐式类型局部变量的使用和限制

发表我的评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址