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
调用做出反应。这就是我所害怕的。看起来我们需要通过向上转换到对象来“装箱”一个动态的,
,如果我们想知道它的类型的真相的话。:-)@史蒂文:那不可能是真正的拳击。它可能涉及转换的动态尝试,但动态变量的基础字段(或局部变量)类型已经是对象