我应该如何在VB.NET中进行投射?


151

这些都是平等的吗?在什么情况下我应该互相选择?

  • var.ToString()

  • CStr(无功)

  • CType(变量,字符串)

  • DirectCast(变量,字符串)


编辑:来自非我自己的建议…

  • TryCast(var,String)

Answers:


156

这些都略有不同,并且通常具有可接受的用法。

  • var.ToString()不管对象是什么类型,它都会为您提供对象的字符串表示形式。如果var还不是字符串,请使用它。
  • CStr(var)是VB字符串强制转换运算符。我不是VB人士,所以我建议避免使用它,但这并不会真正伤害任何人。我认为基本上与相同CType
  • CType(var, String) 会使用任何提供的转换运算符将给定类型转换为字符串。
  • DirectCast(var, String)用于将对象上载为字符串。如果您知道对象变量实际上是一个字符串,请使用它。这与(string)varC#中的相同。
  • TryCast(如@ NotMyself所提到的)就像DirectCast,但是Nothing如果不能将变量转换为字符串而不是抛出异常,它将返回。这与var as stringC#中的相同。TryCastMSDN上的页面也具有很好的比较。

15
从来没有理由使用CType(var,String)而不是CStr(var),它们做的完全相同。
乔纳森·艾伦

2
@Maslow TryCast仅适用于值类型,因为它必须是可以Nothing作为值的类型
bdukes

1
@Martinho完全正确。那应该说“仅适用于引用类型”
bdukes,2010年

3
CStr(var)如果var为DBNull.Value,将阻塞并引发异常,但替代项Convert.ToString(var)将返回空字符串。
MCattle

Dim myList AS ArrayList=new ArrayList当您写(From e In myList select CType(e.Name,String)).ToArray()它不起作用。我来写书... select CType(e.Name.ToString,String)).ToArray(),得到了微笑。
Bellash

13

Cstr() 被内联编译以获得更好的性能。

CType 如果定义了转换运算符,则允许在类型之间进行强制转换

ToString() 如果无法进行转换,则在基本类型和字符串之间引发异常。

TryParse()从字符串到基数,typeif否则返回false

DirectCast如果类型通过继承相关或共享公共接口,则使用该类型,如果无法进行强制转换,则将引发异常,trycast在此实例中将不返回任何内容


8

MSDN似乎表明,针对特定类型的Cxxx强制转换可以提高VB .NET的性能,因为它们已转换为嵌入式代码。由于某种原因,它还建议在某些情况下使用DirectCast而不是CType(文档指出存在继承关系;我认为这意味着在编译时检查了强制转换的完整性,可以应用优化,而CType始终使用VB运行时。)

当我编写VB .NET代码时,我所使用的取决于我在做什么。如果我要扔掉的是原型代码,请使用碰巧输入的任何内容。如果我是认真的代码,我会尝试使用Cxxx类型转换。如果不存在,如果我有合理的理由相信存在继承关系,则可以使用DirectCast。如果在这种情况下我不知道强制转换是否成功(例如,用户输入->整数),那么我使用TryCast来做比向用户抛出异常更友好的操作。

我不能动摇的一件事是,我倾向于使用ToString而不是CStr,但据推测Cstr更快。


8

我更喜欢以下语法:

Dim number As Integer = 1
Dim str As String = String.TryCast(number)

If str IsNot Nothing Then

可以告诉我,我通常使用C#编写代码。8)

我更喜欢TryCast的原因是您不必担心强制转换异常的开销。您的强制转换成功或变量被初始化为null,然后进行相应处理。


2
我认为你错了。完全不使用TryCast并不是一个好主意。在像您这样的情况下,应使用number.ToString()或CStr(number)。
Shimmy Weitzhandler,2010年

4
@Shimmy:根本不使用TryCast的原因是什么?DirectCast在某些情况下避免异常会更好吗?
Dienekes 2011年

3
@Dienekes和NotMyself。TryCast仅适用于REFERENCE类型。在这里,我们有一个整数,它是一个VALUE类型。编译器将拒绝TryCast。另外,目标是字符串。除Nothing支持之外的任何.Net实体.ToString()。值类型(例如Integer)不能为Nothing。因此,在这种情况下,CStr(number)或number.ToString()都是安全的。在一般情况下(不仅是值类型),CStr(whatever)是安全的,因为它可以处理Nothing,结果将是String变量中的Nothing。TryCast非常有用-只是不在这里。
制造商史蒂夫(Steve)2014年

4

-1是因为DirectCast显然不适合在这里使用,除非在非常有限的情况下(您不必理会)。当您知道自己有两种“相关引用类型”,并且希望在它们之间进行有效的转换时,DirectCast很好。由于问题是关于获取a的问题String,OP不太可能讨论DirectCast适用的情况。
制造商史蒂夫(Steve)2014年

...如果未提及String和的问题ToString,我的投诉将不适用。您不应该主张DirectCast,除非您从常规CONVERSION缩小了主题范围。
制造商史蒂夫(Steve)2014年

1

根据认证考试,您应尽可能使用Convert.ToXXX()进行简单转换,因为它比CXXX转换更好地优化了性能。


1
仅供参考,根据Microsoft的Paul Vick的说法,至少在2004年,Cxxx运算符比Convert.Toxxx函数要快,因为Cxxx直接编译为IL,而不是调用函数。尽管他的理由似乎令人怀疑,但考虑到JIT能够优化离开函数调用的能力。panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve

0

一次,我记得看到MSDN库状态要使用CStr(),因为它更快。我不知道这是否是真的。


2
DirectCast比CStr快,但是您只能在将字符串对象转换为字符串变量时使用它。如果您尝试将任何其他对象转换为字符串,它将失败。
乔纳森·艾伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.