C# 中 object 、var 和 dynamic 的区别

object

object 类是所有类的基类;换句话说,所有派生类都是继承 object 。我们可以将任何类型的值赋给 object 类型变量(将值类型转换为 object 时称为“装箱”,将 object 类型转换为任何其他值类型时称为“拆箱”)。

object a = 10;
object str = "hello world!";
object c = a;

a = a - 5; // 编译错误 object 和 int 之间不能进行运算符 '-' 操作

object k = "hello";
k = 10; // 这个赋值是 ok 

void Display(object arg) { }  //ok

var

var 关键字是在 C# 3.0 中引入的。它是隐式类型,变量的类型由编译器在编译时决定。var 在方法范围级别内可以声明,var 声明的变量可以存储任何值,但必须初始化值。因此,它属于强类型变量。

var x = 20; // 等同于 int x = 20;
x = "text"; // 编译错误 无法字符串类型转换为 int 类型

var xs = new List<int>();
var fruits = new string[] { "菜果", "香蕉", "葡萄", "西瓜" };

void Display(var arg) { } // 编译错误 var 只能出现在局部变量中

 var 关键字在以下情况下非常有用:

  1. 假如有一个长类名,它会使代码可读变得很糟糕。使用 var 会变得很简洁。

  2. 使用 LINQ 和匿名类型时,避免创建新类的工作量,从而减少代码。

dynamic

C# 4.0 引入的特性。dynamic 会绕过编译时类型检查。而是在运行时会对其进行解析和类型检查。在编译时,dynamic 会被转换为 object ,这会受装箱和拆箱的影响,因此程序的性能也会受到影响。

dynamic y = 10;

dynamic k = "hello C#";
dynamic p = k;

dynamic z = 20;
z = "哟,C#"; // 这个赋值是 ok
z = z - 10; // 编译时不会报错,运行时会报 string 和 int 之间不能进行运算符 '-' 操作

void Display(dynamic arg) { }

总结

  1. object 、var 、dynamic 都可以存储任何类型的值;object 、 dynamce 可以不初始化,var 必须初始化。

  2. object 、dynamic 在编译时没有变量的类型,但 dynamic 类型是不安全的,因为在编译时不会进行类型检查 。而 var 在编译时变量类型是确定,在运行时不会引起任何问题,即类型是安全的。

  3. object 、dynamic 可以作为方法的参数传递,也可以作为方法的返回类型;var 不行,只能作为局部变量使用。

  4. object 需要将变量转换为原始类型才能执行所需的操作;var 可以不用转换;dynamic 强制转换不是必需的。

  5. object 运行时没有转换成原始类型会报错;var 不会导致出错;dynamic 访问错误的属性或方法时,则会出错。

  6. object 不需要知道具体数据类型时使用;var 在不知道实际类型下使用,即类型是匿名;dynamic 在反射、动态语言或使用 COM 对象进行编码时很有用。

最后,祝大家学习愉快!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值