How should I cast in VB.NET?
所有这些都是平等的吗?在什么情况下我应该选择彼此而不是其他人?
变量ToString()
CSTR(变量)
ctype(var,字符串)
DirectCast(var,字符串)
编辑:来自notself&hellip的建议;
这些都略有不同,并且通常具有可接受的用法。
- 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页面也有很好的比较。
- 从来没有理由使用ctype(var,string)而不是cstr(var),它们做的完全相同。
- Trycast显然不适用于Enums
- @maslow TryCast只适用于值类型,因为它需要一个可以将Nothing作为值的类型。
- Trycast适用于除值类型之外的所有类型。
- @马蒂尼奥说得很对。应该说"只适用于引用类型"
- 如果var为dbnull.value,CStr(var)将阻塞并引发异常,但备用Convert.ToString(var)将返回空字符串。
- Dim myList AS ArrayList=new ArrayList当你写(From e In myList select CType(e.Name,String)).ToArray()时,它不起作用。我来写《江户记》(7),恢复了我的微笑。
- 不幸的是,vb的TryCast甚至不与nullables一起工作,而C的as则相反。例如,myObject as double?是完全合法的,如果强制转换失败,则返回空值,但TryCast(myObject, Double?)给出编译器错误。
为了获得更好的性能,内嵌编译了Cstr()。
如果定义了转换运算符,则CType允许在类型之间进行强制转换。
如果无法转换,则基类型和字符串之间的ToString()将引发异常。
TryParse()从字符串到基typeif可能,否则返回false
如果类型通过继承关系或共享一个公共接口,则使用DirectCast,如果不可能进行强制转换,则抛出异常,在这种情况下,TryCast将不返回任何内容。
我喜欢以下语法:
1 2 3 4
| Dim number As Integer = 1
Dim str As String = String.TryCast(number)
If str IsNot Nothing Then |
哈,你知道我通常用C语言写代码。8)
我更喜欢Trycast的原因是您不必处理强制转换异常的开销。强制转换成功或变量初始化为空,并相应地进行处理。
- 我认为你错了。使用Trycast一点也不好。在类似于您的情况下,应该使用number.toString()或cstr(number)。
- @希米:不使用Trycast的原因是什么?DirectCast在某些情况下避免异常不是更好吗?
- @迪内克斯和我自己。Trycast仅用于引用类型。这里,我们有一个整数,它是一个值类型。编译器将拒绝Trycast。而且,目标是一个字符串。任何.NET实体都不支持.ToString()。值类型(如integer)不能为空。所以在这种情况下,cstr(number)或number.toString()是安全的。在一般情况下(不仅仅是值类型),CSTR(随便什么)是安全的,因为它不能处理任何东西——结果将是字符串变量中的任何东西。Trycast非常有用——只是不在这里。
msdn似乎表明特定类型的cxx强制转换可以提高vb.net的性能,因为它们被转换为内联代码。出于某种原因,它还建议在某些情况下使用DirectCast,而不是Ctype(文档说明存在继承关系时使用DirectCast;我相信这意味着在编译时检查强制转换的健全性,并且可以应用优化,而Ctype始终使用VB运行时。)
当我编写vb.net代码时,我使用的内容取决于我在做什么。如果这是我要丢弃的原型代码,我将使用我所键入的任何代码。如果这是我认真考虑的代码,我会尝试使用cxx强制转换。如果一个不存在,如果我有一个合理的信念,有继承关系,我使用DirectCast。如果在这种情况下,我不知道强制转换是否应该成功(例如,用户输入->整数),那么我使用Trycast来做一些比向用户抛出异常更友好的事情。
有一件事我不能动摇,我倾向于用ToString代替CSTR,但据说CSTR更快。
用户KonradRudolph在堆栈溢出问题"vb.net的隐藏特性"中主张directcast()。
- -1因为DirectCast在这里显然是不合适的,除了在非常有限的情况下,你不必提及。当您知道您有两个相关的引用类型,并且想要在它们之间进行有效的转换时,DirectCast是很好的。由于问题是关于获得一个String,所以OP不太可能讨论一个适合directcast的情况。
- …如果问题没有提到String和ToString,我的投诉将不适用。你不应该提倡直接广播,除非你把话题从一般的转换缩小。
根据认证检查,您应该尽可能使用convert.toxx()进行简单的转换,因为它比cxx转换优化性能。
- 据微软的Paul Vick所说,仅供参考,cxx操作人员比convert.toxx函数更快,至少在2004年,因为cxx直接编译为il,而不是调用函数。尽管他的理论似乎有点可疑,但考虑到JIT优化away函数调用的能力。panopticconcentral.net/2004/05/31/the-native-net-language(panopticconcentral.net/2004/05/31/the-native-net-language)
有一次,我记得看到msdn库状态使用cstr(),因为它更快。但我不知道这是不是真的。
- DirectCast比CSTR快,但只能在将字符串对象强制转换为字符串变量时使用它。如果您试图将任何其他对象转换为字符串,它将失败。