私は、VB.NET を始めたばかりの経験豊富な C/C++/C# プログラマーです。私は通常、キャストに CType (および CInt、CBool、CStr) を使用します。これは、文字数が少なく、初めて触れたキャストの方法だったからですが、DirectCast と TryCast も認識しています。
簡単に言えば、DirectCast と CType の間に違い (キャストの効果、パフォーマンスなど) はありますか? TryCast の考え方がよくわかりました。
私は、VB.NET を始めたばかりの経験豊富な C/C++/C# プログラマーです。私は通常、キャストに CType (および CInt、CBool、CStr) を使用します。これは、文字数が少なく、初めて触れたキャストの方法だったからですが、DirectCast と TryCast も認識しています。
簡単に言えば、DirectCast と CType の間に違い (キャストの効果、パフォーマンスなど) はありますか? TryCast の考え方がよくわかりました。
(type)instance
最初に注意すべきことは、VB.NET には C# のキャスト メカニズムに直接類似する機能がないことです。これを取り上げるのは、2 つの VB.NET 演算子を比較する際の出発点および共通の参照として役立つからです (関数セマンティクスがありますが、これらは関数ではなく演算子です)。
DirectCast()
C# キャスト演算子よりも厳密です。キャストされているアイテムがすでにキャストしているタイプである場合にのみ、キャストできます。値の型はまだボックス化されていないと思いますが、それ以外の場合は変換を行いません。したがって、たとえば、C# キャストのようにfrom short
toにキャストすることはできません。ただし、基になるオブジェクト変数が実際に である場合は、 から配列にキャストできます。そしてもちろん、オブジェクト インスタンスの型が実際に継承ツリーのキャスト型の下のどこかにあると仮定すると、から何にでもキャストできます。int
(int)
IEnumerable
IEnumerable
Array
Object
これははるかに高速であるため、望ましい方法です。実行する必要がある変換と型チェックが少なくなります。
CType()
C# キャスト演算子ほど厳密ではありません。(int)
文字列を整数に変換するなど、単純なスタイルのキャストではできないことを実行します。がキャストのターゲット型であるConvert.To___()
C# で呼び出すのと同じくらい強力です。___
これは非常に強力なので望ましいです。ただし、この能力にはパフォーマンスが犠牲になります。DirectCast()
キャストを完了するにはかなりの作業が必要になる可能性があるため、C# のキャスト演算子ほど高速ではありません。一般的にはDirectCast()
、できるときに優先する必要があります。
最後に、キャスト演算子が 1 つありませんでした。TryCast()
これは、C# の演算子に直接類似したものas
です。
のようなものを書くことCType
ができますCtype("string",Integer)
。ただしDirectCast
、上記のステートメントを使用すると、コンパイル時にエラーが発生します。
Dim a As Integer = DirectCast("1", Integer) 'Gives compiler error
Dim b As Integer = CType("1", Integer) 'Will compile
DirectCast
よりも制限的ですCType
。
たとえば、これはエラーをスローします。
Sub Main()
Dim newint As Integer = DirectCast(3345.34, Integer)
Console.WriteLine(newint)
Console.ReadLine()
End Sub
また、Visual Studio IDE にも表示されます。
ただし、これはエラーをスローしません。
Sub Main()
Dim newint As Integer = CType(3345.34, Integer)
Console.WriteLine(newint)
Console.ReadLine()
End Sub