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

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

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

Re[20]: 基本データ型をどう表現しますか?


(過去ログ 35 を表示中)

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

■17224 / inTopicNo.1)  基本データ型をどう表現しますか?
  
□投稿者/ ネタ好き (119回)-(2008/04/19(Sat) 04:10:05)

分類:[.NET 全般] 

2008/04/19(Sat) 04:13:45 編集(投稿者)

いまさらなテーマですが、皆様は基本データ型をベースクラスで表現しますか、
それとも、言語に合わした表現にしますか?
例が無いと話しが見えにくいと思いますので一部書きますと・・・

<ベースクラスの表現>
System.Byte型
System.Int32型

<VB.NET>
Byte
Integer

<C#>
byte
int

<Managed C++(C++/CLIまだ慣れていないもので)>
char
unsigned int または unsigned long

複数言語を扱っているので、これでいいのかという疑問が常にありました。
そして、私自身結論を出せないでいます。
どのような状況でベースクラス表現がよくて、どのような状況が言語表現がふさわしいと思いますか?
そして、現場ではどうしていますか?
お答えが頂ければ幸いです。
引用返信 編集キー/
■17225 / inTopicNo.2)  Re[1]: 基本データ型をどう表現しますか?
□投稿者/ ま (14回)-(2008/04/19(Sat) 05:33:59)
2008/04/19(Sat) 05:36:17 編集(投稿者)

No17224 (ネタ好き さん) に返信

こんな時間まで起きてて済みませんm(__)m 水滸伝19巻読みつつ・・・

基本ですから、System.Int32 は そのまま使います。変に小細工して
というか、C++だったら、
#define DWORD System.Int32 とかはありかもしれませんが、クラスじゃ
なくてマクロですね。


というか、最小単位がObjectなJavaならベースクラス?もありな気がしますが、
unmanaged な C++ は型は<取消>ネーテイブ</取消><訂正>プリミティブ</訂正>じゃないのですか?
char はバイトだし、short は word だし、long はQWORDだし、int はDWORDだし。

C#も int は、int.class なんですか?>済みません、確認してません。


自分的には、JavaScript2.0のやっつけみたいな記法がいいなぁと思います。
var a:int;
だったっけ?
とりあえず、var で宣言しとけ。みたいな。
VBも似たようなこと出来ますが。


>言語にあわした表現

です。char と long 扱いが一部処理系で違うだけですからそこだけ認識できていれば基本データ型は
問題ないのではないかと。BYTE,WORD,DWORD,QWORD,TWORD は昔っから指す大きさが同じなんで基本これ
だけしっときゃ十分な気がします。

# 初回、タイトル入れ忘れて 送信、「タイトル入っていません」エラーで質問消失・・・意気消沈
# 次回、タイトル入ってるし、安全のために、プレビューチェック入れて確認しつつ、これでOK、送信押したら、スレッドから消えてる・・・質問の内容に禁句が入っていたのでしょうか?
# 2時間掛けて考えたしょーもない質問すら掲示板に拒否されました・・・・

引用返信 編集キー/
■17226 / inTopicNo.3)  Re[2]: 基本データ型をどう表現しますか?
□投稿者/ れい (492回)-(2008/04/19(Sat) 06:32:25)
No17224 (ネタ好き さん) に返信
> 2008/04/19(Sat) 04:13:45 編集(投稿者)
>
> いまさらなテーマですが、皆様は基本データ型をベースクラスで表現しますか、
> それとも、言語に合わした表現にしますか?
> 例が無いと話しが見えにくいと思いますので一部書きますと・・・

> そして、現場ではどうしていますか?
#現場ってどこの現場だろう?

私は他に制約がなければ、大きさのわかる表現を用います。
つまり、Int32やInt64を使います。

CやC++の歴史的事情は偉い人にまかせますが、
intのサイズはもともとプラットフォーム依存です。
これはソースコード互換を重要視したというのが多分にあります。
歴史が証明するように、それによるソースの再利用性、教育上の効果は非常に大きかったわけですが。

