我该如何在VB.NET中进行类型转换?

162

这些是否都相等?在什么情况下我应该选择其中的每一个?

  • var.ToString()

  • CStr(var)

  • CType(var, String)

  • DirectCast(var, String)


编辑:来自NotMyself的建议...

  • TryCast(var, String)(尝试将变量转换为字符串)
7个回答

173

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

  • 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 页面也有很好的对比说明。

  • 16
    永远没有理由使用CType(var, String)而不是CStr(var),它们的作用完全相同。 - Jonathan Allen
    2
    @Maslow TryCast 只适用于值类型,因为它需要是一个可以将 Nothing 作为值的类型。 - bdukes
    2
    @Martinho 完全正确。那应该说“仅适用于_引用_类型”。 - bdukes
    3
    如果var是DBNull.Value,CStr(var)会出错并引发异常,但备选方法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
    显示剩余2条评论

    14

    Cstr() 为了更好的性能而进行内联编译。

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

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

    TryParse() 将字符串转换为基本类型,如果不可能则返回 false。

    DirectCast 用于继承或共享公共接口的相关类型,如果转换不可能,则会抛出异常;在这种情况下,trycast 不会返回任何内容。


    9

    MSDN似乎表明,VB .NET中特定类型的Cxxx转换可以提高性能,因为它们被转换成内嵌代码。出于某些原因,它还建议在某些情况下使用DirectCast而不是CType(文档指出这是在存在继承关系时;我认为这意味着转换的合理性在编译时进行检查,并且可以应用优化,而CType始终使用VB运行时)。

    当我编写VB .NET代码时,我所使用的取决于我正在做什么。如果是我要丢弃的原型代码,我会使用任何我打出来的东西。如果是我认真对待的代码,我会尽量使用Cxxx转换。如果没有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
    4
    不使用TryCast的原因是什么?直接使用DirectCast难道不是更好,可以避免在某些情况下抛出异常吗? - Dienekes
    3
    @Dienekes 和 NotMyself。TryCast 只适用于引用类型。在这里,我们有一个整数,它是一个值类型。编译器将拒绝 TryCast。同时,目标是一个字符串,除了 Nothing 以外的任何 .Net 实体都支持 .ToString() 方法。值类型(例如 Integer)不能为 Nothing。因此,在这种情况下,CStr(number) 或 number.ToString() 都是安全的。在一般情况下(不仅限于值类型),CStr(whatever) 是安全的,因为它可以处理 Nothing -- 结果将为 Nothing,在字符串变量中。TryCast 很有用 -- 只是在这里不适用。 - ToolmakerSteve

    4

    -1 是因为 DirectCast 在这里明显不合适,除非在非常有限的情况下,你没有提到。当你知道你有两个相关的引用类型,并且想要在它们之间进行高效的转换时,DirectCast 是很好的选择。由于问题是关于获取一个 String,所以 OP 讨论 DirectCast 适用的情况的可能性不大。 - ToolmakerSteve
    如果问题没有提到“String”和“ToString”,我的抱怨就不适用了。在从一般的转换中缩小主题之前,您不应该倡导使用DirectCast。 - ToolmakerSteve

    1
    根据认证考试,对于简单的转换应尽可能使用Convert.ToXXX(),因为它比CXXX转换更优化性能。

    1
    据微软的保罗·维克(Paul Vick)所说,至少在2004年,Cxxx运算符比Convert.Toxxx函数更快,因为Cxxx直接编译成IL代码,而不是调用函数。尽管他的理由似乎站不住脚,因为可以通过JIT优化来消除函数调用。http://www.panopticoncentral.net/2004/05/31/the-native-net-language/ - ToolmakerSteve

    0

    曾经有一次,我记得在MSDN库中看到使用CStr()函数是因为它更快。但我不确定这是否正确。


    2
    DirectCast比CStr更快,但只能在将字符串对象转换为字符串变量时使用它。如果您尝试将任何其他对象转换为字符串,则会失败。 - Jonathan Allen

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接