【问题标题】:How should I cast in VB.NET?我应该如何在 VB.NET 中进行转换?
【发布时间】:2010-09-07 15:11:44
【问题描述】:

所有这些都是平等的吗?在什么情况下我应该选择每个而不是其他?

  • var.ToString()

  • CStr(var)

  • CType(var, String)

  • DirectCast(var, String)


编辑:来自NotMyself的建议……

  • TryCast(var, String)

【问题讨论】:

    标签: .net vb.net casting


    【解决方案1】:

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

    • 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),它们做的事情完全一样。
    • @Maslow TryCast 仅适用于值类型,因为它必须是可以将 Nothing 作为值的类型
    • @Martinho 非常正确。那应该说“仅适用于 reference 类型”
    • 如果 var 为 DBNull.Value,CStr(var) 将阻塞并引发异常,但备用 Convert.ToString(var) 将返回一个空字符串。
    • Dim myList AS ArrayList=new ArrayList 当你写 (From e In myList select CType(e.Name,String)).ToArray() 它不起作用。我来写... select CType(e.Name.ToString,String)).ToArray(),我找回了我的笑容。
    【解决方案2】:

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

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

    ToString()在基类型和字符串之间如果不能转换会抛出异常。

    TryParse() 从 String 到 base typeif 可能,否则返回 false

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        我更喜欢以下语法:

        Dim number As Integer = 1
        Dim str As String = String.TryCast(number)
        
        If str IsNot Nothing Then
        

        你可以看出我通常用 C# 编写代码。 8)

        我更喜欢 TryCast 的原因是您不必处理强制转换异常的开销。您的演员要么成功,要么您的变量被初始化为 null 并且您相应地处理它。

        【讨论】:

        • 我认为你错了。使用 TryCast 根本不是一个好主意。在像你这样的情况下,应该使用 number.ToString() 或 CStr(number)。
        • @Shimmy:根本不使用 TryCast 的原因是什么? DirectCast 在某些情况下避免异常不是更好吗?
        • @Dienekes 和 NotMyself。 TryCast 仅适用于 REFERENCE 类型。在这里,我们有一个 Integer,它是一个 VALUE 类型。编译器将拒绝 TryCast。此外,目标是一个字符串。除了 Nothing 之外的任何 .Net 实体都支持 .ToString()。值类型(例如 Integer)不能是 Nothing。所以在这种情况下,CStr(number) 或 number.ToString() 都是安全的。在一般情况下(不仅仅是值类型),CStr(whatever) 是安全的,因为它可以处理 Nothing——结果将是 Nothing,在 String 变量中。 TryCast 非常有用——只是不在这里。
        【解决方案5】:

        【讨论】:

        • -1 因为 DirectCast 在这里明显不合适,除非在非常有限的情况下,您没有费心提及。当你知道你有两个相关的引用类型,并且想要在它们之间进行有效的转换时,DirectCast 是很好的。由于问题是关于获得String,因此 OP 不太可能在讨论适合 DirectCast 的情况。
        • ... 如果问题没有提到StringToString,我的投诉将不适用。在您将主题范围从一般 CONVERSION 缩小之前,您不应该提倡 DirectCast。
        【解决方案6】:

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

        【讨论】:

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

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

        【讨论】:

        • DirectCast 比 CStr 快,但只能在将字符串对象转换为字符串变量时使用。如果您尝试将任何其他对象转换为字符串,它将失败。
        猜你喜欢
        • 2011-10-30
        • 1970-01-01
        • 2011-01-27
        • 2018-12-02
        • 1970-01-01
        • 2015-05-04
        • 2020-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多