类型推断

类型推断与 var 关键字

观察下方代码,变量声明开头的类型,编译器完全可以通过等号右侧的初始化内容自动推导出来。例如下面的18是不是可以推到出是整数int,Phone() 是不是可以推导出是Phone?

static void Main( )
{
    int age = 18; // 右侧18可直接推断为int
    Phone p = new Phone(); // 右侧构造函数返回Phone
}
Code language: C# (cs)

所以上面代码,是不是还可以简化?

C# 提供var关键字简化写法,替代显式类型。

static void Main( )
{
    var age = 18;
    var p = new Phone();
}
Code language: JavaScript (javascript)

上面代码左侧的变量类型都是var,编译器会根据右侧类型推断出左侧,最终编译后,上面两份代码是一样的。

注意

  1. var不是动态类型,只是语法简写,编译器会在编译阶段锁定推导出来的类型,后续不可变更;两段代码语义完全等价。
  2. 使用var的强制约束:
    • 仅能用于局部变量,不能用于类的实例字段
    • 声明时必须附带初始化赋值,不能只写var x;
    • 推导后的类型固定,变量后续不能存储其他类型数据
  3. 重要区分:C# 的var ≠ JavaScript 的var JS var 是动态弱类型,变量可随时切换存储不同类型;C# var 仅为静态强类型的简写,不会改变 C# 强类型语言特性。

也就是上面的var,是在编译阶段,编译器会根据右侧推断,把age 的类型改为int,把p 改为Phone。最终和上面第一份代码一样。

后续不能修改它们的类型。例如:

class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();
    }
}

class Phone
{
    public string Name { get; set; }
}Code language: C# (cs)

以上写法,在C#中是错误的,但是在一些其他的语言,例如JavaScript PHP 是允许的,它们允许更改变量的类型。

js和php属于 弱类型、动态类型语言,变量没有固定类型约束的。

错误例子


class Program
{
    static void Main()
    {
        var age = 18;
        age = 3.14;
        var p = new Phone();

        var isBuy;
    }
}

class Phone
{
    var price = 1000;
    var model = "iPhone";

    int count = 12;
}Code language: C# (cs)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注