从C# 3开始,在方法范围内声明的变量可以具有隐式类型var。
隐式类型本地变量为强类型,编译器可以根据变量的初始化值推断出变量的类型。
例如 var i = 0; 和 int i = 0; 是等效的。
使用var的规则
1.只能用于本地变量,而不能用于字段
2.只能在变量声明中包含初始化时使用
3.一旦编译器推断出变量的类型时,var就是固定的,且不可修改
4.变量必须初始化,而且变量不能为空,否则,编译器不能推断出变量类型。
5.变量初始化时必须放在表达式中
6.不能把初始化器设置为对象,除非在初始化器中创建新对象。
static void Main(string[] args)
{
var name = "cat";
var age = 5;
var isCat = true;
Type nameType = name.GetType();
Type ageType = age.GetType();
Type isCatType = isCat.GetType();
Console.WriteLine($"name's type is {nameType}");
Console.WriteLine($"age's type is {ageType}");
Console.WriteLine($"isCat's type is {isCatType}");
}
var 和new一起使用时,可以声明一个匿名类型的对象,匿名类型的对象是继承自Object类型且没有名称的类,该类可以从类初始化器中推断。
如果初始化器中的设置的值是另一个对象的成员,就可以简化初始化器,编译器通过对象的成员推断中新的类型。
匿名类型的对象不能进行任何类型的反射,因为这不会得到一致的结果。
class Program
{
static void Main(string[] args)
{
var name = "cat";
var age = 5;
var isCat = true;
Type nameType = name.GetType();
Type ageType = age.GetType();
Type isCatType = isCat.GetType();
var Cat = new
{
name = "cat",
age = 5,
isCat = true
};
CatClass catClass = new CatClass();
var Cat2 = new
{
catClass.Name,
catClass.Age,
catClass.IsCat
};
Type catType = Cat.GetType();
Console.WriteLine($"name's type is {nameType}");
Console.WriteLine($"age's type is {ageType}");
Console.WriteLine($"isCat's type is {isCatType}");
Console.WriteLine($"Cat's type is {catType}");
}
}
class CatClass
{
public string Name { get; set; }
public int Age { get; set; }
public bool IsCat { get; set; }
}