我可以互换地使用动态和对象类型。这两种类型有什么区别吗?使用一个比另一个有任何性能影响吗?哪一个更灵活?
答案 0 :(得分:36)
他们非常不同。
如果您使用dynamic
,则选择动态类型,从而选择退出编译时检查。是的,它比使用静态类型的性能更低,你可以使用静态类型。
然而,无论如何,你对object
类型无能为力 - 它几乎没有任何成员。你在哪里发现自己使用它?当您想编写可以使用各种类型的通用代码时,通常应该考虑泛型而不是object
。
答案 1 :(得分:5)
随着C#语言的进步,我们发现即使 var 类型也与动态和对象类型相当。以下是我通过比较这7个点所学到的所有3种类型:
对象
Var
<强>动态强>
希望这会对某人有所帮助。
谢谢!
答案 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表达式都可以转换为动态类型。动态类型与对象的不同之处在于,包含动态类型的表达式的操作不会被编译器解析或检查。编译器将有关该操作的信息打包在一起,然后将该信息稍后用于在运行时评估该操作。在此过程中,动态类型的变量将被编译为对象类型的变量。因此,动态类型仅在编译时存在,而在运行时不存在。
摘要:
从本质上讲,这意味着对象是一种类型,所有其他类型均从其继承。 动态不是真正的类型,它更像是指针或其他类型的表示,将在运行时解析。