DOBON.NET DOBON.NETプログラミング掲示板過去ログ

constの定数を引数にするとnullになる

環境/言語:[windows2000 .NET Framework 1.1]
分類:[.NET]

定数型のクラスを作成し
public const string XXXX = ”XXX”;


このクラスの定数XXXXを引数としたメソッドを呼び出すと
当メソッド内の値がNULLとなる。

public メソッド(string XXXX)


XXXXに定数値が代入されず、NULLとなる。

これはダメだと考え
public static readonlyに変えれば
上記のメソッドは起動したのですが

switch文で比較しようとすると
定数値でないとなり、ビルドできず。

constていったいなにもの???
いわっちさん、こんにちは。
> 定数型のクラスを作成し
> public const string XXXX = ”XXX”;
> ・
> ・
> このクラスの定数XXXXを引数としたメソッドを呼び出すと
> 当メソッド内の値がNULLとなる。
>
> public メソッド(string XXXX)
> ・
> ・
> XXXXに定数値が代入されず、NULLとなる。
>
> これはダメだと考え
> public static readonlyに変えれば
> 上記のメソッドは起動したのですが
>
> switch文で比較しようとすると
> 定数値でないとなり、ビルドできず。

一つ疑問に思った事なのですが、
クラス内でXXXXを使用するのなら、何故に引数するの?
基本的に、Const宣言した値は変えれませんので、引数として使用することが間違っていると思いますが…
それに、public メソッド(string XXXX)の、ここで使用しているXXXXは、
const宣言したXXXXとは別のものですよ。
当然、メソッドを呼び出した時に省略しているのであれば、Nullになりますよ。

> constていったいなにもの???
MSDNから引用すると、
const キーワードは、フィールドまたはローカル変数の宣言の修飾に使用されます。このキーワードを使用すると、フィールドまたはローカル変数の値を変更できないことを指定できます。
■No4733に返信(ペガサス研究室さんの記事)
> いわっちさん、こんにちは。
>>定数型のクラスを作成し
>>public const string XXXX = ”XXX”;
>>・
>>・
>>このクラスの定数XXXXを引数としたメソッドを呼び出すと
>>当メソッド内の値がNULLとなる。
>>
>>public メソッド(string XXXX)
>>・
>>・
>>XXXXに定数値が代入されず、NULLとなる。
>>
>>これはダメだと考え
>>public static readonlyに変えれば
>>上記のメソッドは起動したのですが
>>
>>switch文で比較しようとすると
>>定数値でないとなり、ビルドできず。
>
> 一つ疑問に思った事なのですが、
> クラス内でXXXXを使用するのなら、何故に引数するの?
> 基本的に、Const宣言した値は変えれませんので、引数として使用することが間違っていると思いますが…
> それに、public メソッド(string XXXX)の、ここで使用しているXXXXは、
> const宣言したXXXXとは別のものですよ。
> 当然、メソッドを呼び出した時に省略しているのであれば、Nullになりますよ。
>
>>constていったいなにもの???
> MSDNから引用すると、
> const キーワードは、フィールドまたはローカル変数の宣言の修飾に使用されます。このキーワードを使用すると、フィールドまたはローカル変数の値を変更できないことを指定できます。

以下のようなイメージで使用しています。

[public class Constant]→主に定数値を確認
/// <summary>
/// 課税区分のテーブル名
/// </summary>
public const String CODE_TABLE_KAZEI_KUBUN = "課税区分";

[public class ComboSellTypeUtil]→コンボの表示値、値を取得
CodeManager cm = new CodeManager();
//コード情報配列を取得します
CodeInfo[] ci = cm.GetCodeInfoByTableName(Constant.CODE_TABLE_KAZEI_KUBUN);

