Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态与对象类型_C#_Object_Dynamic_Types - Fatal编程技术网

C# 动态与对象类型

C# 动态与对象类型,c#,object,dynamic,types,C#,Object,Dynamic,Types,我交替使用了动态和对象类型。这两种类型之间有什么区别吗?使用其中一种方法是否会影响性能?哪一个更灵活?它们有很大的不同 如果您使用dynamic,那么您将选择动态类型,从而在大部分情况下选择不进行编译时检查。是的,它的性能不如使用静态类型,因为您可以使用静态类型 然而,无论如何,您不能对对象类型做太多工作-它几乎没有任何成员。你发现自己在哪里使用它?当你想编写通用代码,可以使用各种类型时,你应该考虑泛型而不是对象< /C> > 。随着C语言的进步,我们看到,即使 var >强>类型也可以与动态

我交替使用了动态和对象类型。这两种类型之间有什么区别吗?使用其中一种方法是否会影响性能?哪一个更灵活?

它们有很大的不同

如果您使用
dynamic
,那么您将选择动态类型,从而在大部分情况下选择不进行编译时检查。是的,它的性能不如使用静态类型,因为您可以使用静态类型

然而,无论如何,您不能对
对象
类型做太多工作-它几乎没有任何成员。你发现自己在哪里使用它?当你想编写通用代码,可以使用各种类型时,你应该考虑泛型而不是<代码>对象< /C> > 

。随着C语言的进步,我们看到,即使<强> var >强>类型也可以与<强>动态< /强>和<强>对象< /强>类型相媲美。以下是我通过比较这7点了解到的所有3种类型:

对象

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

  • Var是用C#3.0引入的
  • 它可以存储任何类型的值,但必须在声明时初始化变量类型
  • 它是类型安全的,即编译器拥有有关存储值的所有信息,因此在运行时不会引起任何问题
  • 变量类型不能作为方法参数传递,方法不能返回对象类型。Var类型在定义它的范围内工作
  • 不需要强制转换,因为编译器拥有执行操作的所有信息
  • 不会导致问题,因为编译器拥有有关存储值的所有信息
  • 当我们不知道实际类型(即类型为匿名)时,此功能非常有用 动态

  • 动态是用C#4.0引入的
  • 它可以存储任何类型的变量,类似于旧的VB语言变量
  • 它不是类型安全的,即编译器没有关于变量类型的任何信息
  • 动态类型可以作为方法参数传递,方法也可以返回动态类型
  • 不需要强制转换,但您需要知道与存储类型相关的属性和方法
  • 如果访问了错误的属性或方法,则会导致问题,因为有关存储值的所有信息仅在运行时获得解析
  • 当我们需要使用反射或动态语言或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();
    }
    

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

    我将简要介绍文章中解释的差异:

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

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

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

    摘要

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

    如果Luke只是调用了
    System.Object
    中可用的少数方法,它们也会被动态调用吗?@Steven:是的,它会-即使对于非虚拟的
    GetType
    !(例如,您可以设置一个委托,使其对
    ExpandoObject
    上的
    GetType
    调用做出反应。这就是我所害怕的。看起来我们需要通过向上转换到
    对象来“装箱”一个
    动态的
    ,如果我们想知道它的类型的真相的话。:-)@史蒂文:那不可能是真正的拳击。它可能涉及转换的动态尝试,但动态变量的基础字段(或局部变量)类型已经是
    对象