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 关键字在以下情况下非常有用:
-
假如有一个长类名,它会使代码可读变得很糟糕。使用 var 会变得很简洁。
-
使用 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) { }
总结
-
object 、var 、dynamic 都可以存储任何类型的值;object 、 dynamce 可以不初始化,var 必须初始化。
-
object 、dynamic 在编译时没有变量的类型,但 dynamic 类型是不安全的,因为在编译时不会进行类型检查 。而 var 在编译时变量类型是确定,在运行时不会引起任何问题,即类型是安全的。
-
object 、dynamic 可以作为方法的参数传递,也可以作为方法的返回类型;var 不行,只能作为局部变量使用。
-
object 需要将变量转换为原始类型才能执行所需的操作;var 可以不用转换;dynamic 强制转换不是必需的。
-
object 运行时没有转换成原始类型会报错;var 不会导致出错;dynamic 访问错误的属性或方法时,则会出错。
-
object 不需要知道具体数据类型时使用;var 在不知道实际类型下使用,即类型是匿名;dynamic 在反射、动态语言或使用 COM 对象进行编码时很有用。
最后,祝大家学习愉快!