ふらっとC#,C♯,C#(初心者用) Part25 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
08/02/27 18:24:40
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

前スレ

ふらっとC#,C♯,C#(初心者用) Part24
スレリンク(tech板)

2:デフォルトの名無しさん
08/02/27 18:27:47
C#, C♯, C#相談室 Part45
スレリンク(tech板)

C♯, C#相談室 Part34
スレリンク(tech板)

【新GUI FW】WPF(XAML,AVALON,.NET3.0)【重い?】
スレリンク(tech板)

Windows Live プログラミング
スレリンク(tech板)

初心者のためのプログラミング言語ガイド Part7
スレリンク(tech板)

3:デフォルトの名無しさん
08/02/27 18:30:26
>>950を踏んだ人は新スレを立てて下さい。
>>950が無理な場合、話し合って新スレ立てる人を決めて下さい。


誰も建てないので立てますた。



4:前962
08/02/27 18:43:58
>>前967
ありがとうございます。
どうしても同じスコープにするのは難しそうです、現状は大雑把なキャンセルということで満足しておくことにします

5:デフォルトの名無しさん
08/02/27 18:45:13
>>1 乙。

>>前スレ998
わざわざ匿名メソッドとか使うまでもなく
OwnerForm.Invoke(new Action(OwnerForm.Show));

6:前スレ998
08/02/27 18:59:49
>>5
たしかにその通りですねw
おかげでコードがシンプルになりました。
ありがとうございます。

7:デフォルトの名無しさん
08/02/27 19:00:52
パネルのどこでダブルクリックをしても同じ動作をしたいのですが、
FlowLayoutPanel.MouseDoubleClickイベントは上に何も乗っていない場所でしか起きないようです。
上に載せたコントロール全てに同じイベントを設定してあげなければいけないのでしょうか?
それとも何かワザがあるのでしょうか?

8:デフォルトの名無しさん
08/02/27 19:17:32
>>7
俺はそのワザというのがちょっと思いつかんけど、
俺だったらPanelの子コントロールコレクションをForeachでループして
一行イベント追加の構文書いて実現するね。
3行でいけるっしょ。



9:デフォルトの名無しさん
08/02/27 19:21:06
>>8
!=7ですが面白い手ですね、自分は諦めてました

10:7
08/02/27 19:35:42
>>8
ありがとうございます。踏ん切りが付きました。

11:デフォルトの名無しさん
08/02/27 19:54:17
質問です。
例えばデフォルトのForm1クラスのような、継承やインスタンスの生成を1度しかしないクラスがあったとした場合
クラス内メンバ全てにstaticをつけた方が良いのでしょうか?

また、通常の設計などがわからず、インターネットで調べつつ色々作ってみています。
エントリポイントである以下の部分には通常手を加えるものなのでしょうか?(Program.cs)
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Properties.Form1());
}
}
全てForm1クラス内で済ませているのですがどうにも不自然に感じてきています
おかしなことを言っていたらすいません、それではよろしくお願いします

12:デフォルトの名無しさん
08/02/27 20:01:17
>>11
パフォーマンスの点ではstaticをつければ、パーマネント領域に移ってガベージコレクト対象から外れるのでいいかもね。
汎用性をとるなら、普通にメンバにしておいたほうがいいんじゃないかな。
自分は "クラス名.メソッド()" と書くとコードがシンプルになるらな迷わずstaticを選ぶね。
エントリーポイントは時に変更が必要不可欠になる事がある、そのときのために触らなくて済む限り触らない、綺麗なままにしておく。

13:11
08/02/27 20:04:56
>>12
ありがとうございます。
主要処理部分をとりあえずstaticにしておくことにしました。
エントリポイントについては把握しました。
自分の場合Form1クラスを中心に他を操作するような感じでいけばいいわけですね

14:デフォルトの名無しさん
08/02/27 20:28:00
staticにするとコントロールに触れないよ?
だからってコントロールもstaticにするとかアホなことするくらいなら迷わずインスタンスメソッドにする

15:11
08/02/27 20:31:59
コントロールをstaticにすると何か問題があるのでしょうか?
まず最初にコントロールをstaticにしてましたorz
一応色々調整してうまく動いています

16:デフォルトの名無しさん
08/02/27 20:40:21
デストラクタで全コントロールをDispose()すればいいんじゃね、と初心者が行ってみる

17:デフォルトの名無しさん
08/02/27 20:48:41
>>15
>何か問題
コードの読み手(一ヵ月後の自分だってそうだ)を無意味に惑わすのが問題。

普通の能力の読み手なら「あえて」staticにしているのには何か意味があるはずだ、
と考えると思うんだが、実際には何の意味もない(あったら教えてくれ)ってのは
大問題でしょ。


18:デフォルトの名無しさん
08/02/27 20:59:27
エスパーするとステータスバーだけpublic staticにするといい

19:デフォルトの名無しさん
08/02/27 21:10:04
どう「いい」のかねw

20:デフォルトの名無しさん
08/02/27 21:11:39
エスパーするとって書いてあるんだから馬鹿にするんだからどうエスパーしたかわかってるんだろうな、すごいなw

21:デフォルトの名無しさん
08/02/27 21:16:28
>>16
コントロールをstaticにしてたらGCの対象から外れるからデストラクタが呼ばれない

22:デフォルトの名無しさん
08/02/27 22:15:23
>前スレ992
2秒差で無茶ゆうなよw


23:デフォルトの名無しさん
08/02/27 22:25:41
>前スレ992
こ れ は ひ ど い

24:デフォルトの名無しさん
08/02/27 23:10:29
>>21
呼ばれるよ、アプリが終了する時までには。
実行中はガベコレの対象にならないというだけで、他にもこのパーマネント領域にはクラスのTypeのオブジェクト等がいる。