[public class CodeManager]→xmlからコードと名前を取得
public CodeInfo[] GetCodeInfoByTableName(string tableName)
{
// 引数がnullの場合
if (tableName == null)
{
// nullを戻します
return null;
}
// コード情報リスト
ArrayList codeTable = new ArrayList();
// XmlTextReader
XmlTextReader xmlReader = new XmlTextReader(this.CodeFilePath);
// XML読み込む
xmlReader.Read();

// XMLファイルを全て読込
while(!xmlReader.EOF)
{
// 指定されたテーブル名が存在した場合
if (xmlReader.IsStartElement("table") && xmlReader.GetAttribute("id").Equals(tableName))
{
// コード情報格納変数
string code = ""; // コード
string name = ""; // 名前
// 終了変数
bool eof = false;
// 読み込む
xmlReader.Read();
while(!xmlReader.EOF && !eof)
{
// コードタグ
if(xmlReader.IsStartElement("code"))
{
code = xmlReader.ReadElementString("code");
}
// 名前タグ
if(xmlReader.IsStartElement("name"))
{
name = xmlReader.ReadElementString("name");
}
if(xmlReader.NodeType.Equals(XmlNodeType.EndElement) &&
xmlReader.Name.Equals("row"))
{
// コード情報
CodeInfo ci = new CodeInfo();
// コードの設定
if (code != null)
{
ci.Code = code;
}
// 名前の設定
if (name != null)
{
ci.Name = name;
}
// コードテーブルへ格納
codeTable.Add(ci);
}
// エンドエレメントがtableの場合、処理を抜ける。
if(xmlReader.NodeType.Equals(XmlNodeType.EndElement) &&xmlReader.Name.Equals("table"))
{
eof = true;
}

// 読み込む
if (!eof)
{
xmlReader.Read();
}
}
}
else // 存在しない場合
{
// 読み込む
xmlReader.Read();
}
}
// 戻り値の設定
if (codeTable.Count == 0)
{
return null;
}
else
{
// リストからコード情報の配列を返す
return (CodeInfo[])codeTable.ToArray(typeof(CodeInfo));
}
}

[xml]
<table id="課税区分">
<row>
<code>0</code>
<name>共通</name>
</row>
<row>
<code>1</code>
<name>非課税</name>
</row>
<row>
<code>2</code>
<name>課税</name>
</row>
</table>
いわっちさん、こんにちは
こういうことですよね?
public class ClassA
{
public const String CODE_TABLE_KAZEI_KUBUN = "課税区分";
}

public class ClassB
{
public bool ShowConst()
{
ClassC sc = new ClassC();
***** return sc.SwitchConst( ClassA.CODE_TABLE_KAZEI_KUBUN);
}
}

public class ClassC
{
public bool SwitchConst(string tableName)
{
Console.WriteLine(tableName);
if (tableName == null)
return false;

switch(tableName)
{
case ClassA.CODE_TABLE_KAZEI_KUBUN:
MessageBox.Show(tableName);
break;
}
return true;
}
}

private void button1_Click(object sender, System.EventArgs e)
{
ClassB cb = new ClassB();
bool ret = cb.ShowConst();

}

特に問題なく動いているようですが^^; ただ、気になるのは*****の行でウォッチすると"課税区分"は見えないということくらいでしょうか。
constはコンパイル時評価なのでウォッチじゃ見れないんでしょうね。
readonlyは実行時評価なのでウォッチでも見えるんでしょうね。
■No4740に返信(ゆさんの記事)
> いわっちさん、こんにちは
> こういうことですよね?
> public class ClassA
> {
> public const String CODE_TABLE_KAZEI_KUBUN = "課税区分";
> }
>
> public class ClassB
> {
> public bool ShowConst()
> {
> ClassC sc = new ClassC();
> ***** return sc.SwitchConst( ClassA.CODE_TABLE_KAZEI_KUBUN);
> }
> }
>
> public class ClassC
> {
> public bool SwitchConst(string tableName)
> {
> Console.WriteLine(tableName);
> if (tableName == null)
> return false;
>
> switch(tableName)
> {
> case ClassA.CODE_TABLE_KAZEI_KUBUN:
> MessageBox.Show(tableName);
> break;
> }
> return true;
> }
> }
>
> private void button1_Click(object sender, System.EventArgs e)
> {
> ClassB cb = new ClassB();
> bool ret = cb.ShowConst();
>
> }
>
> 特に問題なく動いているようですが^^; ただ、気になるのは*****の行でウォッチすると"課税区分"は見えないということくらいでしょうか。
> constはコンパイル時評価なのでウォッチじゃ見れないんでしょうね。
> readonlyは実行時評価なのでウォッチでも見えるんでしょうね。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板