我应该如何在VB.NET中进行投射?
这些都是平等的吗?在什么情况下我应该互相选择?
- var.ToString()
- CStr(无功)
- CType(变量,字符串)
- DirectCast(变量,字符串)
编辑:来自非我自己的建议
- TryCast(var,String)
解决方案
回答
我更喜欢以下语法:
Dim number As Integer = 1 Dim str As String = String.TryCast(number) If str IsNot Nothing Then
可以告诉我,我通常使用C#编写代码。 8)
我更喜欢TryCast的原因是我们不必担心强制转换异常的开销。强制转换成功或者变量被初始化为null,然后我们将对其进行相应的处理。
回答
这些都略有不同,并且通常具有可接受的用法。
- var.ToString``()将为我们提供对象的字符串表示形式,无论它是什么类型。如果
var
还不是一个字符串,则使用它。 - CStr``(var)
是VB字符串强制转换运算符。我不是VB人士,所以我建议避免使用它,但这并不会真正伤害任何人。我认为它基本上与
CType`相同。 - CType((var,String))将使用提供的任何转换运算符将给定类型转换为字符串。
- DirectCast((var,String))用于将对象上载为字符串。如果我们知道对象变量实际上是一个字符串,请使用它。这与C#中的(string)var相同。
- TryCast(如@NotMyself所述)类似于DirectCast,但如果变量不能转换为字符串而不是抛出异常,它将返回Nothing。这与C#中的" var as string"相同。 MSDN上的" TryCast"页面也有很好的比较。
回答
MSDN似乎表明,针对特定类型的Cxxx强制转换可以提高VB .NET的性能,因为它们已转换为嵌入式代码。由于某些原因,它还建议在某些情况下使用DirectCast而不是CType(文档指出存在继承关系;我认为这意味着在编译时检查了强制转换的完整性,可以应用优化,而CType始终使用VB运行时。)
当我编写VB .NET代码时,我所使用的取决于我在做什么。如果我要扔掉的是原型代码,则使用碰巧输入的任何内容。如果我是认真的代码,我尝试使用Cxxx强制转换。如果不存在,如果我有合理的理由相信存在继承关系,则可以使用DirectCast。如果在这种情况下我不知道强制转换是否成功(例如,用户输入->整数),那么我使用TryCast来做比向用户抛出异常更友好的操作。
我无法撼动的一件事是,我倾向于使用ToString而不是CStr,但据推测Cstr更快。
回答
一次,我记得看到MSDN库状态要使用CStr(),因为它更快。我不知道这是否是真的。
回答
用户Konrad Rudolph在堆栈溢出问题" VB.NET的隐藏功能"中主张DirectCast()。
回答
Cstr()被内联编译以获得更好的性能。
如果定义了转换运算符,CType
允许在类型之间进行转换
ToString()
如果无法进行转换,则在基本类型和字符串之间引发异常。
从字符串到基类的tryParse()可能返回false
如果类型通过继承关系关联或者共享公共接口,则使用DirectCast;如果无法进行强制类型转换,则将抛出异常;在这种情况下,trycast将不返回任何内容