动态vs对象类型

Luk*_*101 24 c# types dynamic object

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

Jon*_*eet 36

他们是巨大的不同.

如果你使用的dynamic是选择动态类型,那么大多数时候选择退出编译时检查.是的,这比使用静态类型较少的高性能,您可以使用静态类型.

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

  • @Steven:是的,确实如此 - 即使对于非虚拟的"GetType"!(例如,您可以设置一个委托来响应`ExpandTypeObject`上的`GetType`调用.可怕的东西.) (2认同)

Moh*_*yan 7

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

public static void ConsoleWrite(string inputArg)
{
    Console.WriteLine(inputArg);
}
Run Code Online (Sandbox Code Playgroud)

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

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

动态:下面的代码编译成功,但如果它包含一个值,除了string它会抛出运行时错误

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

  • 对于动态,它也不会像您在上一个示例中提到的那样抛出错误。它将编译并返回与对象类型相同的结果。检查这里:https://dotnetfiddle.net/l5K4Cl (2认同)

小智 5

随着C#语言的发展,我们已经看到,即使var类型也可以与动态对象类型媲美。通过比较这7点,我了解了以下所有3种类型:

宾语

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

Var

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

动态

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

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

谢谢!

  • 据我了解,var根本不是类型-它只是根据初始化的值隐式地确定类型。例如:var x = 2; x不是var类型,而是int类型。 (3认同)
  • 那么动态不会使 C# 类型不安全吗? (2认同)