在 C# 中,var 和 dynamic 都用于类型管理,但它们用于不同的目的并具有不同的行为:
C# 语言中 var 和 dynamic 的区别
当我们使用 var keword 声明一个变量时,在编译时执行数据类型检查
// Compiler interpret fruitName as string at compile time
var fruitName = "Mango";
当我们使用 var keword 声明一个变量时,该变量可以保存任何类型的数据,但我们不能在程序执行期间更改变量的数据类型
var fruitDynamic = "Mango";
// This line would cause a compilation error because fruitName was already interpreted as string if we try to chnage it's data type it will give us compilation error
// fruitDynamic = 10;
变量只能出现在带有 var 关键字的本地范围内。
using System;
class Program
{
static void Main(string[] args)
{
// Variable declared inside a block scope
var fruitName = "Orange";
// Accessible within the block scope
Console.WriteLine(fruitName);
}
// OuteSide the scope this line would cause a compilation error
Console.WriteLine(fruitName);
}
当我们使用 var 关键字声明一个变量时,如果它的数据类型被正确迭代,那么字符串的属性长度将可以在此处访问。
using System;
class Program
{
static void Main(string[] args)
{
// Variable declared inside a block scope
var fruitName = "Orange";
// fruitName is interpreted as string, so Length property is accessible
Console.WriteLine(fruitName.Length);
}
}
var 关键字是在 C# 3.0 中引入的,它是 .NET Framework 3.5 版本的一部分。
当我们使用动态 keword 声明一个变量时,将在运行时执行数据类型检查。
// fruitName is interpreted as string at runtime
dynamic fruitName = "Mango";
当我们使用动态 keword 声明一个变量时,该变量可以保存任何类型的数据,但我们可以在程序执行期间更改变量的数据类型
dynamic fruitDynamic = "Mango";
// This line would not cause any compilation error
fruitDynamic = 10;
变量可以出现在本地范围内部和外部,带有 dynamic 关键字。
using System;
class Program
{
static void Main(string[] args)
{
// Variable declared inside a block scope
dynamic fruitName = "Orange";
// Accessible within the block scope
Console.WriteLine(fruitName);
}
// Also accessible outside the scope and no compilation and runtime error will come
Console.WriteLine(fruitName);
}
当我们使用 dynamic 关键字对变量进行贴花时,如果它的数据类型被正确迭代,那么字符串的属性长度将可以在此处访问。但是如果我们将其数据类型从 string 更改为 int,因为 int 没有任何 Length 属性,因此它会给我们带来运行时错误。但是,如果我们尝试执行算术运算,它将正确发生,因为我们已将其动态更改为 int 数据类型。
using System;
class Program
{
static void Main(string[] args)
{
// Variable declared inside a block scope
dynamic varDynamic = "Orange";
// varDynamic is interpreted as string, so Length property is accessible
Console.WriteLine(varDynamic.Length);
// Now varDynamic is inferred as int at runtime
varDynamic = 5;
// This line would cause a runtime error because int does not have a Length property
Console.WriteLine(varDynamic.Length);
// Arithmetic operation with dynamic typing is also happening
Console.WriteLine(varDynamic + 10);
// Now myDynamic is intertprted as List at runtime
varDynamic = new List<int> { 1, 2, 3 };
//Count property is again accessible on List
Console.WriteLine(varDynamic.Count);
}
}
dynamic 关键字是在 C# 4.0 中引入的,它是 .NET Framework 4.0 版本的一部分。
总之,var 用于在编译时使用静态类型的隐式类型,而 dynamic 用于在运行时使用后期绑定的动态类型。