C# 中 Var 和 Dynamic 的区别

17 Mar 2025 | 5 分钟阅读

在本文中,我们将讨论 VarDynamic 关键字 之间的区别。在讨论它们之间的区别之前,我们必须了解 C# 中的 Var 和 Dynamic。众所周知,任何语言的编程都始于变量的声明、它们的逻辑定义以及随后的实现。因此,在我们开始编写代码之前,了解如何在编程语言中声明变量非常重要。

与早期版本的 C# 一样,所有编写的代码在编译时都会进行自我验证。它是一种静态类型语言,变量使用 var 关键字进行声明。C# 4.0 及更高版本引入了 "dynamic",其中语法验证或错误检查仅在运行时发生。"Dynamic" 关键字也已引入用于变量声明。

Var 关键字是什么?

隐式类型 局部变量 (var) 是在没有显式指定 .NET 类型的情况下声明的变量。当变量被隐式类型化时,它会在编译时使用初始化时提供的值自动确定其类型。C# 3.0 引入了隐式类型变量的概念。隐式类型变量并非旨在取代常规变量声明。相反,它旨在处理特定情况,例如 LINQ (Language Integrated Query)

语法

它具有以下语法:

示例

让我们举个例子来说明 C# 中的 Var 关键字

输出

The type of 'a1' is System.Char 
The type of 'a2' is System.String 
The type of 'a3' is System.Double 
The type of 'a4' is System.Boolean 
The type of 'a5' is System.Int32 

说明

在此示例中,程序显示了 Var 关键字的用法。它允许用户在不定义数据类型的情况下声明变量。编译器可以自动分配数据类型。变量被声明,程序使用控制台语句显示 var 关键字的类型。

Dynamic 关键字是什么?

C# 4.0 中引入了一个新的动态关键字。动态声明的变量类型是动态表达的。这些变量类型在运行时声明和确定。声明的动态变量在声明时不需要初始化。编译器在编译时不知道变量的时间,因此无法在编译时捕获错误。在运行时,变量类型被设置,导致 IntelliSense 的缺失。

与 C# 的 var 关键字类似,dynamic 关键字也用于在不指定显式类型的情况下定义变量。在编译时,Var 变量被设置为其类型,而在运行时,它被固定为动态变量。

示例 1

示例 2

当整数被赋给 ob 时,编译器不会生成任何错误消息。编译器将 obj 的类型创建为字符串,当将整数值赋给 ob 时,它又会重新创建 obj 的类型为整数类型。

示例

让我们举个例子来说明 C# 中的 Dynamic 关键字

输出

The actual datatype of v1: System.String
The actual datatype of v2: System.Int32
The actual datatype of v3: System.Double
The actual datatype of v4: System.Boolean

说明

在此示例中,dynamic 关键字用于创建其数据类型在运行时而非编译时定义的变量。在上面的程序中,v1、v2、v3 和 v4 使用 dynamic 关键字通过 GetType() 方法声明。结果使用 ToString() 方法转换为字符串。

C# 中 Var 和 Dynamic 的主要区别

Difference between Var and Dynamic in C#

var 和 dynamic 在 C# 中存在一些区别。一些主要区别如下:

Var动态
C# 语言中的 Var 在 C#3.0 中引入。Dynamic 稍后在 C#4.0 中引入。
变量使用静态类型 var 关键字 声明。变量使用动态关键字声明,它是动态类型的。
变量在编译时分配给编译器进行解释。编译器在运行时决定变量的类型。
此变量类型必须在声明时初始化。变量由编译器分配类型,编译器会使用并对其进行初始化。此变量类型在声明时不需要初始化。在编译时,编译器不知道该变量的类型。
如果未初始化变量,则会引发错误。如果未初始化变量,则不会发生错误。
Visual Studio 支持 IntelliSenseVisual Studio 不支持 IntelliSense。
variable temp = 100;
temp = "Program";
编译器会返回一个错误,因为 temp 变量的类型已由语句 1 确定,它是整数类型。当您将字符串赋给“temp 变量”时,编译器会显示警告,这意味着安全措施不会受到侵犯。
dynamic temp = 100;
temp = "Programming";
即使 temp 是整数类型,编译器也不会返回错误。
将字符串赋给“temp”会重新创建“temp”的类型并成功接受字符串。

结论

在本文中,我们学习了 C# 中的 VarDynamic 关键字。两者都用于变量声明中的不同目的。我们可以根据程序的需要选择这些关键字。