动态vs对象类型
我可以互换地使用动态和对象类型。 这两种类型有什么区别吗? 使用一个比另一个有任何性能影响吗? 哪一个更灵活?
他们是完全不同的。
如果使用dynamic
,则选择动态类型,从而选择退出编译时检查。 是的,它比使用静态类型更不具备性能,您可以使用静态类型。
但是,无论如何,你无法对object
类型做太多的事情 – 它几乎没有任何成员。 你在哪里发现自己使用它? 当您想编写可以使用各种类型的通用代码时,通常应该考虑generics而不是object
。
随着C#语言的进步,我们发现即使var类型也与动态类型和对象类型相当。 以下是通过比较这7点我学到的所有3种类型:
宾语
- 对象是用C#1.0引入的。
- 它可以存储任何类型的值,因为object是.NET框架中所有类型的基类。
- 编译器几乎没有关于类型的信息。
- 对象类型可以作为方法参数传递,方法也可以返回对象类型。
- 需要将对象变量转换为原始类型以使用它并执行所需的操作。
- 如果存储的值未转换为基础数据类型,则在运行时导致问题。
- 当我们没有关于数据类型的更多信息时很有用。
瓦尔
- Var引入了C#3.0
- 它可以存储任何类型的值,但必须在声明时初始化var类型。
- 它是类型安全的,即编译器具有有关存储值的所有信息,因此它不会在运行时导致任何问题。
- Var类型不能作为方法参数传递,并且方法不能返回对象类型。 Var类型在定义它的范围内工作。
- 无需强制转换,因为编译器具有执行操作的所有信息。
- 不会导致问题,因为编译器具有关于存储值的所有信息。
- 当我们不知道实际类型时有用,即类型是匿名的。
动态
- Dynamic引入了C#4.0
- 它可以存储任何类型的变量,类似于旧的VB语言变量。
- 它不是类型安全的,即编译器没有关于变量类型的任何信息。
- 动态类型可以作为方法参数传递,方法也可以返回动态类型。
- 不需要强制转换,但您需要知道与存储类型相关的属性和方法。
- 如果访问了错误的属性或方法,则会导致问题,因为有关存储值的所有信息仅在运行时获得解析。
- 当我们需要使用reflection或动态语言或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(); }
- 让asp.net在会话中存储视图状态而不是增加html
- WPF样式中的DataTrigger绑定
- 自定义HtmlEncode与HTML实体名称,是否可能?
- 如何在反序列化JSON时将ObjectCreationHandling.Replace应用于所选属性?
- ListView C#(.Net 3.5)中的替代颜色?
- 在Windows Phone中保留AnList LongListSelectorItem前景
- 使用SignalR Hubs,连接会在一段时间后丢失 – 为什么?
- 当两个类具有相同名称但名称空间不同时,NHibernate DuplicateMappingException
- 在尝试解析列以进行不等式比较时,LINQ to Entities无法识别方法’Int32 Parse(System.String)’方法