Casting DataTypes with DirectCast, CType, TryCast

后端 未结 4 1968
半阙折子戏
半阙折子戏 2020-12-01 05:22

Ever since I moved from VB6 to VB.NET somewhere in 2005, I\'ve been using CType to do casting from one data type to another. I do this because it is simply faster to type, u

4条回答
  •  萌比男神i
    2020-12-01 05:46

    TryCast and DirectCast are casting operators that directly map to the CLR's support for casting. They can quickly cast an object of a base type to a derived type or unbox a value of a value type. DirectCast throws an exception when the cast isn't possible, TryCast returns Nothing if it failed. You typically want to favor DirectCast to catch programming mistakes.

    CType allows a superset of conversions, ones that the CLR frowns on. The best example I can think of is converting a string to a number or date. For example:

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

    Which you'll have to use if Option Strict On is in effect. If it is Off then you can do it directly:

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

    Very convenient of course and part of VB.NET's legacy as a dynamically typed language. But not without problems, that date is Unicorn day at stackoverflow.com but will be a day in January when a Briton enters the string. Unexpected conversions is the reason the CLR doesn't permit these directly. The explicit, never a surprise conversion looks like this:

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

    Whether you should buy into Try/DirectCast vs CType vs explicit conversions is rather a personal choice. If you now program with Option Strict On then you should definitely start using Try/DirectCast. If you favor the VB.NET language because you like the convenience of dynamic typing then don't hesitate to stay on CType.

提交回复
热议问题