动态vs对象类型

我可以互换地使用动态和对象类型。 这两种类型有什么区别吗? 使用一个比另一个有任何性能影响吗? 哪一个更灵活?

他们是完全不同的。

如果使用dynamic ,则选择动态类型,从而选择退出编译时检查。 是的,它比使用静态类型更不具备性能,您可以使用静态类型。

但是,无论如何,你无法对object类型做太多的事情 – 它几乎没有任何成员。 你在哪里发现自己使用它? 当您想编写可以使用各种类型的通用代码时,通常应该考虑generics而不是object

随着C#语言的进步,我们发现即使var类型也与动态类型和对象类型相当。 以下是通过比较这7点我学到的所有3种类型:

宾语

  1. 对象是用C#1.0引入的。
  2. 它可以存储任何类型的值,因为object是.NET框架中所有类型的基类。
  3. 编译器几乎没有关于类型的信息。
  4. 对象类型可以作为方法参数传递,方法也可以返回对象类型。
  5. 需要将对象变量转换为原始类型以使用它并执行所需的操作。
  6. 如果存储的值未转换为基础数据类型,则在运行时导致问题。
  7. 当我们没有关于数据类型的更多信息时很有用。

瓦尔

  1. Var引入了C#3.0
  2. 它可以存储任何类型的值,但必须在声明时初始化var类型。
  3. 它是类型安全的,即编译器具有有关存储值的所有信息,因此它不会在运行时导致任何问题。
  4. Var类型不能作为方法参数传递,并且方法不能返回对象类型。 Var类型在定义它的范围内工作。
  5. 无需强制转换,因为编译器具有执行操作的所有信息。
  6. 不会导致问题,因为编译器具有关于存储值的所有信息。
  7. 当我们不知道实际类型时有用,即类型是匿名的。

动态

  1. Dynamic引入了C#4.0
  2. 它可以存储任何类型的变量,类似于旧的VB语言变量。
  3. 它不是类型安全的,即编译器没有关于变量类型的任何信息。
  4. 动态类型可以作为方法参数传递,方法也可以返回动态类型。
  5. 不需要强制转换,但您需要知道与存储类型相关的属性和方法。
  6. 如果访问了错误的属性或方法,则会导致问题,因为有关存储值的所有信息仅在运行时获得解析。
  7. 当我们需要使用reflection或动态语言或COM对象进行编码时很有用,因为您需要编写更少的代码。

希望这会对某人有所帮助。

谢谢!

用简单的语言:
假设我们有以下方法:

 public static void ConsoleWrite(string inputArg) { Console.WriteLine(inputArg); } 

对象 :以下代码具有编译错误,除非将对象强制转换为字符串:

 public static void Main(string[] args) { object obj = "String Sample"; ConsoleWrite(obj);// compile error ConsoleWrite((string)obj); // correct Console.ReadKey(); } 

dynamic :以下代码成功编译,但如果它包含除string以外的值,则会抛出运行时错误

 public static void Main(string[] args) { dynamic dyn = "String Sample"; ConsoleWrite(dyn); // correct dyn = 1; ConsoleWrite(dyn);// Runtime Error Console.ReadKey(); }