tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルCTYPEとは?
記事No5600
投稿日: 2007/06/03(Sun) 00:08
投稿者もねを
こんにちは。初歩的な質問ですみません。
ヘルプなどで、CTYPEについて調べているのですが難しい言葉などがあり理解できません。
簡単に一言で言うとどういう場合に使うのでしょうか?今は意味もわからずに使っています。

使うシーン

  Private Sub txtA1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles _
  txtA1.GotFocus, _
  txtA2.GotFocus

    Debug.Print(CType(sender, TextBox).Name)

  End Sub

このように自分自身のプロパティが何?という場合に使用していますがヘルプなどを見ると型変換などと記述されていて用途が違うようにも思えます。
しかし、
    Debug.Print(sender.Name)
このような書き方をしても、取得されるみたいなのですが、
sender. と入力をすると、小さな窓がでますが、プロパティなどは表示されません。
でも、CTYPE( と書くと、プロパティなども表示されます。

何かもやもやとしていて、すっきりとしたいのです。
よきアドバイスお願いします。

[ツリー表示へ]
タイトルRe: CTYPEとは?
記事No5602
投稿日: 2007/06/03(Sun) 18:03
投稿者よねKEN
> ヘルプなどで、CTYPEについて調べているのですが難しい言葉などがあり理解できません。

例えば、どんな単語が難しいですか?
#私が説明をしてみても、その「難しい言葉」を使ってしまっては元も子もないので。

> 簡単に一言で言うとどういう場合に使うのでしょうか?今は意味もわからずに使っています。

一言で言うなら「型変換」です。
が、この言葉も含めてわかりづらいと感じているようですので、
一言で表すのは難しいですね。

>   Private Sub txtA1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles _
>   txtA1.GotFocus, _
>   txtA2.GotFocus
>
>     Debug.Print(CType(sender, TextBox).Name)
>
>   End Sub
>
> このように自分自身のプロパティが何?という場合に使用していますがヘルプなどを見ると型変換などと記述されていて用途が違うようにも思えます。

senderの型は「ByVal sender As Object」という記述からObject型です。
Object型にはNameプロパティというものは持っていませんね。
で、このソースコードでは変数senderの中身はTextBox型のインスタンスであるとわかっているので、
CType関数を使って、Object型である変数senderから
実際のその中身のインスタンスの型であるTextBox型へ変換しています。

TextBox型にはNameプロパティがあるので、.Nameのように記述を続けて、
Nameプロパティを参照することができます。

> しかし、
>     Debug.Print(sender.Name)
> このような書き方をしても、取得されるみたいなのですが、

提示ソースコードでCType関数を使って行っていることと同じようなことを
VBが暗黙に行っているから、取得できるようになっています。
VBでも暗黙の型変換を禁止する(ソースコード先頭にOption Strict Onを記述する)と
上記のような型を意識しない記述はエラーになります。

> sender. と入力をすると、小さな窓がでますが、プロパティなどは表示されません。

senderはObject型なので小さな窓(インテリセンスといいます)にはObject型に関する情報しか表示されません。
つまり、Nameプロパティは表示されません。

> でも、CTYPE( と書くと、プロパティなども表示されます。

明示的に型変換を行っているため、TextBox型に対するプロパティ等が表示されます。

[ツリー表示へ]
タイトルRe^2: CTYPEとは?
記事No5609
投稿日: 2007/06/04(Mon) 23:59
投稿者もねを
よねKENさん

説明ありがとうございます。
なんとなくわかったようなきがします。
明示的な型変換とは、Object型なので、プロパティをみたいなら型に変換してみてくださいね。ということですね。

> 例えば、どんな単語が難しいですか?
> #私が説明をしてみても、その「難しい言葉」を使ってしまっては元も子もないので。

ちなみにですが初歩的な言葉で申し訳ないのですが・・・

#Visual Basic が例外をスローします。
#実行時に変換が失敗すると、適切な例外がスローされます。
スローとはなんでしょうか?投げる?

#CType はオーバーロードされた演算子として機能します。
オーバーロードとは何でしょうか?

#CType は、インラインでコンパイルされます。
インラインとは何でしょうか?

初歩的な言葉かもしれませんがよろしくご指導お願いします。

[ツリー表示へ]
タイトルRe^3: CTYPEとは?
記事No5610
投稿日: 2007/06/05(Tue) 02:26
投稿者魔界の仮面弁士
> #Visual Basic が例外をスローします。
> #実行時に変換が失敗すると、適切な例外がスローされます。
> スローとはなんでしょうか?投げる?

その通り『投げる』です。{Throw ステートメントを参照}

別の言い方に変えてみると、「適切な・例外が・スローされます」という文章は
「失敗の理由に応じた・実行時エラーが・発生します」のような文意となります。

投げられた例外は、どこかで『捕らえ』なければいけません。{Catch ステートメントを参照}
そして例外を捕らえる処理のことを、「例外処理」「エラートラップ」などと呼びます。

なお、Throw された例外が誰にも Catch されなかった場合は、アプリケーションエラーとなります。


> #CType はオーバーロードされた演算子として機能します。
> オーバーロードとは何でしょうか?

overload という用語は、ときには日本語で「多重定義」と表現される事があります。

たとえば…….NET Framework の「MessageBox.Show」というメソッドには、
 MessageBox.Show("あいうえお")
 MessageBox.Show("あいうえお", "かきくけこ")
 MessageBox.Show("あいうえお", "かきくけこ", MessageBoxButtons.YesNo)
 MessageBox.Show("あいうえお", "かきくけこ", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
のように、引数の数やデータ型の異なる複数の定義が存在します。

このように、『メソッド名は同じだが、引数の数や型を変えて定義された複数のメソッド』を、
「オーバーロードされたメソッド」と呼びます。

また、標準のメソッドに対して、別の引数定義を持ったを物を追加することは、
「メソッドをオーバーロードする」などと呼ばれます。

そして、『演算子のオーバーロード』も同様です。
標準では存在しない演算子の定義を、自分で追加できるのです。

たとえば、すべての構造体やクラスは、標準で「Object 型への暗黙の型変換」と
「Object 型からの明示的な型変換」ができるようになっています。

そして、自分で「型変換演算子をオーバーロード」すると、Object 型だけでなく、
他の型との間の変換機能を追加することが可能なのです。

たとえば……
 Structure 個人
  Public 姓 As String
  Public 名 As String
 End Structure
という構造体があったとして、それに対して
 Dim X As 個人 = "東国原 英夫"
のような変換を行うとエラーとなりますよね。

しかし、CType 演算子をオーバーロードして、
 Structure 個人
  Public 姓 As String
  Public 名 As String

  Shared Widening Operator CType(ByVal value As String) As 個人
   Dim s() As String = value.Split(" "c)
   Dim x As New 個人()
   x.姓 = s(0)
   If s.Length <> 1 Then
    x.名 = s(1)
   End If
   Return x
  End Operator
 End Structure
などとしておけば、先の
 Dim X As 個人 = "東国原 英夫"
のような暗黙変換が行えるようになるわけです。


> #CType は、インラインでコンパイルされます。
> インラインとは何でしょうか?

inline。直訳では「文中」「行内」などの意味です。

コンパイラの動作に絡んでくる部分なので、詳しくは説明しにくいのですが、大雑把に言えば、
サブルーチン/関数呼び出しにしないコードを意味するコンピュータ用語…といったところかと。
http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E5%B1%95%E9%96%8B


# ……って、こんな説明で分かってもらえるかなぁ。(^^;

[ツリー表示へ]
タイトルRe^4: CTYPEとは?
記事No5612
投稿日: 2007/06/05(Tue) 23:43
投稿者もねを
魔界の仮面弁士さん

スロー、オーバーロードは理解できました。ありがとうございます。
Structureの例については難しくてまだわかりませんが、課題にしたいと思います。
Structureの中に書けることがびっくりしました。
インラインについては、なんとなくわかったような、わからないようなといった感じですが、コンパイルに関する言葉ということは理解できました。
課題がたくさんですが頑張ります。
ありがとうございました。

[ツリー表示へ]