結果、838861枚買うと非常に安くメダルが買える、
といったことがおきるようになっちゃったわけです。

バッファやスタックのオーバーフローなども同じ問題で
結局、サイズ不明な整数型を使うようでは信頼性が確保できす、
アルゴリズムレベルではなく、実用レベルで使えるコードをかくためには
「常に実現可能な範囲を意識しなければいけない」のです。

これは、intがプラットフォーム依存であったCの当初の理念と反しますが、
その理念はソフトウェア工学的には間違いであったと、私は思います。

ならば…。
intやchar、long、long longといった覚えなければわからない表現を用いるのではなく、
最初からわかるように表記すべきでしょう。

多種多様な環境、言語を扱った人だと、
その経験ゆえ新しい言語でのintのサイズがわからなくなりますが、
int32と書かれていれば明白です。

新しい環境、言語、プロジェクトなら、
なるべくサイズのわかる表現を使っています。

ただ、歴史がある場合など、例外はあります。
特にCのようにオブジェクト指向をサポートしない場合は
構造体やtypedefで数字に意味を持たせる慣習になっています。
DWORDはDWORDであって、intとかINT32とは違うので、それに従います。
引用返信 編集キー/
■17231 / inTopicNo.4)  Re[3]: 基本データ型をどう表現しますか?
□投稿者/ επιστημη (940回)-(2008/04/19(Sat) 09:16:56)
επιστημη さんの Web サイト
> 私は他に制約がなければ、大きさのわかる表現を用います。
> つまり、Int32やInt64を使います。

僕は真逆ですねぇ。
(大きさが重要という)制約がなければ、大きさを意識しない表現を用います。

引用返信 編集キー/
■17234 / inTopicNo.5)  Re[4]: 基本データ型をどう表現しますか?
□投稿者/ ネタ好き (120回)-(2008/04/19(Sat) 15:47:25)
2008/04/19(Sat) 15:48:11 編集(投稿者)
2008/04/19(Sat) 15:47:48 編集(投稿者)

皆さんご意見有難うございます。大変参考になります。
じゃんじゃんお願いします。
えっと、現場というのは職場の事です。
私は色々あって、ここ3年近くフリーターに落ちぶれて、研究やっていますし、
変な会社しか就職したこと無いので、まともなチーム開発の経験もほとんどないので、
普通の開発会社はどうやっているのかな?と気になって書きました。
「事件は会議室(専門書)で起きているんじゃない、現場で起きているんだ!」ってやつです。
やっぱり、個人で書籍に頼って研究していると視野が狭くなります。
それを恐れて色々な現場の知識が欲しくなりました。
引用返信 編集キー/
■17237 / inTopicNo.6)  Re[4]: 基本データ型をどう表現しますか?
□投稿者/ 渋木宏明(ひどり) (707回)-(2008/04/19(Sat) 20:29:33)
渋木宏明(ひどり) さんの Web サイト
> 僕は真逆ですねぇ。
> (大きさが重要という)制約がなければ、大きさを意識しない表現を用います。

僕もそーです。

for でループ回すのに

・ループ回数が 127 回階以下なら char
・ループ回数が 128 以上、255 回以下なら unsigned char

みたいに、いちいち場合分けするのめんどーだし。

引用返信 編集キー/
■17241 / inTopicNo.7)  Re[5]: 基本データ型をどう表現しますか?
□投稿者/ indigo-x (2回)-(2008/04/19(Sat) 22:12:34)
サイズがわかる型は、経験から言えばベタな通信がらみでしょうか

 サイズとエンディアンとバウンダリの三点セット

  (恐ろしくベタです)

