代码之家  ›  专栏  ›  技术社区  ›  Alex Essilfie

使用directcast、ctype、trycast转换数据类型

  •  39
  • Alex Essilfie  · 技术社区  · 16 年前

    自从2005年从vb6迁移到vb.net之后,我一直在使用ctype从一种数据类型转换到另一种数据类型。我这样做是因为它的打字速度很快,以前在vb6中就存在,如果它们之间没有明显的区别,我不知道为什么要使用directcast。

    我偶尔会使用trycast,因为我知道有时候casting可能会失败。但是,我无法得到ctype和directcast之间的区别。

    有人能告诉我普通英语的区别吗?两种语言(ctype和directcast)有什么区别?添加在何处使用的示例也会有所帮助。

    4 回复  |  直到 8 年前
        1
  •  52
  •   Hans Passant    11 年前

    trycast和directcast是直接映射到clr对强制转换的支持的强制转换运算符。它们可以快速将基类型的对象转换为派生类型,或取消值类型的值的绑定。当转换不可能时,directcast抛出异常,如果失败,trycast将不返回任何内容。您通常希望使用directcast来捕获编程错误。

    ctype允许转换的超集,clr不喜欢转换的超集。我能想到的最好的例子是将字符串转换为数字或日期。例如:

    Dim obj As Object
    obj = "4/1/2010"
    Dim dt As DateTime = CType(obj, DateTime)
    

    如果option strict on生效,则必须使用它。如果关闭,则可以直接执行:

    Option Strict Off
    ...
        Dim dt As DateTime = obj
    

    当然非常方便,也是vb.net作为动态类型语言的一部分。但并非没有问题,这一天是stackoverflow.com的独角兽日,但将是1月份的一天,一个英国人进入这个字符串。意外的转换是clr不直接允许这些转换的原因。明确的、从不意外的转换如下所示:

    Dim dt As DateTime = DateTime.Parse(obj.ToString(), _
        System.Globalization.CultureInfo.GetCultureInfo("en-US").DateTimeFormat)
    

    您是否应该购买try/directcast vs ctype vs显式转换,这是个人的选择。如果您现在使用option strict on进行编程,那么您肯定应该开始使用try/directcast。如果您喜欢vb.net语言,因为您喜欢动态键入的便利性,那么不要犹豫继续使用ctype。

        2
  •  15
  •   Oded    16 年前

    对于值类型(整数…等),directcast的速度是前者的两倍,但对于引用类型,则是相同的。

    有关详细信息,请参阅 this MSDN页。

        3
  •  1
  •   shahkalpesh    16 年前

    这个 page 解释得很好。

    读了它,我想当你用 DirectCast ,您确定转换将在不缩小或展开(在本例中为数字数据)的情况下工作。然而, CType 将尝试转换为它,开发人员知道缩小/扩展。

        4
  •  0
  •   Vikash Sinha    13 年前

    “转换”是指将一种数据类型转换为另一种数据类型(例如字符串转换为 整数、十进制到整数、对象到字符串等)。

    “cast”的意思是将一种类型的对象更改为另一种类型,即 根据下列规则之一与之相关。

    http://www.thedevheaven.com/2012/09/directcast-vs-ctype.html