25:デフォルトの名無しさん
08/02/27 23:46:00
匿名型で System.Collections.Generic.List は簡単に作れないのでしょうか?

var tmp_array = new[] {
new { Col1 = 10 , Col2 = "あ" } ,
new { Col1 = 20 , Col2 = "い" } ,
new { Col1 = 30 , Col2 = "う" } ,
};
var list = tmp_array.ToList();

とりあえずこんな具合に作ってみたのですが、どうにも無駄っぽい感じがします。

26:デフォルトの名無しさん
08/02/27 23:47:25
エクスプローラの左側みたいなデスクトップがルートのツリービューを作りたいんだけど
そういうコントロールって無いの?
TreeView使って自分で項目追加するしかないのかなあ。

27:デフォルトの名無しさん
08/02/28 00:01:46
>>26
Microsoft.VisualBasic.Compatibility.VB6.DirListBoxとか、使った事無いけどそれっぽいの出るよ。


28:デフォルトの名無しさん
08/02/28 00:09:57
>>25
var list = new[] {
new { Col1 = 10 , Col2 = "あ" } ,
new { Col1 = 20 , Col2 = "い" } ,
new { Col1 = 30 , Col2 = "う" } ,
}.ToList();

これでいいんじゃない?

29:デフォルトの名無しさん
08/02/28 00:19:37
ひさびさにツールボックスの追加項目色々ながめてみたら結構色々よさげなの多いね
言語の壁を越えられるライブラリはすばらしい

30:デフォルトの名無しさん
08/02/28 00:44:49
C/C++で言うところのstatic修飾されたローカル変数と同様の動作をするローカル変数を定義することはできないのでしょうか?

31:26
08/02/28 00:45:25
>>27
うーん、見た目がなんか古臭いし、デスクトップがルートじゃないのも…
自分で作るしかないか。
シェルネームスペース関連のクラスって無いですよね?
その辺も整備しないといかんのか…

32:デフォルトの名無しさん
08/02/28 00:46:31
>>30
静的メンバ変数じゃあかんのか?

33:デフォルトの名無しさん
08/02/28 00:52:53
>>31
Com側も探してみたら、なんか色々あるよ。
もっともComインターフェイス系のクラスは、どれも表示できても使い勝手悪そうだけど……

34:デフォルトの名無しさん
08/02/28 00:53:45
>>32
それでも実装できるんですが、一つのメソッドでしか使用しない変数なので他のメソッドにもスコープを広げるのはどうかと思いまして・・・

35:デフォルトの名無しさん
08/02/28 00:57:56
>>34
privateしかないですね、C#は、というか.NETはリフレクションという機能があって、
自分自身のコードをプログラムから覗く機能があって、スコープ概念は実質ないというか使えません。
たとえば、あるクラスにどんな変数や関数があるのかプログラム中で一覧を列挙できるんですよ。
この機能はC++では、templateメタプログラミングで代用ですね。

36:デフォルトの名無しさん
08/02/28 01:00:42
>>35
細かい解説ありがとうございます。privateメンバで実装したいと思います

37:デフォルトの名無しさん
08/02/28 01:20:30
C++でもtemplateが絡むと static ローカル変数は怖いんだよ
Microsoft じゃない方の M の付く会社で作っている、なんとかリャーとかいうコンパイラは
型が違うなら別々のインスタンスにすべき所を纏めて一つだけとって重複バグをやらかしたりその反対やらかしたりと・・・

38:デフォルトの名無しさん
08/02/28 09:10:50
エビフリャー?

39:デフォルトの名無しさん
08/02/28 10:18:30
おんどりゃー!

40:デフォルトの名無しさん
08/02/28 11:33:31
クロージャ使えばそれっぽいことできるよ
実質メソッドごとに内部クラス定義してるのと一緒だけど

41:デフォルトの名無しさん
08/02/28 12:19:21
こう書くとwhileのループに捕まってしまう事があるのですが何か良い方法はありませんでしょうか?

WebBrowser wb = new WebBrowser();
wb.Navigate(uri);
while (wb.Url == null)
{
Thread.Sleep(1000);
Application.DoEvents();
}

42:デフォルトの名無しさん
08/02/28 12:25:20
Navigated イベントとか使えよ

43:デフォルトの名無しさん
08/02/28 12:31:58
今はイベントでやっているのですがイベント無しだと無理なのですね。

44:デフォルトの名無しさん
08/02/28 12:35:39
イベント前提のフレームワークなんだから

45:デフォルトの名無しさん
08/02/28 22:33:45
int a = 0;
a = a++;

ってやるとaの値が0のままなんだけど、これはどういう理屈?
C++だとインクリメントされた値になるんだが

46:デフォルトの名無しさん
08/02/28 22:41:03
a = ++a;なら1になるのでは?

47:デフォルトの名無しさん
08/02/28 22:44:32
馬鹿は黙っててください

48:デフォルトの名無しさん
08/02/28 22:53:38
仕様に逆らって喜んでいる基地外に言われたくない

49:デフォルトの名無しさん
08/02/28 22:59:55
は?

50:デフォルトの名無しさん
08/02/28 23:04:04
a = a++;
右辺から評価されていく。
aをインクリメントし、式としてはインクリメントする前の値を返す。
すなわち
a = 0;

51:デフォルトの名無しさん
08/02/28 23:06:54
今時こんなバカな話がでるとは

52:デフォルトの名無しさん
08/02/28 23:31:31
C++とC#で挙動が違うって言うのはちょっと面白い。

53:デフォルトの名無しさん
08/02/28 23:34:08
C++だと未定義で動作は処理系依存じゃなかったっけ?

54:デフォルトの名無しさん
08/02/29 00:10:03
>>53
代入演算ですらそんな挙動するっけ?

確かに、x = f(a) + g(b) みたいなのは、f と g のどっちが先に呼ばれるか
未定義・処理系依存だったと思うけど。
C++ は思った以上に処理系依存動作多いもんなぁ。

