- PR -

リフレクションで返されるリスト内の順番

投稿者投稿内容
DSCH
常連さん
会議室デビュー日: 2005/10/23
投稿数: 24
投稿日時: 2005-11-07 20:00
クラス内の情報の場合、経験則ではソースコードの上に書いてある順だと思えます。
しかし、MSDNでC#のリフレクションの概要や、GetFieldメソッドなどの項目を見ても、一覧を取得できるとあるだけで、順番については触れられていません。

「リフレクション 順番」「リフレクション 配列 順」
など思い当たるキーワードで検索してみても、ずばり記述してあるサイトに出会えませんでした。

リフレクションで返されるリスト内の順番がどうなっているのか、ご存知の方はいらっしゃらないでしょうか?よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-07 21:41
 CLR で規定されていないなら、「実装による」でしょうね。

 実際、順番がどうであれ、参照できればいいわけですから、実装に任せて規定していないと思います。
 ハッシュテーブルを使っていたら、どんな順になるかはわからないでしょう。リニアテーブルを使っていたら、ソースコード順になるでしょう。順序づけされたテーブル使っていたら、何らかの辞書順になるでしょう。

 ということで、実装に依存するような使い方はやめましょう。
___________________________________________________________________
□ written by Jitta on 2005/11/07
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
DSCH
常連さん
会議室デビュー日: 2005/10/23
投稿数: 24
投稿日時: 2005-11-07 22:21
Jittaさん、回答ありがとうございます。

情報格納クラスの複数の文字列フィールドの値を、意図した順に出力するという課題がありました。
対象となる情報格納クラスは結構な数になると予想されます。
抽象クラスに
1.リフレクションを使って呼び出し元インスタンス(継承クラス)の型のFieldInfoのリストを取得する。
2.リスト順に呼び出し元インスタンスの当該フィールドの値を出力する
というメソッドを定義して、個別クラスで意図した順番どおりフィールド定義を書けば負担が減るかと考えました。

ですので、ソースコードの順番でリストが返ってくるという保障が必要でした。
実装に依存するということは、実行環境が変われば正常に動かなくなるかもしれないコードとなるわけですね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-08 00:26
引用:

DSCHさんの書き込み (2005-11-07 22:21) より:

実装に依存するということは、実行環境が変われば正常に動かなくなるかもしれないコードとなるわけですね。


「機種に依存」だとか「端末に依存」とは言っていませんよね?
この場合は、クラスの実装に依存という意味でしょう。

リフレクションについてですが、通常はメンバが定義された順番で返ります。
が、コンストラクタとプロパティは例外です。
プロパティは、get_, set_ が実体になります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-08 06:39
引用:

じゃんぬねっとさんの書き込み (2005-11-08 00:26) より:

「機種に依存」だとか「端末に依存」とは言っていませんよね?
この場合は、クラスの実装に依存という意味でしょう。


 あ、いや、「コンパイラの実装に依存」だと思います。
 「クラスの実装」だと、『ソースコードの順番でリストが返ってくるという保障』がされるのではないでしょうか。

 単にソースに出てきた順に並べてあるのではなく、参照しやすいように並べ替えてあるという前提で話をしています。
 そういえば、継承なんかするとどうなるのでしょう?C# と VB.NET では、継承しているメソッドの、名前解決の順番が違います。まぁ、単に一覧するのとは違うかもしれませんが。

http://www.gotdotnet.com/team/clr/about_clr_Compilers.aspx
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconcommonlanguageruntimeoverview.asp
http://devresource.hp.com/drc/specifications/ecma/index.jsp

この辺に規定されていなければ、「実装依存」ということで。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-08 09:51
引用:

Jittaさんの書き込み (2005-11-08 06:39) より:

あ、いや、「コンパイラの実装に依存」だと思います。
「クラスの実装」だと、『ソースコードの順番でリストが返ってくるという保障』がされるのではないでしょうか。


そうですね。
リフレクションは実行時に結果が確定するものが殆どですが、
今回のようなものは、IList でも実装していない限りは「コンパイラ依存」でしょう。
「共通言語ランタイム」ではなさそうですね。

引用:

C# と VB.NET では、継承しているメソッドの、名前解決の順番が違います。
まぁ、単に一覧するのとは違うかもしれませんが。


名前解決の順番と関係あるんですかね?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2005-11-08 10:05
順序保障が明記されていないのであれば最初から順序などアテにしないで、
取得したセットを自分でsortする方向で設計したほうがいいと思いますが…。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-08 21:23
 あっと、そうそう。
引用:

情報格納クラスの複数の文字列フィールドの値を、意図した順に出力するという課題がありました。


それこそこちらの質問と同じことが出来るのではないでしょうか。
コード:
class Hoge {
	private string[] stringProperties;
	public Hoge() {
		stringProperties = new string[10];
		...
	}
	public string Property1 {
		get { return stringProperties[0]; }
		set { stringProperties[0] = value; }
	}
	...
	public string ListProperties() {
		System.Text.StringBuilder retValue = new System.Text.StringBuilder();
		for (int idx = 0; idx < 10; idx++) {
			retValue.Add(stringProperties[idx]);
		}
		return retValue.ToString();
	}
}




 他に、カスタム属性を作って、それに順番を持たせ、リフレクションによって属性を参照しながら選択する、という方法もあると思います。
___________________________________________________________________
□ written by Jitta on 2005/11/08
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________

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