最近ベタな通信してないな。。。
.NETでは特に少ないのかな。。。。
引用返信 編集キー/
■17242 / inTopicNo.8)  Re[6]: 基本データ型をどう表現しますか?
□投稿者/ 囚人 (297回)-(2008/04/19(Sat) 23:49:04)
Int32 とは書かないですけど、考え的にはれいさん派かな。
int や long は、Form クラスだとか GC クラスだとかと違って、サイズが重要な型だと思います。
int と書こうが Int32 とかこうが「これは32ビットだ」と常に意識しないといかんと思うわけです。

引用返信 編集キー/
■17244 / inTopicNo.9)  Re[5]: 基本データ型をどう表現しますか?
□投稿者/ れい (494回)-(2008/04/20(Sun) 01:21:56)
No17237 (渋木宏明(ひどり) さん) に返信
>>僕は真逆ですねぇ。
>>(大きさが重要という)制約がなければ、大きさを意識しない表現を用います。
>
> 僕もそーです。
>
> for でループ回すのに
>
> ・ループ回数が 127 回階以下なら char
> ・ループ回数が 128 以上、255 回以下なら unsigned char
>
> みたいに、いちいち場合分けするのめんどーだし。

なるべく小さいほうを使えといってるわけではないですよ。

大きさが十分にあるということを意識したうえで、
パフォーマンスに優れていたり、より深く考えなくていいほう、
と考えた結果、intなサイズの変数を使うのは当然ありでしょう。

私もCならどっちもintです。

.Netなら、事実上32bitか64bitしかないので、
値の小さい変数に対しても、32bit幅の変数を使います。
ただ、そのときに私は(手が動けば)intではなくInt32を選びます。

intが12bitなCしか使ったことの無い人もいて。
その人が「C#のintのサイズっていくつ?」と聞いてくるのがうるさいので。


ところで。

C#のenumは基本型にInt32とかByteとか使えません。
「enum : Int32」ができてもいいと思う私ですが、
これって、全ての値型でできてもいいなぁと。
つまり、「enum : Color」とかしたいのです。

誰かこの辺議論してたりしないかなぁ。
引用返信 編集キー/
■17247 / inTopicNo.10)  Re[6]: 基本データ型をどう表現しますか?
□投稿者/ 囚人 (298回)-(2008/04/20(Sun) 02:14:32)
>C#のenumは基本型にInt32とかByteとか使えません。
>「enum : Int32」ができてもいいと思う私ですが、
>これって、全ての値型でできてもいいなぁと。
>つまり、「enum : Color」とかしたいのです。

できますよ。
enum ByteEnum : byte{
	A = 127,
	//B = 256 ← 無理
}

Color とかは無理ですけど。数値のみ。

引用返信 編集キー/
■17248 / inTopicNo.11)  Re[7]: 基本データ型をどう表現しますか?
□投稿者/ 囚人 (299回)-(2008/04/20(Sun) 02:15:57)
>C#のenumは基本型にInt32とかByteとか使えません。

あ、意味と取り違えました。

enum ByteEnum : Byte

って書けないって事ですね。確かに。なんでだろ。

引用返信 編集キー/
■17249 / inTopicNo.12)  Re[6]: 基本データ型をどう表現しますか?
□投稿者/ ネタ好き (123回)-(2008/04/20(Sun) 02:16:34)
2008/04/20(Sun) 02:32:34 編集(投稿者)
2008/04/20(Sun) 02:31:25 編集(投稿者)
2008/04/20(Sun) 02:18:15 編集(投稿者)

> C#のenumは基本型にInt32とかByteとか使えません。
> 「enum : Int32」ができてもいいと思う私ですが、

私もそう思います。
おそらくCLS準拠以上の実装をしている言語(UIntとか)とそうでない言語(符号なし数値が無い)の事を考慮したのでしょう。


> これって、全ての値型でできてもいいなぁと。
> つまり、「enum : Color」とかしたいのです。

うーん。それはちょっとまずいかも。
多分こんな事できるようになると思います。

public enum AppColor : Color {
LabelColor = Red,
ButtonColor = Gray
}

