龙空技术网

C#里的 var 和 dynamic 区别到底是什么,你真的搞懂了嘛

opendotnet 499

前言:

如今看官们对“var定义变量”大体比较重视,咱们都想要知道一些“var定义变量”的相关知识。那么小编在网摘上搜集了一些有关“var定义变量””的相关资讯,希望各位老铁们能喜欢,各位老铁们一起来学习一下吧!

C# 中的 var 和 dynamic 都是用来声明变量的关键字,但它们的用法和作用不同。

var 是用来声明隐式类型变量,即编译器会根据变量的初始化表达式推断出该变量的类型。在编译时,编译器会将 var 替换成实际的类型。例如:

var i = 10; // 推断出 i 的类型为 int

var message = "hello"; // 推断出 message 的类型为 string

而 dynamic 则是用来声明动态类型变量,即在编译时不指定变量类型,而是在运行时根据变量的实际类型推断。使用 dynamic 声明的变量在编译时不会进行类型检查,而是在运行时才会抛出类型异常。例如:

dynamic obj = "hello"; // obj 的类型为 string

obj = 10; // obj 的类型变为 int

因此,var 和 dynamic 的主要区别在于类型的推断时机以及类型检查的时机。需要根据具体的场景选择使用哪种关键字。

下面给出一个具体的例子,展示 var 和 dynamic 的不同用法和效果。假设有一个类 Person,定义如下:

class Person

{

public string Name { get; set; }

public int Age { get; set; }

public void SayHello()

{

Console.WriteLine("Hello, I'm {0}, {1} years old.", Name, Age);

}

}

使用 var 声明一个 Person 类型的变量:

var person = new Person { Name = "Tom", Age = 20 };

person.SayHello(); // 输出:Hello, I'm Tom, 20 years old.

在这个例子中,编译器会根据 person 的初始化表达式 new Person { Name = "Tom", Age = 20 } 推断出 person 的类型为 Person,因此可以直接调用 Person 类型的方法 SayHello()。

使用 dynamic 声明一个 Person 类型的变量:

dynamic person = new Person { Name = "Tom", Age = 20 }; person.SayHello(); // 输出:Hello, I'm Tom, 20 years old. person = "Hello"; person.SayHello(); // 抛出运行时异常:'string' does not contain a definition for 'SayHello'

在这个例子中,使用 dynamic 声明变量 person,编译器不会进行类型检查,而是在运行时根据 person 的实际类型推断。在第一次调用 SayHello() 时,person 的类型为 Person,因此可以正常调用 SayHello()。而在第二次将 person 赋值为字符串 "Hello" 后,再次调用 SayHello() 时,由于字符串类型没有定义 SayHello() 方法,因此会抛出运行时异常。

标签: #var定义变量