VB.NETでキャストするにはどうすればよいですか?


151

これらはすべて同じですか?どのような状況で、他のどれよりもそれぞれを選択すべきですか

  • var.ToString()

  • CStr(var)

  • CType(var、String)

  • DirectCast(var、String)


編集:NotMyselfからの提案

  • TryCast(var、String)

回答:


156

それらはすべてわずかに異なり、一般的に許容できる使用法があります。

  • var.ToString()オブジェクトのタイプに関係なく、オブジェクトの文字列表現を提供します。varが文字列でない場合に使用します。
  • CStr(var)VB文字列キャスト演算子です。私はVBの人ではないので、避けることをお勧めしますが、実際には何も害はありません。基本的にはと同じだと思いますCType
  • CType(var, String) 提供された変換演算子を使用して、指定された型を文字列に変換します。
  • DirectCast(var, String)オブジェクトを文字列にアップキャストするために使用されます。オブジェクト変数が実際には文字列であることがわかっている場合は、これを使用します。これは(string)varC#と同じです。
  • TryCast@NotMyselfで述べたようDirectCastに)はに似Nothingていますが、変数を例外にスローするのではなく、文字列に変換できない場合に返されます。これはvar as stringC#と同じです。TryCastMSDN のページにも良い比較があります。

15
CStr(var)の代わりにCType(var、String)を使用する理由は決してありません。これらはまったく同じことを行います。
ジョナサンアレン

2
@Maslow TryCastNothing、値として使用できる型である必要があるため、値型に対してのみ機能します
bdukes

1
@Martinho正解です。それは「参照タイプに対してのみ機能する」と言う必要があります
bdukes '16

3
CStr(var)varがDBNull.Valueの場合、チョークして例外を発生させますが、代替Convert.ToString(var)は空の文字列を返します。
MCattle 2013

Dim myList AS ArrayList=new ArrayListあなたが書くとき(From e In myList select CType(e.Name,String)).ToArray()それは動作しません。書くように... select CType(e.Name.ToString,String)).ToArray()なり、笑顔を取り戻しました。
Bellash、2014年

13

Cstr() パフォーマンスを向上させるためにインラインでコンパイルされます。

CType 変換演算子が定義されている場合、型間のキャストが可能

ToString() 基本型と文字列の間では、変換が不可能な場合に例外がスローされます。

TryParse()文字列からベースへの変換がtypeif可能な場合はfalseを返します

DirectCast型が継承によって関連付けられている場合、または共通のインターフェイスを共有している場合に使用されます。キャストが不可能な場合は例外をスローし、trycastこのインスタンスでは何も返しません。


8

MSDNは、特定の型のCxxxキャストはインラインコードに変換されるため、VB .NETのパフォーマンスを向上できることを示しているようです。何らかの理由で、特定のケースではCTypeではなくDirectCastも提案れます(ドキュメントには、継承関係がある場合と記載されています。これは、キャストの健全性がコンパイル時にチェックされ、最適化を適用できることを意味しますが、CTypeは常にVBランタイム。)

VB .NETコードを記述しているとき、何を使用するかは、何をしているのかによって異なります。もしそれが私が捨てようとしているプロトタイプのコードであるなら、私はタイプすることを起こしたものなら何でも使用します。それが私が真剣に考えているコードであるなら、私はCxxxキャストを使用しようとします。存在しない場合、継承関係があると合理的に確信できる場合は、DirectCastを使用します。キャストが成功するかどうかわからない状況(たとえば、ユーザー入力->整数)の場合は、TryCastを使用して、ユーザーに例外を投げるよりもフレンドリーなことを行います。

振ることができないことの1つは、CStrではなくToStringを使用する傾向があることですが、おそらく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 2010年

4
@シミー:TryCastをまったく使用しない理由は何ですか?特定のシナリオで例外を回避するには、DirectCastの方が良いのではないですか?
Dienekes

3
@DienekesおよびNotMyself。TryCastはREFERENCEタイプ専用です。ここには、VALUE型の整数があります。コンパイラーはTryCastを拒否します。また、目標は文字列です。Nothing以外の.Netエンティティはサポートしません.ToString()。Integerなどの値の型をNothingにすることはできません。したがって、この場合、CStr(number)またはnumber.ToString()のいずれかが安全です。一般的な場合(値の型だけでなく)、CStr(whatever)は安全です。これは、Nothingを処理できるためです。結果は文字列変数でNothingになります。TryCastは非常に便利です-ここではありません。
ToolmakerSteve

4

-1は、DirectCastが露骨に適切ではないためです。ただし、非常に限られた状況で、言及しなかった場合を除きます。DirectCastは、2つの関連参照タイプがあり、それらの間の効率的なキャストが必要な場合に適しています。質問はの取得に関するものであるためString、OPがDirectCastが適切である状況について話し合っている可能性は低いです。
ToolmakerSteve 2014年

...質問は言及していなかった場合StringToString、私の苦情は適用されません。一般的なコンバージョンからトピックを絞り込むまでは、DirectCastを推奨しないでください。
ToolmakerSteve 2014年

1

認定試験によると、CXXX変換よりもパフォーマンスが最適化されるため、単純な変換では可能な限りConvert.ToXXX()を使用する必要があります。


1
ちなみに、MicrosoftのPaul Vickによると、Cxxxは関数を呼び出すのではなく、ILに直接コンパイルするため、少なくとも2004年は、Cxxx演算子はConvert.Toxxx関数よりも高速でした。彼の理論的根拠は疑わしいようですが、関数呼び出しをJITで最適化する機能を考えると、panopticoncentral.net/2004/05/31/the-native-net-language
ToolmakerSteve

0

CStr()の方が高速だったため、MSDNライブラリの状態でCStr()を使用するのを見たことを覚えています。これが本当かどうかはわかりません。


2
DirectCastはCStrよりも高速ですが、文字列オブジェクトを文字列変数にキャストする場合にのみ使用できます。他のオブジェクトを文字列に変換しようとすると失敗します。
ジョナサンアレン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.