动态vs对象类型

时间:2010-08-09 18:08:33

标签: c# object dynamic types

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

4 个答案:

答案 0 :(得分:36)

他们非常不同。

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

然而,无论如何,你对object类型无能为力 - 它几乎没有任何成员。你在哪里发现自己使用它?当您想编写可以使用各种类型的通用代码时,通常应该考虑泛型而不是object

答案 1 :(得分:5)

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

对象

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

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

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

        谢谢!

答案 2 :(得分:1)

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

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();
}

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

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

答案 3 :(得分:0)

有一篇文章介绍了不同的类型,包括对象和动态类型。本文还通过一个很好的示例解释了两者之间的区别。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/reference-types

我将简要介绍一下文章中解释的区别:

  • 对象类型是.NET中System.Object的别名。在C#统一类型系统中,所有类型(预定义和用户定义的类型,引用类型和值类型)都直接或间接继承自System.Object。您可以将任何类型的值分配给类型为object的变量。

  • 动态类型指示对变量的使用以及对其成员的引用会绕过编译时类型检查。而是,这些操作在运行时解决。动态类型简化了对COM API(例如Office Automation API),动态API(例如IronPython库)和HTML文档对象模型(DOM)的访问。

  • 在大多数情况下,动态类型的行为类似于类型对象。特别是,任何非null表达式都可以转换为动态类型。动态类型与对象的不同之处在于,包含动态类型的表达式的操作不会被编译器解析或检查。编译器将有关该操作的信息打包在一起,然后将该信息稍后用于在运行时评估该操作。在此过程中,动态类型的变量将被编译为对象类型的变量。因此,动态类型仅在编译时存在,而在运行时不存在。

摘要

从本质上讲,这意味着对象是一种类型,所有其他类型均从其继承。 动态不是真正的类型,它更像是指针或其他类型的表示,将在运行时解析。