C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: object型について


(過去ログ 47 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■25150 / inTopicNo.1)  object型について
  
□投稿者/ 長瀬 (1回)-(2008/09/16(Tue) 12:55:51)

分類:[C#] 

開発環境はVC#2008

データ型について学んでいますが、その中でobject型という特殊なデータ型がありますよね。
これは、ボックス化とボックス化解除によって、すべてのデータを統一的に取り扱うことが
でき、object型を引数や戻り値にするメソッドを宣言すれば値型、参照型を区別することな
くあらゆるデータを受け取ることができるとありますが、このobject型を使っているプログラム
はほとんど見あたらないのはどうしてなのでしょう?(利便性の高い機能なのですよね)
引用返信 編集キー/
■25155 / inTopicNo.2)  Re[1]: object型について
□投稿者/ ネタ好き (612回)-(2008/09/16(Tue) 13:23:26)
No25150 (長瀬 さん) に返信
> 開発環境はVC#2008
>
> データ型について学んでいますが、その中でobject型という特殊なデータ型がありますよね。
> これは、ボックス化とボックス化解除によって、すべてのデータを統一的に取り扱うことが
> でき、object型を引数や戻り値にするメソッドを宣言すれば値型、参照型を区別することな
> くあらゆるデータを受け取ることができるとありますが、このobject型を使っているプログラム
> はほとんど見あたらないのはどうしてなのでしょう?(利便性の高い機能なのですよね)

利便性が高い機能というよりも、最後の手段というイメージのほうがわかりやすいと思います。
型情報がなくなるので非常に不便です。
使い勝手は、Cでの*voidと同じと思っていただければいいと思います。
引用返信 編集キー/
■25156 / inTopicNo.3)  Re[2]: object型について
□投稿者/ 長瀬 (2回)-(2008/09/16(Tue) 13:28:24)
No25155 (ネタ好き さん) に返信
> 利便性が高い機能というよりも、最後の手段というイメージのほうがわかりやすいと思います。
> 型情報がなくなるので非常に不便です。

最後の手段というのは、どういうことでしょうか?
具体的におしえていただければ幸いです。

> 使い勝手は、Cでの*voidと同じと思っていただければいいと思います。
Cは初歩的な理解しかないので(^^;)
すみません。
引用返信 編集キー/
■25157 / inTopicNo.4)  Re[3]: object型について
□投稿者/ ネタ好き (613回)-(2008/09/16(Tue) 13:42:41)
2008/09/16(Tue) 14:06:51 編集(投稿者)
2008/09/16(Tue) 13:44:38 編集(投稿者)

No25156 (長瀬 さん) に返信
何故最後の手段なのかといいますと、利用するべきでない大まかな理由があるからです。

・ボックス/アンボックスでパフォーマンスが下がります。
・object型では元の型が何かわかりにくくなります。
・objectばかりだとコードの可読性が下がります。
・型変換はパフォーマンスが下がります。
・プログラミング中、objectでは抽象的過ぎて何をしているのかわからなくなる恐れがあります。
・型の安全性が守られません。

これらの理由から基本的にはobjectは使用しません。
しかしながら、実際の開発では、どうしてもobjectにしないといけない場合がありえます。
それで【最終手段】だと私は考えているのです。
引用返信 編集キー/
■25158 / inTopicNo.5)  Re[3]: object型について
□投稿者/ 凪瀬 (79回)-(2008/09/16(Tue) 13:45:07)
凪瀬 さんの Web サイト
書類を種類ごとに区分けされた書類棚があるとしますよね。
これを区分けに合わせて書類を出し入れするのが面倒だから区分けをなくして
単一の箱にしてしまうとしましょう。果たして便利になるでしょうか?

データ型をObjectにすることで、逆にどんな型がくるのか一切分からなくなるんですよ。
文字列が帰ってくると予見していたのに数値が返ってきたりするんです。
そうすると、受けての方で、データ型のバリエーション分だけ分岐させるとか、
予見したデータ型以外の場合は例外を起こすようにするとかいう処理を入れる必要が出てくる。
型を規定することで、これらのチェックは言語でやってくれるようになります。
引用返信 編集キー/
■25166 / inTopicNo.6)  Re[4]: object型について
□投稿者/ 囚人 (306回)-(2008/09/16(Tue) 14:42:37)
例えがよくないですが、

・オブジェクト(インスタンス)→サクサク美味しいクッキー
・クラス→サクサク美味しいクッキーの鋳型

とします。

・object型→大きいの丸い鋳型
・int型→小さい三角の鋳型
・string型→小さいパンダ型の鋳型

小さい三角のクッキーは大きい丸い鋳型には入る。
小さい三角のクッキーは小さいパンダ型の鋳型には入らない。
小さいパンダ型のクッキーは大きい丸い鋳型には入る。
小さいパンダ型のクッキーは小さい三角の鋳型のには入らない。

