- PR -

CONSTに関して

投稿者投稿内容
damepg
大ベテラン
会議室デビュー日: 2003/03/19
投稿数: 229
お住まい・勤務地: 東京都内
投稿日時: 2003-04-04 11:45
VB.NETでWeb開発をしています。下記の様に0〜2の値を
常数として使用したいのですが、CONSTとEnumのどちらを使用した方が
便利なのでしょうか?

<1>
#Const CNST_SUPER = 0
#Const CNST_EAST = 1
#Const CNST_WEST = 2
<2>
Public Enum AdminID
super= 0
east = 1
west = 2
End Enum
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2003-04-04 12:35
karajanです。

東西を表す場合に、
const EAST = 0;
const WEST = 1;
として、
次のようなメソッドがある場合、

function hoge(direction as integer)

パラメータdirectionには0,1以外の数値がセットされている可能性がありますが、

enum DirectionEW
{
EAST,
WEST
}
とすれば、

function hoge(direction as DirectionEW)

パラメータには東、西以外の値は来ません。

といった感じで使い方によって変わってくると思いますが、
こういう場合は列挙型のほうが便利というか安全な気がします。

回答になってないかもしれませんが・・・。

NothingButXMLInfoSet
ベテラン
会議室デビュー日: 2003/03/31
投稿数: 65
投稿日時: 2003-04-04 12:59
引用:

karajanさんの書き込み (2003-04-04 12:35) より:
function hoge(direction as DirectionEW)

パラメータには東、西以外の値は来ません。


そうとは限りません。次のコードは実行できます。

コード:
enum ThisIsJustConsts {
  EAST,
  WEST
}
class App {
  static void Main() {
    int i = 100;
    TakeEnum((ThisIsJustConsts)i);
  }
  static void TakeEnum(ThisIsJustConsts val) {
    System.Console.WriteLine(val);
  }
}


列挙体は大してタイプセーフではありません。コードがわかりやすいとか、インテリセンスが使えるとかいう程度の機能だと思います。
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2003-04-04 13:36
karajanです。

そうですね、やろうと思えばできたな・・・とは思ったのですが、あまりやらないと思ったもので・・・。

列挙型がもっている便利さ(インテリセンスや値一覧の取得等)や、コードで明示的に型を示すことで、より間違いを防ぐ効果もあると思いますので、私は上記のような場合は列挙型のがいいかな・・と思ってます。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2003-04-04 14:59
迷わず列挙型を使ってください。
例えば、方角の値を受けて仕事をする関数hoge()があった場合に

const int CNST_North=0;
const int CNST_South=1;
const int CNST_East=2;
const int CNST_West=3;
void hoge(int dir){
}

とすると、渡されているのは数値です。もちろん呼び出す方も呼び出される方も「北は0で、南は1で・・・」と知っていますので、方角の情報を渡すことができますが。対して、

enum Direction{
 North,
 South,
 East,
 West,
}
void hoge(Direction dir){
}

このようにすれば、受け渡しされているのは方角です。渡される型には「方角」という意味が与えられています。
Direction.Northは0ではなく、あくまで北なのです。

NothingButXMLInfoSetさんの例のように数値を型変換しても、渡す値を(Direction)iなどと変換した時に、プログラマは「この渡す値は方角ですよ」との意思表示しているわけです。逆にhogeから見ると「方角しか受け取らん」という格好になります。

オブジェクト指向なのですから、それぞれのオブジェクトの意味ということについて考え、迷わず列挙型を使いましょう。
damepg
大ベテラン
会議室デビュー日: 2003/03/19
投稿数: 229
お住まい・勤務地: 東京都内
投稿日時: 2003-04-04 16:16
Enumに文字を設定するとエラーとなりますが、整数しか設定できないのでしょうか?

EastWest = Request.QueryString.Item("EastWest")
if EastWest = AdminID.east then
の様にしたいのですが。

Public Enum AdminID
super= "0"
east = "1"
west = "2"
End Enum
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-04-04 17:15
こんにちは。
引用:

damepgさんの書き込み (2003-04-04 16:16) より:
Enumに文字を設定するとエラーとなりますが、整数しか設定できないのでしょうか?

EastWest = Request.QueryString.Item("EastWest")
if EastWest = AdminID.east then
の様にしたいのですが。


列挙できるのは整数だけですが、こんな風にして、実現できるそうです。
NothingButXMLInfoSet
ベテラン
会議室デビュー日: 2003/03/31
投稿数: 65
投稿日時: 2003-04-04 17:56
引用:

damepgさんの書き込み (2003-04-04 16:16) より:
Enumに文字を設定するとエラーとなりますが、整数しか設定できないのでしょうか?


列挙体の型はいわゆる整数型(LongやShortも含むChar除く)にしかできません。Stringにはできません。

引用:

EastWest = Request.QueryString.Item("EastWest")
if EastWest = AdminID.east then
の様にしたいのですが。



Request.QueryString.Item("EastWest")で得られる値のほうを数値型に変換すれば可能でしょう。

スキルアップ/キャリアアップ(JOB@IT)