55:デフォルトの名無しさん
08/02/29 00:34:33
>>45
int a=0;
a++;

a=1
になるんですよ、クソガキ

56:デフォルトの名無しさん
08/02/29 00:43:03
>>55
そりゃなるだろ

57:デフォルトの名無しさん
08/02/29 02:45:36
物凄い勢いで走るスレッドがあるのですが、
ウェイトは下記のどちらが良いのでしょうか?

// 1
System.Threading.Thread.Sleep(1);
Application.DoEvent();

// 2
Application.DoEvent();
System.Threading.Thread.Sleep(1);


58:デフォルトの名無しさん
08/02/29 02:54:39
1しかあるまい

59:デフォルトの名無しさん
08/02/29 08:10:41
>>57
そのスレッドはUIスレッドなのか?
そうじゃないならプライオリティを下げるのが常套。

60:デフォルトの名無しさん
08/02/29 08:16:15
>>59
くわしく

61:デフォルトの名無しさん
08/02/29 08:24:00
Application.DoEvent()はいらないでしょ。

これはマルチスレッド使えないVB6のDoEventsからから恐らく来てるわけで、
つまりUIスレッドでビジーループで仕事してもUIが無反応にならないように
したい場合に使うわけでしょ。

つまりCドトネトでは普通は使い道はあまりないはずと思うが。

62:デフォルトの名無しさん
08/02/29 11:32:24
Cでいうところの自己参照構造体を実現したいのですが、
どうすればよいでしょうか?

<C>
typedef struct hoge {
long foo;
struct hoge* bar; /* 自己参照 */
} hoge;

→OK


<C#>
struct hoge{
public int foo;
public hoge bar; /* 自己参照 */
}

→エラー。以下メッセージ。
型 'hoge' の構造体メンバ 'hoge.bar'により、
構造体レイアウトで循環参照が発生します

63:デフォルトの名無しさん
08/02/29 11:33:56
参照

64:デフォルトの名無しさん
08/02/29 11:36:01
構造体じゃなくてクラスを使う

65:デフォルトの名無しさん
08/02/29 14:09:49
ListViewの背景をいろいろ描写したいと思って
OnPaintBackgroundを継承したのですが、
背景は描写されましたがアイテムが描写されません。
背景以外は普通に描画したいのですが。

66:65
08/02/29 14:10:33
コード。
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
class ListViewEx : ListView{
public ListViewEx(){
this.OwnerDraw = true;
this.SetStyle(ControlStyles.UserPaint, true);
}
protected override void OnPaintBackground(PaintEventArgs e){
using (LinearGradientBrush lgb = new LinearGradientBrush(this.ClientRectangle, Color.Black, Color.White, LinearGradientMode.Vertical)){
e.Graphics.FillRectangle(lgb, this.ClientRectangle);
}
}

67:65
08/02/29 14:11:04
protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e){
e.DrawDefault = true;
base.OnDrawColumnHeader(e);
}
protected override void OnDrawItem(DrawListViewItemEventArgs e){
e.DrawDefault = true;
base.OnDrawItem(e);
}

protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e){
e.DrawDefault = true;
base.OnDrawSubItem(e);
}
static void Main(){
Form form = new Form();
ListViewEx list = new ListViewEx();
list.Dock = DockStyle.Fill;
list.Items.Add("unko");list.Items.Add("unko");list.Items.Add("unko");
form.Controls.Add(list);
form.ShowDialog();
}
}

68:デフォルトの名無しさん
08/02/29 14:17:49
スレッド4本上で.NET Remotingを使って10MB/100ファイルくらいを
一気に取得するプログラムを作っているのですが、高負荷になると
クライアント側のWindows(2003)が毎回ブルースクリーンになって
しまいます。

クライアントのハードウェアが壊れているのかと思い手持ちの3機種で
試してみたのですが、どれも同じ結果でした。
mouclass.sysなど、毎回違うところで止まっているので原因がサッパリ
わかりません。

69:デフォルトの名無しさん
08/02/29 14:23:36
>>65
OwnerDrawのときは
OnDrawItemやOnDrawSubItemで自前描画しないと駄目よ
base.OnDrawItem等を呼んでもなにもしてくれないよ


70:65
08/02/29 14:35:03
>>69
そうなんだ。
e.DrawBackground()とかすればいいんですね。

となるとDrawDefaultはどういうときに使うんでしょう。
ネットに転がってるサンプルだとOwnerDraw = trueでも
e.DrawDefalt = trueしてそのままになってる。

71:デフォルトの名無しさん
08/02/29 14:40:06
>>68
よくわかんないけど、ブルースクリーンになるのはディバイスドライバの障害だよ
どこかのドライバがバグっている。

72:デフォルトの名無しさん
08/02/29 14:41:30
このListWiewを使うと、グラフィックソフトにレイヤー機能を持たせるのが簡単になりますか?
いまグラフィックソフトを作ってますが、レイヤーごとにGraphicオブジェクトを用意してそこへ描画してるんだけど、
管理が複雑になってしまって。

73:デフォルトの名無しさん
08/02/29 15:02:23
>>72
フォトショップのレイヤーみたいなもの?
もしそれなら、自前で作ったほうが無難な予感がするな。
未来志向ならWPFという手もあるかもしれない、使った事無いけど。(←ぉぃぉぃ)

74:デフォルトの名無しさん
08/02/29 15:04:20
(←ぉぃぉぃ)って何?

75:デフォルトの名無しさん
08/02/29 15:04:53
Paint.NETのソースコードをパクれば

76:デフォルトの名無しさん
08/02/29 15:05:15
自己突っ込みでつ