クッキーを選んで食べたい(オブジェクトを操作したい)が、鋳型しか見せてくれない。
大きい丸い鋳型に入っている小さいパンダ型のクッキーを、パンダの耳から食べたいが、鋳型しか見せてくれないので、食べ方を選べない(パンダ型特有の型情報が分からない)。

要するに、型情報を得たいか得たくないかです。
型がどうでも良い場面であれば object を使って何ら問題ないですが(ボックス化と解除のパフォーマンスの問題とかは別にして)、型がどうでもよくないなら型を明記せざるを得ないだけです。
引用返信 編集キー/
■25182 / inTopicNo.7)  Re[1]: object型について
□投稿者/ よねKEN (189回)-(2008/09/16(Tue) 17:28:31)
#他の方からいろいろ返信が付いているので遅レスで蛇足かもしれませんが私もコメントしておきます。

> このobject型を使っているプログラムはほとんど見あたらないのはどうしてなのでしょう?

例えば、引数がObject型のメソッドの中ではその引数をどう扱いますか?
Object型の引数に対して渡される値はStringでもInt32でも独自クラスでも何でも良いわけですから、
渡されたインスタンスの型が何であるかを判定して処理を分岐させる必要があります。
また、想定されない型が渡されていないかといった安全のためのチェックも必要です。

つまり、処理が冗長になったり、型の安全性が保証されなかったり、といったデメリットがあります。
たいていの場合は、より限定的な型を使用する方が適切です。
Object型の引数を取るパターンはたいてい、

(1) ToStringメソッドを呼び出せばOKな処理
(2) Object型で受ける以外の方法がない処理

のどちらかでしょう。前者はObject型でToStringメソッドを共通で持っているので
型の違いに寄らず同じ処理を書けます。

後者は、ArrayListやHashtableなどのコレクション系のクラス(.NET Framework2.0より前からあるもの)
がありますね。コレクションに格納したいものはあるときはString、あるときはInt32のように
そのときどきでは、1つの型に決まっていることがほとんどです。
しかし、それぞれの型用のコレクションをすべて用意するわけにはいきません。
そのため、仕方なくObject型で受けていました。これにより型の安全性は損なわれ、
コレクションから値を取り出す際には毎回キャストが必要というデメリットがありました。

.NET Framework2.0ではジェネリックが導入され、この点はList<T>やDictionary<T>クラスで改善されています。

引用返信 編集キー/
■25342 / inTopicNo.8)  Re[2]: object型について
□投稿者/ Jitta (511回)-(2008/09/17(Wed) 22:12:10)
Jitta さんの Web サイト
No25155(ネタ好き さん)に返信

> 型情報がなくなるので非常に不便です。
 分類が [C#] なので、C# に限って言うと、型情報はなくなりません。でないと、typeof 演算子などで型を取り出すことができません。


No25150(長瀬 さん)に返信

> (利便性の高い機能なのですよね)
 「汎化された」とは言いますが、「利便性が高い」とは言いません。
C# においては、すべての型が Object 型から派生しているため、Object 型として扱うことが可能だというだけです。

 ん?ボックス化?値型をボックス化すると Object 型になるのは、値型と相互変換可能な参照型がないからです。参照型を Object 型で参照するのは、ボックス化とは異なります。


C# Language Specification 1.2 の 「4.3 ボックス化とボックス化解除」、

> ボックス化とボックス化解除は、(snip)、value-type のすべての値と object 型間の変換を可能にするため、value-types と reference-types との橋渡しの役目を果たします。

より、「参照型を Object 型で参照するのはボックス化ではない」と理解しているけど、違う?

引用返信 編集キー/
■25346 / inTopicNo.9)  Re[3]: object型について
□投稿者/ アキラ (106回)-(2008/09/17(Wed) 22:25:49)
アキラ さんの Web サイト
No25342 (Jitta さん) に返信
>>型情報がなくなるので非常に不便です。
>  分類が [C#] なので、C# に限って言うと、型情報はなくなりません。でないと、typeof 演算子などで型を取り出すことができません。

typeofは実行時型情報ですから、型情報がなくなるという表現は間違っていないと思います。
引用返信 編集キー/
■25357 / inTopicNo.10)  Re[4]: object型について
□投稿者/ Jitta on the way (180回)-(2008/09/18(Thu) 07:14:11)
No25346 (アキラ さん) に返信
> ■No25342 (Jitta さん) に返信
> >>型情報がなくなるので非常に不便です。
>> 分類が [C#] なので、C# に限って言うと、型情報はなくなりません。でないと、typeof 演算子などで型を取り出すことができません。
>
> typeofは実行時型情報ですから、型情報がなくなるという表現は間違っていないと思います。

あ、コーディング時か!
そうですね。ありがとうございます。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -