动态与对象类型
答
他们巨大不同。
如果你使用dynamic
,你选择动态类型,因此大部分选择编译时检查。是的,它比使用静态类型的性能更差,您可以在其中使用静态类型。
但是,无论如何,你无法对object
类型做太多 - 它几乎没有任何成员。你在哪里发现自己在使用它?当你想编写可以处理多种类型的通用代码时,你通常应该考虑泛型而不是object
。
答
随着C#语言的进步,我们看到,即使VAR型媲美动态和对象类型。这里是所有3种类型,因为我通过比较这7点了解到:
对象
- 对象是使用C#1.0引入的。
- 它可以存储任何类型的值,因为对象是.NET框架中所有类型的基类。
- 编译器几乎没有关于类型的信息。
- 对象类型可以作为方法参数传递,方法也可以返回对象类型。
- 需要将对象变量转换为原始类型才能使用它并执行所需的操作。
- 如果存储值未转换为基础数据类型,则在运行时导致问题。
- 当我们没有关于数据类型的更多信息时很有用。
瓦尔
- 瓦尔用C#3.0
- 它可以存储任何类型的值引入但它是强制性在声明的时间进行初始化变种类型。
- 它是类型安全的,即编译器具有有关存储值的所有信息,因此它在运行时不会引起任何问题。
- Var类型不能作为方法参数传递,方法不能返回对象类型。 Var类型在它定义的范围内工作。
- 无需转换,因为编译器具有执行操作的所有信息。
- 不会导致问题,因为编译器具有有关存储值的所有信息。
- 当我们不知道实际的类型,即类型是匿名时有用。
动态
- 动态与C#4.0
- 它可以存储任何类型的变量,类似于旧的VB语言变量的引入。
- 它不是类型安全的,即编译器没有关于变量类型的任何信息。
- 动态类型可以作为方法参数传递,方法也可以返回动态类型。
- 不需要投射,但您需要知道与存储类型相关的属性和方法。
- 如果访问错误的属性或方法会导致问题,因为有关存储值的所有信息都只能在运行时解析。
- 当我们需要使用反射或动态语言或COM对象进行编码时很有用,因为您需要编写更少的代码。
希望这可以帮助某人。
谢谢!
+1
这是我的理解,var不是一个类型 - 它只是基于初始化值隐式地决定类型。例如:var x = 2; x不是一个var类型,它是一个int类型。 – Nanomurf 2017-09-26 20:05:37
答
在简单的语言:
假设网络有以下方法:
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);
Console.ReadKey();
}
动态 :下面的代码编译成功,但如果它包含除string
之外的值,则会引发运行时错误或
public static void Main(string[] args)
{
dynamic dyn = "String Sample";
ConsoleWrite(dyn);
dyn = 1;
ConsoleWrite(dyn);// Runtime Error
Console.ReadKey();
}
如果Luke只是调用'System.Object'中的一小部分方法,它们是否也会被动态调用? – 2010-08-09 18:18:47
@Steven:是的,即使对于非虚拟的GetType也是如此! (例如,你可以设置一个委托来响应'ExpandOObject'上的'GetType'调用。可怕的东西。) – 2010-08-09 18:29:26
这就是我所害怕的。看起来如果我们想知道关于它的类型的真相,我们需要通过上传到“对象”来“框住”一个“动态”。 :-) – 2010-08-09 18:31:19