77:デフォルトの名無しさん
08/02/29 15:15:03
スレリンク(tech板)l50
WPFあんまり流行ってないですね、チュートリアルビデオとかみるとスイスイ完成して気持ち良さそうなんですけど
リファクタリングが対応してくれればもうちょっとは使い勝手もましになりそうですが、次のVSに期待ですね。

78:デフォルトの名無しさん
08/02/29 15:40:50
その辺よりデザイナを色々なんとかしてくれ。XAML養成ギブスとか
言われないぐらいには。

コード書いたら負けかなと思えるぐらいに柔軟なのはわかったから

79:デフォルトの名無しさん
08/02/29 15:45:20
MS「ないものは自分で作ればいいお」

80:デフォルトの名無しさん
08/02/29 15:55:37
listview.Items.Add("text").Name = "";
listview.Items[""].Selected = true;

これだとエラーになるのですね。

81:デフォルトの名無しさん
08/02/29 23:36:22
Visual Studio2005の話なのですが、プロパティを作成すると
フォームのプロパティに表示されるものとされないものがあります。
表示されるものとされないものの違いがよくわからないので教えてもらえないでしょうか


82:デフォルトの名無しさん
08/02/29 23:43:00
プロパティーの前に[BrowsableAttribute(false)]と書く
他にもいろいろあります、リンクの先へどうぞ。
URLリンク(www.microsoft.com)


83:デフォルトの名無しさん
08/03/01 02:14:19
>>82
悩んでいたのは操作方法ではなく追加方法なのですが、自己解決しました。
恥ずかしいことに継承せずにプロパティを追加するだけでプロパティブラウザに追加できると勘違いしておりました。
リンク先の内容を役立てることができそうです。ありがとうございました。

84:デフォルトの名無しさん
08/03/01 17:30:13
C#3.0になってから var キーワードができましたが、ぱっと見た目で型がわからないので、不便なんですが・・・
コーディング中に簡単に型を知る便利なテクニックとかないですかね?

var instance = object.Method() ;
   ↑
   ここにマウスカーソルを置いたら型が分るとかだったら便利なんですけど・・・出ない


85:デフォルトの名無しさん
08/03/01 17:31:05
>>84
VS 使ってるならそれで型分かるよ。

あと、個人的には右辺値から型が分かりにくいときはあんまり var 使いたくないなぁ。

86:デフォルトの名無しさん
08/03/01 17:32:36
>>84
varの上

87:デフォルトの名無しさん
08/03/01 17:39:45
>>86
しまった気付かなかった、そんな所に

88:デフォルトの名無しさん
08/03/01 19:03:19
using System.IO;

