0
点赞
收藏
分享

微信扫一扫

C# 中的神奇两兄弟:var 和 dynamic

前言

在 C# 的世界里,我们常常会遇到 var 和 dynamic 这两个亲密无间的好友。

你可能经常用 var 来声明变量,觉得好简洁,但听说过 dynamic 吗?它也很神奇,但是使用场景有所不同。

想象一下,你面前有两面镜子,一面能清晰地反射出你的样子,而另一面则像是魔法镜,可以变幻出各种形态。

var 和 dynamic 就像是这两面镜子,各有其独特的用途和魅力。

今天,我们就来聊聊它们究竟是什么,有什么区别,以及如何在日常开发中巧妙运用它们。

var:编译时类型推断的小助手

首先来说说 var

其实它并不是一种新的数据类型,而是 C# 提供的一个语法糖,用于让编译器自动推断变量的类型。

换句话说,当你使用 var 声明一个变量时,编译器会根据赋值表达式的右侧来确定该变量的实际类型。

比如:

var number = 42; // number 的类型是 int
var message = "Hello, C#"; // message 的类型是 string

看起来很方便是吗?

但请记住,var 只能在声明变量的同时进行初始化,初始化之后它的类型就确定了,不能再改变,如果你试图将一个不同类型的值赋给它,编译器会在编译时给出错误,保护了类型安全。

dynamic:灵活的动态类型

接下来是 dynamic,这是 C# 4.0 引入的一个特性。

与 var 不同,dynamic 类型允许在运行时动态地决定变量的类型。

所以你可以在运行时给 dynamic 赋任何类型的值,编译器不会检查这些类型。

dynamic data = 42; // data 当前为 int
Console.WriteLine(data); // 输出: 42

data = "Hello, dynamic"; // 现在 data 是一个 string
Console.WriteLine(data); // 输出: Hello, dynamic

在这段代码中,变量 data 首先被赋值为一个整数,然后又被赋值为一个字符串。当我们打印出来时,data 的类型在运行时才被确定,这就是 dynamic 的力量。

区别一览

  1. 类型检查时机
  • var:在编译时确定类型。
  • dynamic:在运行时确定类型。
  1. 类型安全
  • var:编译器会在编译阶段进行类型检查,保证类型安全。

  • dynamic:没有类型安全保障,如果你试图调用一个不存在的方法,代码会在运行时抛出异常。


  1. 使用场景


  • var:更适合于简化代码、提高可读性,特别是在处理复杂的数据结构时。

  • dynamic:适用于需要与动态内容(如 COM 对象、动态语言和 JSON 等)交互的场景。

实战演练

让我们通过2个实际例子来看看如何在实际项目中使用这两种类型。

使用 var 简化 LINQ 查询

var numbers = new[] { 1, 2, 3, 4, 5 };
var sum = numbers.Sum();

使用 dynamic 处理 JSON 数据

string jsonData = "{\"Name\":\"Bob\",\"Age\":25}";
dynamic jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonData);
Console.WriteLine($"{jsonObject.Name} is {jsonObject.Age} years old.");

这里我们不知道 JSON 中包含哪些属性,所以用 dynamic 是很方便的选择

总结

总而言之,var 保持了类型安全,而 dynamic 让你在需要与动态内容交互的时候无需担心类型问题。

它们在 C# 中各有千秋,理解它们的特性与用法能让代码更灵活、更易于维护。

举报

相关推荐

0 条评论