確かに便利かもしれません。
とはいえ、Colorとかは値型だけど、System.Enumから派生した型ですから、
これを列挙体に使うとなれば、事実上制限つき継承になってしまうと思います。
かといって、従来どおり継承なしとなれば、混乱が起きると思います。
こんな風に・・・

AppColor appClr = AppColor.LabelColor;
Color clr = (Color)appClr; ←エラー!

これを避けたかったのだと思います。
これを防ぐには、コンパイラは継承する列挙型を全部数値へ変換せねばなりません。それが嫌だったのかな?
でも、こんな風にしてくれてもいいのにとは思います。

AppColor appClr = AppColor.LabelColor;
Color clr = (Color)(Int32)appClr; ←エラーじゃない

初心者にはちょっときついかも?
初心者から掲示板に「どうしてColorは変換できないの?」って質問がきそう。
引用返信 編集キー/
■17250 / inTopicNo.13)  Re[7]: 基本データ型をどう表現しますか?
□投稿者/ れい (495回)-(2008/04/20(Sun) 02:31:54)
No17249 (ネタ好き さん) に返信
> とはいえ、Colorとかは値型だけど、System.Enumから派生した型ですから、
> これを列挙体に使うとなれば、事実上制限つき継承になってしまうと思います。
> かといって、従来どおり継承なしとなれば、混乱が起きると思います。
> こんな風に・・・
>
> AppColor appClr = AppColor.LabelColor;
> Color clr = (Color)appClr; ←エラー!
>
> これを避けたかったのだと思います。
> これを防ぐには、コンパイラは継承する列挙型を全部数値へ変換せねばなりません。それが嫌だったのかな?

??
ぜんぜん意味がわかりませぬ。
Colorって、System.Enumから派生した型ではないですよ?
例に関しても、私はまさにそれをやりたくて、
しかもそれはぜんぜん問題ないとおもいます。

が、できないということは何か抜けがあるんだろうなぁ。
引用返信 編集キー/
■17251 / inTopicNo.14)  Re[8]: 基本データ型をどう表現しますか?
□投稿者/ ネタ好き (124回)-(2008/04/20(Sun) 02:41:42)
2008/04/20(Sun) 03:06:06 編集(投稿者)
2008/04/20(Sun) 02:59:10 編集(投稿者)
2008/04/20(Sun) 02:53:17 編集(投稿者)

れいさんへ

あっ間違えた。済みません。Colorは構造体なのでSystem.ValueTypeですね。
例を間違ってしまいましたが、私が言いたかったのは、
列挙体も値型だけど列挙体から派生するのはまずいよね?と言う事です。
それと、値型は継承を禁じられているので、全ての値型というのは無理があるのでは?と言う事です。
でも本心を言えば、実装して欲しいですね。
実装しようと思えば出来るはずです。

AppColor appClr = AppColor.LabelColor;
をコンパイル時に
Color appClr = Color.Red
にしてしまえばいいのだから。
見かけは継承できるけども、実際は継承していないという挙動は初心者からブーイングがくるかもしれないけどね。


【訂正】
AppColor appClr = AppColor.LabelColor;
Color clr = (Color)(Int32)appClr; ←エラーじゃない

これは

AppColor appClr = AppColor.LabelColor;
Color clr = (Color)(ValueType)appClr; ←エラーじゃない

です。

※脱字を訂正しました
引用返信 編集キー/
■17252 / inTopicNo.15)  Re[9]: 基本データ型をどう表現しますか?
□投稿者/ れい (496回)-(2008/04/20(Sun) 02:53:27)
No17251 (ネタ好き さん) に返信
> 列挙体も値型だけど列挙体から派生するのはまずいよね?と言う事です。

列挙体を新たに列挙しても問題ないと思います。

> それと、値型は継承を禁じられているので、全ての値型というのは無理があるのでは?と言う事です。

どんな無理があるかなぁ?と聞きたいのです。

