• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:vb.netの型変換について)

vb.netの型変換について

このQ&Aのポイント
  • VB.netの型変換について詳しく解説します。
  • DirectCastとCtypeの違い、CstrとToStringとConvertの違いについて解説します。
  • VB.netでの型変換の使い分けや、継承関係による選択方法について紹介します。

質問者が選んだベストアンサー

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

>・継承関係にあるObject型に変換するならDirectCastがよい。 「継承関係にあるObject型に変換」ってどういう意味ですか? 全てのクラスはObject型を継承しています。(だからこそObject型の 変数を用意すれば型変換なしに何でも代入できてしまうわけですが。) ほぼ意味の無い表現ですよこれ。 「オブジェクトに変換」という意味で使ったんでしょうか? 「Object型」というものが定義されている以上、意味が変わってしまいますよ。 >・継承関係にない型変換の場合は、Ctypeがよい。 DirectCast の方がパフォーマンスに優れているのだから、DirectCast が使えるなら使った方がよいです。「良い悪い」では無く「出来る出来ない」 のレベルで違いがあるので、この理解の仕方では本末転倒です。 DirectCast の使い方が理解できない初心者向けの一時しのぎの解釈として、 CTypeで統一しておくというのはあると思います。 可読性とか、統一する事で検索し易くして保守性を上げる人もいるかもしれ ません。少数派だと思いますが。 >・Cstr、ToString、convertは、nullやNothingをどう扱うかによって使い分ければよい 対象の値がnullやNothingの場合にエラーになるならないの違いはありますが、 エラートラップすればいいだけなので、どの関数でも同等のプログラムは 書けます。nullやNothingの処理が関数の仕様どおりなら使った方がスッキリ 書けるでしょうが、nullやNothingが入ってきてる時点で問題がある場合が 多いので、Convert.ToStringで変換してしまうのは、そういった仕様が明確に なっている場合のみに限定する事をお勧めします。 あとは、コーディングルールを決めているならそれに従えばいいですし、 オブジェクト指向的な概念を重要視すれば、ToStringはオブジェクトが 主体。Convert.~は変換が主体。CStrは手続き型なのでオブジェクト指向 ではないと言えます。 オブジェクトを文字列に変換する場合に、内部的には ToString が呼ばれて いる場面が多々あります。ToString を使えるのが統一的な処理を書ける場合が 多いです。オーバーライドしてリスト系のコントロールに表示される文字列を カスタマイズするテクニックなどがあります。 CStrはVB6世代のコーディングなので、VB.NETの概念的には使わない方がいいの ですが、VB用に最適化されているのでパフォーマンスが向上することがあります。 私は使いません。 そもそも型変換において重要な点には、拡大変換と縮小変換があり、 VBは勝手に暗黙的な型変換を試みるので、変換元から変換先へ、どのような 変換規則が適用されるかを知っていないと判断なんてできませんが。 私の結論としては、勉強する気が無いなら CType と ToString 使っとけです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VB.netで、動的な型変換を行いたいのですが、、、(CTypeではできない?!)

    VB.netで、 動的な型変換を行いたいと思っています。 イメージ的には、 CType(hogehoge,String)やCType(hogehoge,Integer) CType(hogehoge,MyClassHogehoge) ではなく、 CType(hogehoge,"String"),CType(hogehoge,"Integer") CType(hogehoge,"MyClassHogehoge") というように、 その場の変数で決まる型変換です。 Dim a as MyClassA Dim b as Object とあって CType(b,a)というような変換をしたいのです。 (が、CTypeやDirectCastの第二引数は、  定義された型名しか受け付け無いようです。) ----- 実際には、 mytype.InvokeMember("変数名", BindingFlags.SetProperty Or BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance, Nothing, "インスタンス", New [Object]() {"設定値"}) という処理をやる上で、 "設定値"が文字列(String)である場合、 "変数名"で、動的にアサインされた変数の型(たとえばMyClass)に型変換しないと、 値が設定できないためです。 (CType("設定値","インスタンス"."変数名")というようなこと必要となってくるはずです、、、) ----- 上記手順が、可能なのかどうか、 まったくのナンセンスなのかどうかも わかっていないので、 一言でもいただけるとたすかります。。。 どうぞよろしくおねがいいたします。

  • Double→Integerへの変換で「意図しない変換を防ぐ」

    'もう一質問。頻繁に考えていたこと Class himajin100000 Shared Sub Main Dim hoge As Integer Dim fuga As Double = 5.5 hoge = System.Convert.ToInt32(5.5) System.Diagnostics.Debug.Print(hoge.ToString) hoge = CType(5.5,Integer) System.Diagnostics.Debug.Print(hoge.ToString) 'という変換を防ぎたいです。 'Double値が5.0など、整数として切りの良い数字のときのみ変換したい 'それ以外はプログラマのミスとしてエラーが検出できるように。 'なお、 'hoge = DirectCast(5.5,Integer) 'とか 'hoge = DirectCast(System.Math.Floor(5.5),Integer) 'はエラーが出ます。 '今まで私は, hoge = Integer.Parse(System.Math.Floor(5.5).ToString) System.Diagnostics.Debug.Print(hoge.ToString) 'という風に書いてきました。 'Integer.Parse((5.5).ToString) System.FormatException '何かString型を介している地点で冗長な気がするので 'もっといい方法・わかりやすい方法等があれば教えてください End Sub End Class

  • 暗黙の型変換をやめたい

    ASP.NET(C#2.0)からSQLServer2008R2のストアドプロシージャをコールする際、暗黙の型変換を使うとパフォーマンスが落ちるらしいので、全て明示的な型変換に修正したいと思っています。 MySQLをselectした値をリーダー(reader)に格納し、SQLServerにストアドコール時にパラメータ指定してinsertするのですが、何が暗黙的で何が明示的なのかわかりません。 下記は引数1にパラメータ、引数2にDBType(省略可)、引数3に値を指定しています。 [暗黙的かと思われるパラメータの渡し方] AddParameter("@パラメータ1", reader["値1"]); //char(2) AddParameter("@パラメータ2", DbType.string, reader["値2"].ToString()); //nvarchar(20) [明示的かと思われるパラメータの渡し方] AddParameter("@パラメータ3", DbType.DateTime, Convert.ToDateTime(reader["値3"])); //datetime AddParameter("@パラメータ4", DbType.Currency, (Convert.ToDecimal(reader["値4"])) * 100); //money 暗黙の型変換とは、引数3の型を指定しない場合に起こるという認識で合っていますでしょうか?

  • Worksheetsオブジェクト解放について・・

    VB2005からエクセルを操作するプログラムを書いてます。 設計条件として遅延バインディングの制約があります。 以下のコードではプロセスが残ってしまい原因が分かりません。 有識者のご教授をお願いします。 Public Function OpenBook () As Boolean 'エクセルブックを開く関数 Dim exlAppli As Object = Nothing Dim exlBooks As Object = Nothing Dim exlBook As Object = Nothing Dim exlSheets As Object = Nothing Dim exlSheet As Object = Nothing Try exlAppli = CreateObject("Excel.Application") exlAppli.Visible = False exlAppli.DisplayAlerts = False exlBooks = exlAppli.Workbooks exlBook = exlBooks.Add '(新規作成) exlSheets = exlBook.Worksheets For Each exlSheet In exlSheets '処理 ' ・・中略・・ ' 'シート1個づつをオブジェクト解放 Call Me.sub_ReleaseComObject(DirectCast(sht, Object)) Next Catch ex As Exception '例外処理 MessageBox.Show(ex.Message, "サンプル", MessageBoxButtons.OK, MessageBoxIcon.Error) Return False Finally Call Me.sub_ReleaseComObject(DirectCast(exlSheet, Object)) Call Me.sub_ReleaseComObject(DirectCast(exlSheets, Object)) exlBook.Close(False) Call Me.sub_ReleaseComObject(DirectCast(exlBook, Object)) Call Me.sub_ReleaseComObject(DirectCast(exlBooks, Object)) exlAppli.Quit() Call Me.sub_ReleaseComObject(DirectCast(exlAppli, Object)) End Try Return True End Function 事前バインディングなら上記のコードでプロセスは終了します。 ちなみに、勝手な想像ですが、For Each~に何か原因があるのでしょうか。

  • 配列の中の値の型変換

    Array => [0] => Array  ['id'] => '10'  ['size'] => Array   ['height'] => '25.1'   ['width'] => '10.6'   ['length'] => '15.7'  ['name'] => 'shose'  ['comment'] => '' [1] => Array  ['id'] => '10'  ['size'] => Array   ['height'] => '25.1'   ['width'] => '10.6'   ['length'] => null  ['name'] => 'paper'  ['comment'] => 'color is red'   上記のように配列の中の要素の値が全てstring型で、値がない要素だけnullという配列があります。 この配列の全ての文字列を、  整数に変換可能ならint型に変換  浮動小数点型に変換可能ならfloat型に変換  数値に変換不可能ならstring型のまま  nullの場合はnullのまま にキャストしたいのですがどのようなコードになるのでしょうか? ネストの深さは一定ではありません。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • Vb .net オブジェクトの属性に応じて値を変え

    Vb .net オブジェクトの属性に応じて値を文字列に加工して渡したいです。 DataTableのセルやStringやIntegerやdateなどの値が渡されることを想定しています。 postgresqlのWhere句に渡す事を想定しています。 strTmp = TestTest(Object1) strSql = "Where item1 = " & strTmp <内容> ・オブジェクトの値がDBNull.Valueなら文字列で"null" ・数字属性の場合、  文字列に変換して数字を渡す ・日付属性の場合、  文字列に変換して値を渡す ・文字属性の場合、  シングルクオートした値を渡す。 ・上記以外は文字列で"null"を渡す。 <書きかけ> function TestTest(byref p01 Object) As String dim aaaa as object dim bbbb as string if aaaa is DBNull.Value then bbbb = "null" else Select Case aaaa 属性 Case 数字の場合 bbbb = aaaa.toString Case 文字の場合 bbbb = "'" & aaaa.toString & "'" Case 日付の場合 bbbb = "'" & to_timestamp('" & Format( aaaa, "yyyy.mm.dd hh:nn:ss" ) & "', 'YYYY.MM.DD HH24:MI:SS')" Case Else bbbb = "null" End Select end if Return (bbbb) end function <メモ> ・属性の判定方法が分かりません。 ・何か見落としている事はありませんか? 以上、よろしくお願いします。

  • VB.NETからWEBブラウザの操作について

    VS2008 VB.NETにて開発を行っています。 プログラムからIEにて開いたWEBサイトに IDとパスワードを自動入力し自動ログインする処理を作成しています。 IDとパスワードの入力については、サンプルサイトなどからお借りして 以下のように作成し実現できました。 Dim ieDoc As mshtml.HTMLDocument = CType(IE.Document, mshtml.HTMLDocument) Dim elCol As mshtml.IHTMLElementCollection = CType(ieDoc.all, mshtml.IHTMLElementCollection) Dim usTxt As mshtml.HTMLInputTextElement = DirectCast(elCol.item("username"), mshtml.HTMLInputTextElement) Dim psTxt As mshtml.HTMLInputTextElement = DirectCast(elCol.item("password"), mshtml.HTMLInputTextElement) Dim elBtn As mshtml.HTMLButtonElement = CType(elCol.item("???"), mshtml.HTMLButtonElement) usTxt.value = "xxxxx" psTxt.value = "xxxxx" elBtn.click() ただログインボタンクリックの部分にnameのTAGがなく以下のような通常のクリック動作を行う ソースになっています。 ・ログインする対象のWEBサイトのソース <td colspan="2" class="white centerPosT"> <a href="#" onclick="javascript:login(); return false;"> <img src="/images/btn_login.gif" alt="ログイン" onmouseout="javascript:showUp(this)" onmousedown="javascript:showDown(this)" /> </a> </td> このような場合にログインをクリックさせるにはどのような方法で行えばよろしいのでしょうか?

  • VB2010でGoogleを操作したい

    VB初心者です。さきほどの質問で、自分ができたところまでのソースを載せ忘れたので、改めて質問させていただきます。 今Visual Basic 2010 .Netで、 フォームに貼り付けたテキストボックスに入力した文字列を、 ボタンをクリックするとGoogleを立ち上げ、 そのGoogleのテキストボックスに先ほどフォームで入力した文字列を自動で入力、 入力後自動で検索のボタンをクリック するというのを作成中なのですが、Googleを立ち上げたところまではできたのですが、テキストボックスへ自動で入力するところでエラーが出て止まっています。 フォームのテキストボックスの文字列の取得は成功してまして、参照の追加COMで必要な参照はしています。 フォームでWebブラウザのツールを使わずに上記をするのは無理なのでしょうか? ご存知の方はご教示のほどよろしくお願いいたします。 下にソースを載せます。 Pubic Class Form1 Private WithEvents IE As SHDocVw.InternetExplorer Private myUrl As String Private Googletxt As String Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click If Not (IE Is Nothing) Then IE.Quit() IE = Nothing End If myUrl = "http://www.google.co.jp/" IE = New SHDocVw.InternetExplorer Googletxt = Textbox1.Text IE.Visible = True IE.Navigate2(myUrl.ToString) End Sub Private Sub IE_DocumentComplete(ByVal pDisp As Object, ByRef URL As Object) Handles IE.DocumentComplete Invoke(New SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(AddressOf foo), pDisp, URL) End Sub Private Sub foo(ByVal pDisp As Object, ByRef URL As Object) Dim Doc0 As mshtml.HTMLDocument = CType(IE.Document, mshtml.HTMLDocument) Dim ElCo As mshtml.IHTMLElementCollection = CType(Doc0.all, mshtml.IHTMLElementCollection) Dim elem As mshtml.HTMLInputTextElement = DirectCast(ElCo.item("q"), mshtml.HTMLInputTextElement) elem.value = Googletxt '検索キーワードの入力用テキストボックスに書き込み Dim btn1 As mshtml.HTMLInputTextElement = DirectCast(ElCo.item("btnG"), mshtml.HTMLInputTextElement) btn1.click() '検索ボタンをクリック End Sub End Class エラー elem.value = Googletxt 上記のところで、"オブジェクト参照が オブジェクトインスタンスに設定されていません。" と出ています。

  • 型変換??

    int RANDOM_FUNCTION( int n ) { return (int)( rand() / (float)RAND_MAX * n ); } について Q1.この関数は0からn-1までの乱数を作るそうなのですが,何故ですか? 0<=rand()<=RAND_MAX だから0からnまでの乱数ができるような気がするのですが. Q2.RAND_MAXではなく(float)RAND_MAXとキャストしてある意味は何ですか? Q3.srand((unsigned)time(NULL));と srand((unsigned int)time(NULL));では何か違いますか? Q4.  static int first = 0; if (first == 0){ srand((unsigned)time(NULL)); first = 1; } という処理でsrand((unsigned)time(NULL));は最初の一回だけ呼び出されるようになっているようですが,この部分を srand((unsigned)time(NULL)); というように毎回呼び出すようにするとどうなりますか? 一回呼び出すだけで乱数系列の初期値が呼び出される時に変化しているのですか? Q5.この関数とは関係ない質問ですが,例えば a:int型 b:int型 c:double型 d:float型 のとき d = a / b + c という演算は 1 a:int型,b:int型より(a / b)の結果はint型(小数になった場合は小数点以下切り捨て) 2 (a / b):int型,c:double型,int<doubleより (a / b + c)の結果はdouble型 3 d:float型,『=のあるときは左辺の型に合わせる』よりdはfloat型 というように型変換されているという解釈でいいのでしょうか??

  • VB.NET EXCEL

    下記のコードで、アプリケーション実行中 EXCELが起動したままになり アプリケーション終了時に、EXCELも一緒に終了する という、タスクマネージャーに残るという動作になります。 どこの COM の扱い方がまずかったのでしょうか? 教えてください。お願いします。 ※文字数制限で、SQLコネクション周り、SQL系宣言 エラー処理を消しました。 ※EXCEL周りに関してはすべてそのままです。 変数に代入している COMオブジェクトをすべて Marshal.FinalReleaseComObject してもEXCELが終了しないので何かしら COMオブジェクトを見落としていると思うのですが どれだかわかりません。 よろしくお願いします Imports Microsoft.Office.Interop Imports System.Runtime.InteropServices Public Class Cls_Print_Excel Public Sub S_Print_Excel() 'エクセルアクセス用 Dim _xslFile As String = "C:\base.xls" Dim objExcel As Excel.Application = Nothing Dim objWorkBook As Excel.Workbook = Nothing Dim objWorkBooks As Excel.Workbooks = Nothing Dim xlSheet As Excel.Worksheet = Nothing Dim xlRange As Excel.Range = Nothing Dim xlPageSetup As Excel.PageSetup = Nothing Try objExcel = New Excel.Application objWorkBooks = objExcel.Workbooks objWorkBooks.Open(_xslFile) objWorkBook = objExcel.ActiveWorkbook xlSheet = DirectCast(objWorkBook.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet) rs = cm.ExecuteReader() I = 3 Do While rs.Read Dim AA() As String = {"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"} Dim K As Integer For K = 0 To 11 IN_Range(xlSheet, AA(K) & I.ToString, rs(K).ToString) Next xlRange = xlSheet.Range("3:3") xlRange.Copy() A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) xlRange.PasteSpecial( _ Paste:=Microsoft.Office.Interop.Excel.XlPasteType.xlPasteFormats, _ Operation:=Microsoft.Office.Interop.Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, _ SkipBlanks:=False, Transpose:=False) A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) xlRange = xlRange.EntireRow xlRange.AutoFit() A = A + Marshal.ReleaseComObject(xlRange) xlRange = xlSheet.Range(I.ToString & ":" & I.ToString) N = 5.5 While True If CType(xlRange.RowHeight, Double) < N Then Exit While Else N += 5.5 End If End While xlRange.RowHeight = N '高さを設定 A = A + Marshal.ReleaseComObject(xlRange) I += 1 'ループカウンタを積む Loop xlPageSetup = xlSheet.PageSetup xlPageSetup.PrintArea = "B2:M" & (I - 1).ToString A = A + Marshal.ReleaseComObject(xlPageSetup) S_filename = System.IO.Path.GetDirectoryName(_xslFile) & Format(Now(), "yyyy-MM-dd-HH-mm-ss") & ".xls" objWorkBook.SaveAs(S_filename) objWorkBooks.Close() A = A + Marshal.ReleaseComObject(objWorkBooks) objExcel.Quit() A = A + Marshal.ReleaseComObject(objExcel) Exit Sub Catch ex As Exception Finally End Try End Sub Private Sub IN_Range(ByRef wSheet As Microsoft.Office.Interop.Excel.Worksheet, _ ByVal iCell As String, _ ByVal Value As String) Dim rng As Excel.Range = wSheet.Range(iCell) rng.Value = Value Marshal.FinalReleaseComObject(rng) rng = Nothing End Sub End Class