DirectoryInfo info = new DirectoryInfo( @"C:\");
info.  ← ここで候補が出てこないのは何故?

89:デフォルトの名無しさん
08/03/01 19:05:08
メソッド内じゃないからじゃね?

90:デフォルトの名無しさん
08/03/01 19:16:14
>>89
お恥ずかしい・・・

91:デフォルトの名無しさん
08/03/01 21:35:46
コンソールでベーマガ風のテキストベースのゲーム作ろうと思ったら
どういうクラス、API使えばいいの?
80x25の配列を用意して適当に着色して■Ωとか配置してキー入力を受け付けられればいいんだけど。

92:デフォルトの名無しさん
08/03/01 21:40:52
Console

93:デフォルトの名無しさん
08/03/01 21:49:38
いい加減静的型言語の悪癖から抜けろよ
varで分からなくなるってどんな変数名つけてんだよ

94:デフォルトの名無しさん
08/03/01 23:07:21
クラスのFieldに番号を付けて、その番号のFieldを呼び出すってことがしたいのですが、
属性を作成してその属性に番号を格納してってことをしてみたところで、
属性の内容からFieldを取得する方法が分からず挫折してしまいました。

なんとかしてFieldを取得する方法はありませんか?

95:デフォルトの名無しさん
08/03/01 23:07:39
>>93
場所によっては分りにくくなることもあるべぇよ、大半問題ないけどね。
ちなみにC#の var は静的な型だよ。
var i = 0 ;
と書いたら
object i = 0 ではなくて int i = 0 だから。

>>91
そりゃもう System.Drawing.Graphics を使って直書きしかないね、
普通に印刷したらプロポーショナルに美しく表示されてしまいますからw
詳しい説明いるかい?
必要なら追記しましょう。

96:デフォルトの名無しさん
08/03/01 23:17:28
>>94
フィールド列挙してそれぞれの属性調べてく

でも属性でやる必要あるの?
インデックスを引数にとるメソッド一つ用意すればよくない?

97:デフォルトの名無しさん
08/03/01 23:20:22
>>94
ちょっと作ってみた
public class MyAttribute : System.Attribute
{
public int IntData { get;set;}
public MyAttribute(int intData) { IntData = intData ; }
};
public class SumpleClass
{
[My(10)]
public int Field = 5 ;
};
void f(){
var tmp = new SumpleClass() ;
var attrs = tmp.GetType().GetField( "Field" ).GetCustomAttributes( false ) ;
for (int i = 0; i < attrs.GetLength(0); ++i)
{
var myattr = attrs[i] as MyAttribute ;
if (myattr == null) continue;
System.Console.WriteLine("{0}", myattr.IntData);
}
}

98:デフォルトの名無しさん
08/03/01 23:25:54
>>96
インデックスですか・・・?
class C
{
  DateTime d1;
  int i1;
  string s1;
  DateTime d2;
}
って感じなのですが、
上から順番にd1には0番の値を、i1には1番の値をって代入していきたいんですよ。
objcet[] data = //データ
for(int i = 0; i < data.Length; i++)
{
  field[i] = data[i];
}
というかんじが理想なんですが・・・
インデックスってのがよくわからないので詳しく教えてもらえませんか?

99:デフォルトの名無しさん
08/03/01 23:30:47
>>98
>>97 の GetField を GetFields にして、あとはアトリビュート検索して、所望のものがあったらそのフィールドに代入してくださいな。
フィールド名から代入方法が分らないなら、また書く。


100:デフォルトの名無しさん
08/03/01 23:31:17
public void SetValue(int index, object value) {
    switch (index) {
        case 0: hoge = (...)value; break;
    }
}
みたいな。つかこれくらいならインデクサでいいか。

101:デフォルトの名無しさん
08/03/01 23:40:26
>>97
すみません、属性の番号がiと一致するものの名前の取得まではできるんですが・・・
どうやってそこに代入するかが難しいです。。。

>>99
すみません、代入方法お願い致します。

>>100
なるほど・・・
でもswitch分が3ケタ超えるのは・・・
そっちのほうが保守やパフォーマンス的にはいいのでしょうか?

102:デフォルトの名無しさん
08/03/01 23:44:32
>>101
ほい、フィールド名を検索してないけどそのへんは適当によろしく

var tmp = new SumpleClass() ;
var attrs = tmp.GetType().GetField( "Field" ).GetCustomAttributes( false ) ;


for (int i = 0; i < attrs.GetLength(0); ++i)
{
var myattr = attrs[i] as MyAttribute ;
if (myattr == null) continue;
System.Console.WriteLine("{0}", myattr.IntData);
System.Console.WriteLine("{0}", tmp.Field);
tmp.GetType().GetField("Field").SetValue(tmp, 100);
System.Console.WriteLine("{0}", tmp.Field);

}


103:デフォルトの名無しさん
08/03/01 23:46:26
>>101
パフォーマンスはswitchの方が圧倒的に高いよ。
やり方しだいじゃありますが・・・

104:デフォルトの名無しさん
08/03/01 23:47:30
フィールド100オーバーなクラスって・・・

105:デフォルトの名無しさん
08/03/01 23:47:54
フィールド名の最後の数字をとってくればいいんだろ

var fields = obj.GetType().GetFields();
var regex = new Regex(@"(\d+)$");
foreach(var field in fields)
{
string numStr = regex.Match(field.Name).Groups[1].Value;

if(field.FieldType == typeof(DateTime))
{
field.SetValue(obj, dateTimeTable[int.Parse(numStr)]);
}
}

こんな感じか?

106:デフォルトの名無しさん
08/03/01 23:49:50
>>104
C#3.0になってから普通に作れそうだけどねwww
匿名クラス楽でいいわ

107:デフォルトの名無しさん
08/03/01 23:57:54
>>102
すみません、よく理解できませんでしたのでswitch文にします。

>>104
>>105
すみません、フィールドの種類・名前は先に与えられていて、
そこはいじれないもので。

108:デフォルトの名無しさん
08/03/02 00:00:03
とりあえず

field.SetValue(instance, value);

探してるのはこれじゃないの?

109:102
08/03/02 00:00:55
>>107
ゆっり憶えればよろしい、まずは今できる方法じゃ

110:デフォルトの名無しさん
08/03/02 00:01:48
100オーバーのフィールドに属性つけてく方が大変だしな

111:102
08/03/02 00:02:42
>>110
100オーバーのスイッチ文とか考えたくも無いけどなwww

112:デフォルトの名無しさん
08/03/02 00:11:25
C c = new C();

FieldInfo[] fields = c.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

for(int i = 0; i < fields.Length; ++i)
{
fields[i].SetValue(c, data[i]);
}

こうだろ

113:デフォルトの名無しさん
08/03/02 00:13:45
>>112
GetFieldsの返す順を信頼できるあなたが素敵☆

114:デフォルトの名無しさん
08/03/02 00:14:41
俺が試した限りではフィールドの宣言順は保持されてたけど
よく知らんな

115:デフォルトの名無しさん
08/03/02 00:15:43
保障されているものじゃないから利用すべきじゃないな

116:デフォルトの名無しさん
08/03/02 00:16:10
まぁ無保証だろうな、変わることもなさそうに思えるけど。

117:デフォルトの名無しさん
08/03/02 00:16:19
で、Releaseビルドで裏切られるとw

118:デフォルトの名無しさん
08/03/02 00:16:54
しかし一個一個属性つけるくらいならswitchも何も使わずに直接代入してった方が早いぞ

119:デフォルトの名無しさん
08/03/02 00:17:42
※このソースをReleaseビルドするのはやめてください

120:デフォルトの名無しさん
08/03/02 00:19:50
>>118
エクセルで一覧作っといて、あとで叩き込むとか結構俺は便利につかってるぞ
せっかくC#がJavaとの差別化として実装した自慢の機能なんだから利用してやらにゃ損

121:デフォルトの名無しさん
08/03/02 00:21:46
>>108
それがわかっただけでも聞いてみたかいがありました。
ありがとうございます。

>>112
案の一つとしてメモっておきます。
ありがとうございます。


他のみなさまも親身な回答をありがとうございました。
また詰まったら頼らせてください。

122:デフォルトの名無しさん
08/03/02 00:22:48
フィールドが100オーバーだろ
ソースコード生成するのが早いか、手作業でやるのが早いか悩むところだな

123:デフォルトの名無しさん
08/03/02 00:26:52
>>122
そこでCodeDOMですよ、自己生成自己コンパイル自己実行www

124:デフォルトの名無しさん
08/03/02 00:29:00
hoge func(out int a, ref int b) {}
というメソッドがあるとします。
引数のa, bのどちらか、または両方省略できるようにしたいです。
そこで
hoge func(out int a) {}
hoge func(ref int b) {}
hoge func() {}
を追加しようとしたのですが、上の2つがrefとoutの違いだけではオーバーロードできません。
こういう場合どういう設計にしたらいいのでしょうか?

125:デフォルトの名無しさん
08/03/02 00:32:05
>>124
hoge funcWithAAndB(out int a, ref int b){}
hoge funcWithA(out int a){}
hoge funcWithB(ref int b){}
hoge func(){}

126:デフォルトの名無しさん
08/03/02 00:35:33
>>125
VBとか、その他で省略能力のある言語との連携があるなら
使う側で対処する
func( out Type.Missing , ref data ) ;
といった感じ、Type.Missingが省略の意味。
C#オンリーなら素直にメソッド分けよう。

127:デフォルトの名無しさん
08/03/02 00:36:30
あっ、いかんこのケースでは使えんかった


128:デフォルトの名無しさん
08/03/02 00:37:31
あっ、いかんこのケースでは使えんかった、は 126 の事。

129:デフォルトの名無しさん
08/03/02 00:42:27
あれ、安価みすっとる 126 のアンカは >>124 ね、

130:デフォルトの名無しさん
08/03/02 00:45:37
class Result
{
public int A;
public hoge hoge;
}

Result func(ref int b)
Result func()

こうかな

131:124
08/03/02 01:00:40
メソッド名変えた方が良さそうですね。
ありがとうございました。

132:102
08/03/02 02:40:42
ためしに完全動作版を作ってみた、パフォーマンス的にも問題ないと思う
using System.Linq ;
public static class FieldIndexer
{
  class LookupTable
  {
    public System.Collections.Generic.Dictionary<int, System.Reflection.FieldInfo> mapIndexToField;
    public LookupTable( System.Type type )
    {
      mapIndexToField = new System.Collections.Generic.Dictionary<int, System.Reflection.FieldInfo>();
      foreach (var fieldInfo in type.GetFields())
      {
        var customAttributes = fieldInfo.GetCustomAttributes(true).OfType<FieldIndexerAttribute>();
        var count = customAttributes.Count();
        if (count == 0) continue;
        if (count != 1) throw new System.Exception("FieldIndexerAttributeが二つ以上ついているフィールドを発見");
        var index = customAttributes.First().Index;
        mapIndexToField.Add(index, fieldInfo);
      }
    }
  }
  static object syncRoot = new object() ;
  static System.Collections.Generic.Dictionary<Type, LookupTable> tables = new Dictionary<Type, LookupTable>();

133:102
08/03/02 02:41:25
  static LookupTable GetLookupTable( System.Type type )
  {
    if (!tables.ContainsKey(type))
    {
      lock (syncRoot)
      {
        if (!tables.ContainsKey(type))
        {
          var tmp = new LookupTable( type );
          tables.Add(type, tmp);
          return tmp;
        }
      }
    }
    return tables[type];
  }


134:102
08/03/02 02:42:00
  public static object GetValue(object dataClass, int index)
  {
    try
    {
      return GetLookupTable(dataClass.GetType()).mapIndexToField[index].GetValue(dataClass);
    }
    catch (System.Collections.Generic.KeyNotFoundException)
    {
      throw new System.Exception("指定のインデックスの設定されたフィールドが存在しなかった");
    }
  }
  public static void SetValue(object dataClass, int index, object value)
  {
    try
    {
      GetLookupTable(dataClass.GetType()).mapIndexToField[index].SetValue(dataClass, value);
    }
    catch (System.Collections.Generic.KeyNotFoundException)
    {
      throw new System.Exception("指定のインデックスの設定されたフィールドが存在しなかった");
    }
  }
}

135:102
08/03/02 02:43:17
public class FieldIndexerAttribute : System.Attribute
{
  public int Index { get;set;}
  public FieldIndexerAttribute(int index) { Index = index; }
};
ここまでで、ライブラリ化する。

136:102
08/03/02 02:44:11
使用例
public class SampleClass
{
  [FieldIndexer(10)]
  public int FieldA;
  [FieldIndexer(20)]
  public string FieldB;
};
void SampleProgram()
{
  var tmp = new SampleClass();
  tmp.FieldA = 10;
  tmp.FieldB = "ABC";

  System.Console.WriteLine("{0}", FieldIndexer.GetValue(tmp, 10));
  System.Console.WriteLine("{0}", FieldIndexer.GetValue(tmp, 20));

  FieldIndexer.SetValue(tmp, 10,1234);
  FieldIndexer.SetValue(tmp, 20,"XYZ");

  System.Console.WriteLine("{0}", tmp.FieldA);
  System.Console.WriteLine("{0}", tmp.FieldB);
}

137:デフォルトの名無しさん
08/03/02 10:37:00
プロジェクトフォルダを見てみたらコンパイルの中間ファイルのようなものが見あたりません
コンパイルの度にプロジェクトに含まれる全ての.csをコンパイルしているのでしょうか?
それともどこか別の場所に置いてあるのでしょうか?

プロジェクトが大きくなってきてコンパイル時間が気になり始めたので
もし全てリコンパイルしているならdllに分割しようかと思っています。

138:デフォルトの名無しさん
08/03/02 10:40:51
中間ファイルなんて基本存在しない
ので適切にDLLに分ける

139:デフォルトの名無しさん
08/03/02 10:41:43
Generic使えばもっとシンプルになりそうだな。
ディクショナリじゃなくて配列で十分そうだな。
あとほんとはハンドルだけ保持しとくほうがいいかもな。



140:デフォルトの名無しさん
08/03/02 10:55:10
中間ファイルはどっかにあるだろ
知らんけど
dll分けると余計に時間がかかる
しかし設計としてはどんどん分けた方がいい
依存関係が強制されinternalが有効に使える

141:デフォルトの名無しさん
08/03/02 11:03:27
>>139
おっと、インデックスが好きに付けられるなら配列はやっぱまずいか…


142:デフォルトの名無しさん
08/03/02 11:09:12
>>102さん
ありがとうございます。
ぜひ使わせていただきます。

143:デフォルトの名無しさん
08/03/02 11:15:31
>>140
ソースファイルには無い リソースやxamlにはあるけど
/obj/xxxにも直接アセンブリが作られる
もちろんソースその他に変更の無いアセンブリはコンパイル対象にならない

144:デフォルトの名無しさん
08/03/02 12:13:00
全部をコンパイルしなおすなんてそんな馬鹿なことをするわけがないだろう
中間ファイルが見当たらないことからそんな結論が導かれるわけがない

145:デフォルトの名無しさん
08/03/02 13:21:12
>>107
>>105のやつは

dataを

foreach(object obj in data)
{
if(obj is DateTime)
{
dateTimeTable.Add((DateTime)obj);
}
if(obj is int)
{
intTable.Add((int)obj);
}
...
}
とやっていって、フィールド名の最後の数字を取得して、
field.SetValue(instance, dateTimeTable[num - 1]);

こうやっていけばきっちり出来るんじゃないかという話だ
フィールドはいじらなくていい

146:デフォルトの名無しさん
08/03/02 13:32:28
構造体にまとめといてunsafeでbyte[]から無理矢理代入すればいいんじゃね

147:デフォルトの名無しさん
08/03/02 13:49:11
C#ってなんでビットフィールドないの?

148:デフォルトの名無しさん
08/03/02 13:50:44
BitArrayで我慢してください
つかいらんだろあんなの

149:デフォルトの名無しさん
08/03/02 13:52:22
あとBitVector32

150:デフォルトの名無しさん
08/03/02 13:54:50
ビットフィールドと共用体便利だったのになー

151:デフォルトの名無しさん
08/03/02 13:58:27
>>147 >>150
プロセッサ非依存の.NETでは避けた方がいい、ビッグエンディアンで大変な事態に陥るから。
安易な実装事故の元

152:デフォルトの名無しさん
08/03/02 14:00:40
初心者なんですが実際のソフトウェア開発なんかでビット単位で何かを扱うなんてことあるんですか?
どんな場合に使うかちょっと想像できないでいます

153:デフォルトの名無しさん
08/03/02 14:05:02
>>152
いろいろある、データ圧縮では定番のテクニックの一つ

154:152
08/03/02 14:06:40
データ圧縮ですか…ということは限定的なソフトウェアに限る、のかな

155:デフォルトの名無しさん
08/03/02 14:07:10
アーカイバならC#で作らんだろう

156:デフォルトの名無しさん
08/03/02 14:08:59
>>155
#ZipLibを馬鹿にしたな!?

157:デフォルトの名無しさん
08/03/02 14:13:48
DGCAが気になってる最近

158:デフォルトの名無しさん
08/03/02 14:14:17
でも、MSIL上でビット単位の処理できても嬉しくないよね
消費リソースを抑えたいなら、結局はそこだけnativeにする形になるし

159:デフォルトの名無しさん
08/03/02 14:14:48
>>152
ネットワークプログラミングやバイナリファイルの読み込みではビットオーダーに気をつけないといけないね。

160:デフォルトの名無しさん
08/03/02 14:15:43
自分で作ったクラスライブラリのファイルを複数のプロジェクトで利用する事は出来ないのでしょうか?。
プロジェクト毎にコピーされるのではなく1つのクラスライブラリファイルを複数のプロジェクトで共有したい。

161:デフォルトの名無しさん
08/03/02 14:17:42
>>158
環境非依存ビットストリームライブラリは欲しいと思うけど、なおnativeは今後の事を考えると問題を引き起こす可能性が高いから止めるべき。
そもそもCom相互運用では処理速度が低下してかえって良くない状態に陥る。

162:デフォルトの名無しさん
08/03/02 14:19:27
>>160
普通にできるよ、追加のところのメニューをくまなく探す

163:デフォルトの名無しさん
08/03/02 14:25:39
>>160
聞く前に検索くらいしろよ。一発で出てきたぞ
URLリンク(www.atmarkit.co.jp)

164:デフォルトの名無しさん
08/03/02 14:37:00
>>162-163
ありがとうございます。追加ボタンの横にある矢印に気付きませんでした。

165:デフォルトの名無しさん
08/03/02 14:37:05
まあ、新興の言語だとビットフィールドを採用しない傾向にあるからね。
intrinsicなビット操作命令は持ってたりするけど。

166:デフォルトの名無しさん
08/03/02 15:03:15
自作板のAHCIスレから来ました。

「iata75_cd.exeに-a -aって起動オプションをつけて走らせる。」
って言われたんですが、-a -aって起動オプションをつけて
走らせるにはどうしたらいいですか?

何か書き換えるためのプログラムが必要なんでしょうか。

167:デフォルトの名無しさん
08/03/02 15:06:54
スレ違いだコマンドラインでググれ低能

168:デフォルトの名無しさん
08/03/02 15:08:17
>>152
GUIの設定(ラジオボタン)とかはよくビットでデータ持つよ

169:デフォルトの名無しさん
08/03/02 15:09:57
>>168
あー、チェックが入ってるか否かを0と1でって感じでしょうか?
bool型とかにしてもそんな問題ない気はするけど実際はそういう話でもないのかな

170:デフォルトの名無しさん
08/03/02 15:13:18
>>169
boolで一つ一つ持つよりも、ビットでまとめて
マスク処理とかした方が分岐させやすい

171:デフォルトの名無しさん
08/03/02 15:16:14
>>167
コマンドラインですか><
了解しますた。

172:デフォルトの名無しさん
08/03/02 15:33:45
iata75_cd.exeでぐぐるとあら不思議w

173:デフォルトの名無しさん
08/03/02 15:34:23
盛大なマルチだな

174:102
08/03/03 01:48:41
>>142
結構便利なので自分でも使い始めたのですが・・・
ダブルチェックドロックングの処理にバグを発見してしまいました、使うならこちらを使って下さい。
前出のコードではマルチスレッドで過負荷をかけると、Dictionary が壊れます。

>>139 氏の意見も取り入れて、ジェネリックにしてみました、実は当初も考えたのですが、
C++のように static 関数からジェネリックなシングルトンとなるオブジェクトを作り出す方法が思いつかなくて、
とりあえず object で実装していましたが、やり方を発見したので実装してみました。
ハッシュテーブルが一つになってさらに高速化したと思われます、またその過程でマルチスレッドバグも取れました。
あと、ハンドルの意味分りません、>>139 氏、説明お願いできますか?

さらに高速化するなら、LINQ のようにアクセス部分をコンパイルして switch 文にしまうか……
それは今後の課題にでもしておきます。
使い方は変わりません。

public class FieldIndexerAttribute : System.Attribute
{
  public int Index { get;set;}
  public FieldIndexerAttribute(int index) { Index = index; }
};

175:102
08/03/03 01:49:31
public static class FieldIndexer
{
  class LookupTable<TSource>
  {
    public static LookupTable<TSource> Instance = new LookupTable<TSource>();
    public System.Collections.Generic.Dictionary<int, System.Reflection.FieldInfo> mapIndexToField;
    public LookupTable()
    {
      mapIndexToField = new System.Collections.Generic.Dictionary<int, System.Reflection.FieldInfo>();
      foreach (var fieldInfo in typeof(TSource).GetFields())
      {
        var customAttributes = fieldInfo.GetCustomAttributes(true).OfType<FieldIndexerAttribute>();
        var count = customAttributes.Count();
        if (count == 0) continue;
        if (count != 1) throw new System.Exception("FieldIndexerAttributeが二つ以上ついているフィールドを発見");
        int key = customAttributes.First().Index;
        if (mapIndexToField.ContainsKey(key)) throw new System.Exception("同じ値の FieldIndexerAttribute ついているフィールドを発見");
        mapIndexToField.Add(key, fieldInfo);
      }
    }
  }

176:102
08/03/03 01:50:11
  public static object GetValue<TDataClass>(TDataClass obj, int index)
  {
    try
    {
      return LookupTable<TDataClass>.Instance.mapIndexToField[index].GetValue(obj);
    }
    catch (System.Collections.Generic.KeyNotFoundException)
    {
      throw new System.Exception("指定のインデックスの設定されたフィールドが存在しなかった");
    }
  }
  public static void SetValue<TDataClass>(TDataClass obj, int index, object value)
  {
    try
    {
      LookupTable<TDataClass>.Instance.mapIndexToField[index].SetValue(obj, value);
    }
    catch (System.Collections.Generic.KeyNotFoundException)
    {
      throw new System.Exception("指定のインデックスの設定されたフィールドが存在しなかった");
    }
  }
}

177:デフォルトの名無しさん
08/03/03 07:10:05
マルチスレッド云々ならば性的コンストラクタ使えばいいじゃん

178:デフォルトの名無しさん
08/03/03 10:24:34
>>170
どんな手順か教えてちょ

179:デフォルトの名無しさん
08/03/03 11:35:54
C#ってswitch文でbreakかかなくてもだーっと全部実行されないの?

180:デフォルトの名無しさん
08/03/03 11:43:27
関数ポインタ使えないだけですごい構文崩れるなぁ

181:デフォルトの名無しさん
08/03/03 11:53:38
>>179
そもそもコンパイルエラー

182:デフォルトの名無しさん
08/03/03 11:53:55
>>179
フォールスルーしたいなら明示的にgoto
caseラベル間が空白でない場合は、break/return/gotoが必要

183:デフォルトの名無しさん
08/03/03 12:55:03
>>178
>>170じゃないけど、たとえば
class MyClass
{
public int X, Y, Z;
public string Str1, Str2, Str3;
public bool flag1, flag2, flag3;
}

class Program
{
static MyClass[] tmp = new MyClass[] {//何か入ってる };
static void Main()
{
foreach (MyClass item in tmp)
{
if (item.flag1)
{
//処理
}
}
}
}
フラグを読んで色々処理を変えたいようなクラスを作ったとする。
運用上、格納するフラグを増やす必要が出てきたときにどうする?
MyClassをライブラリとして作成するような場合、そのライブラリの回収が必要になってくる。
もしフラグ自体をboolじゃなくて例えばintで持っていたとすると、
1ビットに1フラグを割り当てておけばよいから、32種類のフラグを格納できる。
上の例だと、フラグが3つあるということは残り29ビットは予備の領域として確保できる。
運用を変えるだけでフラグを簡単に増やせるようであれば、ライブラリ化してあるMyClassの回収の必要がないので便利。



184:デフォルトの名無しさん
08/03/03 13:11:02
>>178
あとは本題のマスク処理というのは、多分こういうことだと思う。

class MyClass
{
public int X, Y, Z;
public string Str1, Str2, Str3;
public int flag; //ビット単位でフラグを格納
public bool flag1, flag2, flag3, flag4; //全てboolで格納
}

フラグ1と3と4が立っている場合の条件分岐を考える。
boolで各フラグを格納しているクラスを使う場合、
bool f = flag1 && flag3 && flag4;

一方、intで格納しているクラスを使う場合、
int ff = 1 + 4 + 8; //それぞれflag1,flag3,flag4を表す
bool f = (flag & ff) == ff

また、全てのフラグをリセット(false)にしたいときなんかは、
flag1 = false;
flag2 = false;
flag3 = false;
flag4 = false;

intでフラグを格納してあれば当然、
flag = 0;
これだけで済む。

MyClassの中身が複雑になればなるほど、こういう手法は効果的になる。



185:デフォルトの名無しさん
08/03/03 13:12:48
おまえら、そんなにC#でビットマスク使いたいなら、すなおに System.FlagsAttribute を適用した enum 使えゴラー
URLリンク(msdn2.microsoft.com)(VS.80).aspx


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4313日前に更新/241 KB
担当:undef