構文上、実用上、困っちゃうことがあるならしょうがないですが、
私には今のところ思いつかないのです。

どんな無理があるのでしょう?
引用返信 編集キー/
■17253 / inTopicNo.16)  Re[10]: 基本データ型をどう表現しますか?
□投稿者/ ネタ好き (125回)-(2008/04/20(Sun) 03:04:42)
2008/04/20(Sun) 03:05:07 編集(投稿者)

れいさんへ返信
もし実際に値型を継承可能にしようと思えば、型ハンドルが必要となってくるはずです。
そうしないと継承を管理出来ないと思います。
でもそれをしてしまうと、参照型と同じです。
とはいえ、「見かけだけ継承」も可能なはずです。
しかし、見かけは継承できるのに、実際の挙動は継承していないというのは、
混乱を生むとMSは判断したのだと思います。
引用返信 編集キー/
■17254 / inTopicNo.17)  Re[11]: 基本データ型をどう表現しますか?
□投稿者/ れい (497回)-(2008/04/20(Sun) 04:58:31)
No17253 (ネタ好き さん) に返信
> しかし、見かけは継承できるのに、実際の挙動は継承していないというのは、
> 混乱を生むとMSは判断したのだと思います。

それは普通のenumも同じじゃないのかなぁ?
数字というのはわかりやすいからいいとかなのだろうか。

それとも初期化の問題か?
引用返信 編集キー/
■17257 / inTopicNo.18)  Re[12]: 基本データ型をどう表現しますか?
□投稿者/ ネタ好き (126回)-(2008/04/20(Sun) 11:04:28)
No17254 (れい さん) に返信
> それとも初期化の問題か?

それもありえますね。
それと、もしかしたら異なる言語との連携を考えたのかも知れませんね。
例えば、先ほどのAppColorは実体はColorです。
それがC#で定義されているとして、他言語のVBでも「AppColor」で使いたいはずです。
となれば、それを実現するには属性となると思います。
こんな感じかな?

[Export ( TypeMapping = Color ) ]←C#コンパイラがこんな属性を自動的につける
public enum AppColor : Color {
LabelColor = Red,
ButtonColor = Gray
}

とすると、VBコンパイラやCコンパイラは、全員この属性を処理せねばなりません。
その言語間の強制的仕様は避けたかったのだと思います。
可能だけどもコストに見合うメリットが無いとMSは思ったのかな?
私は結構便利だと思うんだけどね。
引用返信 編集キー/
■17258 / inTopicNo.19)  Re[13]: 基本データ型をどう表現しますか?
□投稿者/ れい (498回)-(2008/04/20(Sun) 12:21:16)
No17257 (ネタ好き さん) に返信
> それと、もしかしたら異なる言語との連携を考えたのかも知れませんね。
> 例えば、先ほどのAppColorは実体はColorです。
> それがC#で定義されているとして、他言語のVBでも「AppColor」で使いたいはずです。
> となれば、それを実現するには属性となると思います。

んー
もしサポートしようとするなら
当然基になる型は覚えておかないとだめですよね。
基になる型と各列挙の値と。

それは属性というレベルの話ではなく、
もっと低レベルで実装しないとですね。

引用返信 編集キー/
■17259 / inTopicNo.20)  Re[14]: 基本データ型をどう表現しますか?
 
□投稿者/ ネタ好き (127回)-(2008/04/20(Sun) 12:38:19)
> んー
> もしサポートしようとするなら
> 当然基になる型は覚えておかないとだめですよね。
> 基になる型と各列挙の値と。
>
> それは属性というレベルの話ではなく、
> もっと低レベルで実装しないとですね。
>

成る程。値型が早いのはスタックを使用しているのと、
必ず親型がSystem.ValueTypeかSystem.Enumになっているという暗黙知を利用しているのかもしれませんね。
そうすると、低レベルで実装すると前提が崩れパフォーマンスが悪くなると推測できます。
MSはこれを恐れたのかな?
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -