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
186:デフォルトの名無しさん
08/03/03 13:38:10
>>184
なんで148?
187:デフォルトの名無しさん
08/03/03 13:44:28
LINQのある今、ビット操作類もここに統合すると便利かもしれないな
bitvector.All() 指定のビットすべてについて true なら true
bitvector.Any() 指定のビットのなかに true なものがあれば true
はるかに柔軟性があるし。
188:デフォルトの名無しさん
08/03/03 13:45:06
そんくらい自分で
189:デフォルトの名無しさん
08/03/03 13:49:22
>>186
2進数だろカス
190:デフォルトの名無しさん
08/03/03 14:03:49
>>187
BitArrayならOfType<bool>通せば可能だよ
列挙体やBitVectorにも拡張メソッド付けて
flag.ToEnumerable().Anyとかできるようにしたら面白いかもね
191:デフォルトの名無しさん
08/03/03 16:43:20
ひとつのクラスで何行以上はよろしくないみたいなのはありますか?
192:デフォルトの名無しさん
08/03/03 16:48:08
>>191
ない
193:デフォルトの名無しさん
08/03/03 16:56:34
なるほど、ないんですかー
今色々試してみてるところで、ちょこっと場当たり的に作ってみたのですが
1つのクラスは2000行ほどなのに対してもうひとつが200行弱ほどで、その2つのみなのでどうも不自然に感じていたようです
194:デフォルトの名無しさん
08/03/03 17:02:30
あんまり長いのは常識的によろしくないから気になるんだったら切ればいい
195:デフォルトの名無しさん
08/03/03 17:05:43
切るっていうのはpartialってことではないですよね
主要処理部分のswitchが厄介だしここを別クラスにすべきっぽいかな…
ありがとうございました
196:102
08/03/03 17:20:58
適当に長そうなところを、マウスでにるにるっと選択して
右クリック→リファクタ→メソッドの抽出
ってやればいいんだよ
197:デフォルトの名無しさん
08/03/03 17:22:20
その機能はしってるんだけれども抽出してどうするんだろう
198:デフォルトの名無しさん
08/03/03 17:24:04
最近namespaceを
namespace ソリューション名.Properties
にしているんですが
namespace ソリューション名
と違いはあるんでしょうか、普通にやると下になってそれがデフォルトのようですが
199:102
08/03/03 17:25:39
>>198
こらー、何処にいれちょるかー
そこは、アプリケーションプロパティーの居るべき場所じゃー
200:デフォルトの名無しさん
08/03/03 17:26:27
まあ名前空間はほんとにただの名前だからどうでもいいといえばどうでもいい
201:198
08/03/03 17:30:31
最初はソリューション名だけだったけどなぜか途中から切り替えました
たしかコードか何か新規項目を追加したときかな
で、今戻したらエラーが、Propertiesでいいや
202:デフォルトの名無しさん
08/03/03 20:22:54
Enum.GetValuesで得られる値の配列と,
Enum.GetNamesで得られる名前の配列の
要素の順番の対応は保障されてるの?
203:デフォルトの名無しさん
08/03/03 20:38:06
されてるって書かれてなかったっけ?
204:デフォルトの名無しさん
08/03/03 21:43:45
されないよ
同値異名が可能なことを考えれば明らか
205:デフォルトの名無しさん
08/03/03 21:48:21
>>203
謎の日本語だけれど、期待するなと書かれているように受け止められますな
> 解説
>戻り値の配列の要素は列挙定数の値に基づいて並べ替えられます。同じ値を持つ列挙定数がある場合、対応する名前の順序は指定されていません。
206:デフォルトの名無しさん
08/03/03 22:07:43
保障も何もどういう順序づけしていいかわかんないだろ
207:デフォルトの名無しさん
08/03/03 22:51:40
enum Hoge
{
A = 4,
B = 3
}
こんなん書けたよな
208:デフォルトの名無しさん
08/03/03 22:54:56
泉あつの?
209:デフォルトの名無しさん
08/03/03 22:56:46
>>207
書けるんじゃね
続いてCだけを定義すると自動的に4になる
210:デフォルトの名無しさん
08/03/03 23:08:46
すいません
C#でExcelへの書き込みを行ってるのですが、
URLリンク(jeanne.wankuma.com)
このソースコードでExcelの解放が出来たのですが、書き込みをする為に
xlSheet.Cells[1, 2] = "テスト";
この上記の一行を入れたら解放されなくなりました。
何が原因なのでしょうか??
もしくは上記以外でExcelに書き込んで保存する方法はあるのでしょうか?
211:デフォルトの名無しさん
08/03/03 23:11:11
210です!
問題解決しました!!!!!
212:デフォルトの名無しさん
08/03/03 23:11:35
CellsもCOMオブジェクト返すんじゃなかったっけ
213:デフォルトの名無しさん
08/03/03 23:22:51
>>211
どう解決したか書けっつーのカス
書けないなら最初から2chで質問すんな
214:デフォルトの名無しさん
08/03/03 23:23:49
211です。
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet.Cells);
これを入れたら、なんか解放したりしなかったり・・・
VSの問題???
215:デフォルトの名無しさん
08/03/03 23:24:27
さんざん既出な気がするが回答忘れた
216:デフォルトの名無しさん
08/03/03 23:25:39
211です
// Excel を起動しファイルを読み込む
// ※ Excel ファイルのパスは適宜修正してください
Excel.Application app = new Excel.Application();
Excel._Workbook wb = app.Workbooks.Open(
@"C:\test\test.xls",
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing
);
wb.Application.Visible = false;
// 人口のデータを配列に読み込む
Excel._Worksheet ws = (Excel.Worksheet)wb.ActiveSheet;
ws.Cells[5, 5] = "テスト";
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws.Cells);
// ファイルをセーブし、Excel を終了する
wb.Save();
app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
これでは解放しない??
217:デフォルトの名無しさん
08/03/03 23:35:33
もう、GC.Collect(); GC.WaitForPendingFinalizers();でいいよ
218:デフォルトの名無しさん
08/03/03 23:41:22
なんで同じロジックで解放したりしなかったりするんだろうか・・・
219:デフォルトの名無しさん
08/03/03 23:46:45
たとえば、
app.Workbooks.Open
ここで、Workbooksが漏れる
wb.Application.Visible = false;
ここでApplicationが漏れる
220:デフォルトの名無しさん
08/03/03 23:52:36
>>219
ありがとう、なんか現象として、cellに入れる値を変えてリビルドすると
解放されるんだけど、すぐにもう一回すると解放されない・・・みたいな
221:デフォルトの名無しさん
08/03/03 23:54:55
220です
すいません。
リビルドでなくデバックです^^;
222:デフォルトの名無しさん
08/03/03 23:56:03
ws.Cells[5, 5] = "テスト";
を分解すると
a1 = ws.Cells
a2 = a1[5, 5]
a2.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, "テスト");
でa2の開放がもれている。
223:デフォルトの名無しさん
08/03/04 00:00:02
>>222
すいません。
a1,a2はなんの変数でしょうか?
224:デフォルトの名無しさん
08/03/04 00:00:21
a1も漏れる気がするけど?
225:デフォルトの名無しさん
08/03/04 00:01:27
a1はRangeでa2もRange。
226:デフォルトの名無しさん
08/03/04 00:12:15
>>202
・各要素は列挙定数でソートされる
・列挙定数が同値の要素の順序は不定
Enumとしてはともかく、値だけ見れば対応していると言えるな
列挙定数が同値というのは要するに別名だし
とりあえず、(type)Enum.Parse(type,names[i])==values[i]は真
>>224
開放されてるように見えるが?
念のために補足しておくと、>>216でws.Cells[5,5]も解放しろって話だろ
227:デフォルトの名無しさん
08/03/04 00:21:58
解放はされるようになったが、今度は上書きされなくなった orz
// 1000 ミリ秒 (1秒) 待機する
System.Threading.Thread.Sleep(1000);
xlRange.set_Item(3, 5, "テスト");
System.Threading.Thread.Sleep(1000);
xlBook.Save();
Rangeにはset_Itemしかなく、何か参照が足りないのでしょうか??
Excel.XlRangeValueDataTypeを書いてもエラーが出ます。
228:デフォルトの名無しさん
08/03/04 00:33:15
COMラッパの開放漏れをなくすのには限度があるから、諦めれ
229:デフォルトの名無しさん
08/03/04 00:33:27
ws.Cellsと言った時点でリファレンスカウントが1進むんじゃないの?
だからReleaseComObject(ws.Cells)は、増やして減らして意味ない
文かなーと思ったけど
230:デフォルトの名無しさん
08/03/04 00:35:44
>>229
RCWの参照とCOMの参照カウンタは別。
RCW、つまりマネージ参照をいくらコピーしてもCOMの参照カウンタは増えない。
231:デフォルトの名無しさん
08/03/04 00:38:41
ReleaseComObject(ws.Cells)
は新しいCOMオブジェクトを取ってきてそれを開放するから意味がないだろ。
232:デフォルトの名無しさん
08/03/04 00:39:39
ws.Cellsは同じオブジェクトを返してくれるの?
ExcelのCOMを経由して、あたらしいオブジェクトが2つ、3つとできるんでなくて?
233:デフォルトの名無しさん
08/03/04 00:41:12
URLリンク(jeanne.wankuma.com)
ネスト深すぎテラワロス
234:デフォルトの名無しさん
08/03/04 00:45:36
ExcelのCOMインターフェイスはExcelマクロ(VBAやそれに準じるDLLなど)のための機能で
外部の独立したプロセスからExcelを操作することを意図して作られていない。
VSTOもそういう設計思想。
235:デフォルトの名無しさん
08/03/04 00:50:06
というより単に.NETとCOMの相性が悪い点が見事に現れただけではないの?
236:デフォルトの名無しさん
08/03/04 00:54:02
デストラクタでReleaseComObjectするラッパ被せてusing使うと大分ましにはなるけど、それでも汚いな
237:デフォルトの名無しさん
08/03/04 00:55:07
Office.Netマダー?
238:デフォルトの名無しさん
08/03/04 00:59:00
ふつーのGCみたいに消極追跡(使われていないかを調査)じゃなくて
積極追跡(Excel.Applicationから生み出されたRCWすべてのweakrefリストとか)して
まとめてあぼーん、みたいにはできないものかね?
まあ、COM一般を対象にするならイマイチつかえない、Office用途な使い方になるけど。
239:デフォルトの名無しさん
08/03/04 01:05:53
タイプライブラリから生成されるアセンブリに手を加えれば出来ると思うよ。
240:デフォルトの名無しさん
08/03/04 02:41:38
こんなコード書くくらいならGCにやってもらう方を選ぶね
241:デフォルトの名無しさん
08/03/04 07:36:08
Comが入り込む場合は、出来る限り開放したら、あとはガベージコレクタを無難なタイミングで起動して解放するほうがいいような気がします。
自分はなんとなく全部書ききってしまってますけど・・・
242:デフォルトの名無しさん
08/03/04 07:38:03
↓
243:デフォルトの名無しさん
08/03/04 08:26:26
なあに?
244:デフォルトの名無しさん
08/03/04 08:30:22
>>174
フィールドハンドルを保持しといて、必要になった時点で
フィールドインフォを取得するやり方のこと。
まあ必ずしもやる必要はないし、
単純な速度的にはやらない方が有利だけどね。
245:デフォルトの名無しさん
08/03/04 09:19:35
XmlSerializerを使った場合、BinaryFormatterでの[OnDeserialized()]に相当する機能はないのでしょうか?
TreeNode.Parentのように、
あるオブジェクトAの内部で持っているオブジェクトBでオブジェクトAをプロパティParentで持っているのですが、
これを復帰させる方法に悩んでいます。
そのままだと循環参照でエラーになってしまうのでParentには[XmlIgnore]をつけてあります。
Deserialize()したあとに再セット用のメソッドを動かせば済むのですが、
オブジェクトAはList<>の中で持っているのでループを回す必要があることもあって、
あまり美しくないのでできれば避けたいのですが、何かいい方法はないのでしょうか?
246:デフォルトの名無しさん
08/03/04 09:34:44
webbrowserコントロールで navigateを同期的に行う方法ってないですかね?
webbrowser.Navigate(url); してDocumentCompletedイベントでDocument拾うと、
コードが分離されてわかりにくいし、遷移先のページごとにあれこれ処理変えたい
場合、複数のイベントハンドラメソッドを定義して イベントにアタッチ、デタッチを
繰り返さないといけないので、ロジックがスパゲッティになっちまうんですが…。
webbrowser.Navigate(url)
while(webbrowser.IsBusy)
{
}
でループ回しても、Documentが読み込まれていないタイミングのこともあるんで
いまいち信用ならないんですが、IsBusyプロパティ以外になんか判定タイミング
ってあるんでしょうか?
247:デフォルトの名無しさん
08/03/04 10:01:56
.NETの機能を色々試してみようと思い、身近そうなFileやDirectory関係を使ってみていて疑問に思ったことがあります
foreach (string file in Directory.GetFiles(dir))
{
try
{
File.Copy(file, destpath, true);
}
catch
{
continue;
}
}
以上のように、複数ファイルをforループで回してコピーや削除を行っています
そこで、エラーは表示しなくていいのでコピーや削除でエラーが出たら飛ばしたいなと思い
コピーまたは削除処理にをtryで囲み、catchしてcontinueするという風にしています。
まず、コピーや削除が失敗することがあるのか(File.Copy、File.Delete等)
次に、私が上記で示したようにtryで処理を囲みcatchでcontinueするような処理が一般的なのかどうか
次に、出した例ではstringで処理していますがFileInfoなどを利用してみてもいます。
FileInfoを使うことで、他の質問にある答えが変わる場合それも教えて頂きたいです。
最後に、trycatchで処理部分を囲んでいるとして、それをループしています(そこがおそらく一番時間かかる主要処理)
その際、処理速度の低下などは気にするほどあるのでしょうか?
以上です、よろしくお願いします
248:デフォルトの名無しさん
08/03/04 10:22:16
>>246
>遷移先のページごとにあれこれ処理変えたい場合、
>複数のイベントハンドラメソッドを定義して イベントにアタッチ、デタッチを
>繰り返さないといけない
が理解できないが
イベントハンドラ内で分岐すりゃいいだけじゃね?
IsBusyループはあほかって感じ
>>247
>まず、コピーや削除が失敗することがあるのか
当たり前だが、ある。
>tryで処理を囲みcatchでcontinueするような処理が一般的なのか
エラー処理でどんな処理をしたいかによる
一般にcatchで握りつぶすのはよくないが、ファイル操作のときは
仕方ないときもある
>FileInfoを使うことで...
同じ。Fileの静的メソッドは内部でFileInfo使ってる
>trycatchの処理速度の低下
tryはコスト高くない。catchが発生した場合は高コスト
ディスクIOの方が重いだろうけど
249:デフォルトの名無しさん
08/03/04 10:24:58
>>247
> まず、コピーや削除が失敗することがあるのか(File.Copy、File.Delete等)
ありますね。destpathが無効だったり、アクセス許可が無かったり、ファイルがロックされていたり
destpathが既に存在したりしていれば失敗します。
> 次に、私が上記で示したようにtryで処理を囲みcatchでcontinueするような処理が一般的なのかどうか
この例でcontinueがいるとは思えないですが…。。。
> 次に、出した例ではstringで処理していますがFileInfoなどを利用してみてもいます。
> FileInfoを使うことで、他の質問にある答えが変わる場合それも教えて頂きたいです。
同じだと思います。
> 最後に、trycatchで処理部分を囲んでいるとして、それをループしています(そこがおそらく一番時間かかる主要処理)
> その際、処理速度の低下などは気にするほどあるのでしょうか?
try-catchでも例外が起きない限り、ほとんどコストはかからないと思います。
逆にコストが問題になるほどしょっちゅう例外が起きるなら、ロジックを見直すべきだと
思います。
ファイルがらみの例外は種々雑多なので例外処理のコストを嫌ってすべて条件判定
で処理しようとしても、労多く益は少ないと思いますが。
250:デフォルトの名無しさん
08/03/04 10:35:19
>>248
二つや三つの場合分けならいいんですが、たとえば
Aページでフォームに自動記入してBページに飛んで、そこでなんか情報取って
さらにCページへ飛んで、サーバ側やクライアントスクリプト、activeXコンポーネント等で自動
ジャンプさせたのを判定して…Dページでまたフォームを記入して………
などと一連の動作を自動化することを考えると、条件分岐が異常に深くなってしまって、
それはそれでものすごく読みにくいんですわ。
素直にwebclientで同期的にダウンロードしてHTML独自に解析しろって言われそうですが、
ページでスクリプトやらactiveXコンポーネント使っているとお手上げなもんで、どうしても
DOM操作して人間の動作をエミュレートしたいときがあるもんで…。
251:デフォルトの名無しさん
08/03/04 11:14:03
>>250
よくわからんけど、
abstract class Base {
public abstract void やること();
}
class 処理A : Base{
public override void やること() {
.....
}
}
class 処理B : Base{
public override void やること() {
.....
}
}
みたいにそれぞれの処理用のクラスを定義して、
Navigateする前に該当する処理クラスのオブジェクトを作って、
private Base 今の処理
みたいに保持しておいて
DocumentCompletedで
今の処理.やること()
みたいにすればすっきりするんじゃね?
252:247
08/03/04 11:15:49
>>248
>>249
ありがとうございます。
trycatchはコストが低いということが聞けて安心しました
もし、以下の処理だけならcatch{}だけでよかったですね、反省
foreach (string file in Directory.GetFiles(dir))
{
try
{
File.Copy(file, destpath, true);
}
catch
{
continue;
}
}
253:デフォルトの名無しさん
08/03/04 11:16:16
明示的にcatch{}ってしなくていんじゃないの、その例なら
254:デフォルトの名無しさん
08/03/04 11:26:18
catch{}はしなきゃだめだっての
continueはいらんっちゃいらんけど
255:デフォルトの名無しさん
08/03/04 11:28:46
まあcontinueって書いてても悪くないと思うけどな
256:デフォルトの名無しさん
08/03/04 11:36:53
MSDNに書いてある例外くらいは事前にチェックして発生させないようにしとくべきだろ
キャッチはどっちみち必要だけど
257:デフォルトの名無しさん
08/03/04 11:48:31
ある程度の事前チェックは必要だと思うけど、どうせ中でチェックして起きた例外をcatchするんだから、
事前に全部チェックしてたら二重になって遅くなりそうだし面倒くさいから俺はやらねえ。
258:デフォルトの名無しさん
08/03/04 14:39:24
>>255
ここではたまたまcontinueがループの最後にきてるから良いけど
continueは後無視してループの頭に戻っちゃうから、場合によっちゃまずくないですか?
259:デフォルトの名無しさん
08/03/04 14:39:47
先物チャートと検証ソフトを作りたいのですが、
C#のフォームとグラフィックを扱った書籍を教えていただけないでしょうか?
MDIでの開発の仕方が載っているものがあると助かります。
以前はDelphiを数年バリバリに使っておりましたので、
プログラミング初心者というわけではありません。
260:デフォルトの名無しさん
08/03/04 14:40:14
> C#のフォームとグラフィックを扱った書籍を教えていただけないでしょうか?
C#のフォームとグラフィックを扱った書籍のお勧めを教えていただけないでしょうか?
261:デフォルトの名無しさん
08/03/04 14:43:07
>>251
えっと 出していただいた例を今ひとつ理解し切れていない自分ですが、
たとえば、wb_documentcompletedでdocumentを取得して
その中のformをinvokemenber("submit")したりすると、次にやるべき処理の
クラス(baseの子クラス)を設定する場面が無いと思うんですが…。
wb.Navigateを呼び出したルーチンには戻らないでそのまま再びdocumentcompletedに
とんでっちゃうわけで…。
262:102
08/03/04 18:54:07
>>244
すみません、後学のために教えていただけますでしょうか、フィールドハンドルって何ですか?
知らない知識がまだまだあるみたいです……
263:デフォルトの名無しさん
08/03/04 18:56:19
>>258
なんでそういう解釈されたか意味不明
264:デフォルトの名無しさん
08/03/04 18:59:05
>>263
ちゃんとレス辿ってないだけでしょ、彼が
265:デフォルトの名無しさん
08/03/04 21:30:42
すみません、プログラミング自体の経験は過去にDelphiを少し触って挫折したような者です。
しかし、ひとつ作ってみたいプログラムのアイディアが浮かんだので、
これからC#で作ろうかと思っているのですが、なかなか指針すら立ちません。
どのような設計をすればよいのかアドバイスをお願いいたします。
何を作るのかというと、睡眠日誌というものがあるのですが・・・↓
URLリンク(www.kaimin.info)
これを実現するようなアプリを作りたいのです。どうすればよいでしょうか?
266:デフォルトの名無しさん
08/03/04 21:42:03
睡眠障害のある俺にぴったりじゃないか。
作るかな。
ネタ提供サンクス。
267:デフォルトの名無しさん
08/03/04 22:00:08
>>265
まず書いて動かすこと
動かせる範囲のものを書くこと
はじめからちゃんとしたものを作ろうとしないで一部分だけでいいからちゃんと動かす
うまく行かなくなったら何度も書き直す
それがうまくやるコツ
268:265
08/03/04 22:02:27
>>266
なんとありがたい!
あまり突っ込むとスレ違いになりますが、私自身過眠症で必要に迫られてのことで。ぜひともお願いいたします。
後学のため、よろしければどのような感じで作るかの指針をお教えいただけませんでしょうか?
269:265
08/03/04 22:06:56
>>267
なるほど。一度イメージするUIを紙に書いて、
自分なりにどの部位からコード化していけそうか考えてみます。
アドバイスありがとうございます。
270:デフォルトの名無しさん
08/03/04 22:37:48
>>264
いや、逆にcontinue書かなきゃいけない理由が知りたいですけど
271:デフォルトの名無しさん
08/03/04 22:44:54
>>270
むしろ後に何か書き加える場合にcontinueがないとぶっ壊れるだろ
形としてはここにcontinueがあるべきで、今必要ないからといって
削除しなきゃならないというものでもない
272:デフォルトの名無しさん
08/03/04 22:46:10
public bool IsMarked(object obj)
{
// この部分
}
上記のコメント部のなかで、
引数のobjが宣言時に特定の属性をつけられたかどうかを判別する方法はありますか?
たとえば
[Marked()]object a;
void Test()
{
if(IsMarked(a))
{
Console.WriteLine("True");
}
}
みたいなことができれば満足です。
詳しい方がたくさんおられるようなので、宜しくお願い致します。
273:デフォルトの名無しさん
08/03/04 22:47:45
過眠症なんて病気があるんだw
なんか最近の医者って新しい病気作るのに必死だよな。
274:デフォルトの名無しさん
08/03/04 22:48:30
>>272
それは属性の使い方が間違ってる
275:デフォルトの名無しさん
08/03/04 22:59:11
属性はインスタンスには付かないぜ
276:デフォルトの名無しさん
08/03/04 23:11:27
>>274
>>275
ありがとうございます。
納得しました。
277:デフォルトの名無しさん
08/03/05 00:28:15
>>271
> むしろ後に何か書き加える場合にcontinueがないとぶっ壊れるだろ
追加実装の場合は、単なるコーディングミスだろ・・・
> 形としてはここにcontinueがあるべきで
ないべき。
使用しない、意味の無いコードは書いてあっても利益にならない。
なんで使わない変数とかが警告出るか考えろよ。
278:デフォルトの名無しさん
08/03/05 00:29:56
じゃあifの中が一行しかないのに{}でくくってあったら消すのか?
279:デフォルトの名無しさん
08/03/05 00:35:35
>>278
ちゃんとレス読んでから書け、読んでてそれなら半年ROMれ。
>>247だとfor文の最終行にcontinueつけてんのと同じ事。
280:デフォルトの名無しさん
08/03/05 00:44:46
>>279
同じことだろうが
実行結果に関わらない、単に無駄なだけのコードだ
それに意味があると考えるか考えないかはお前の主観でしかない
ifを{}にいれておくのが望ましいといわれるのは、そこに何か追加することがあるからだ
あのコードは下に追加される可能性が大いにある
その意味ではあのcontinueには意味がある
elseがいらなくてもelseと書いた方が分かりやすいこともある
ケースバイケースだ
それはそれとしてC#ではfor文の最後にcontinueを書かなきゃならなくなることもよくあるぞ
281:デフォルトの名無しさん
08/03/05 00:47:14
>それはそれとしてC#ではfor文の最後にcontinueを書かなきゃならなくなることもよくあるぞ
いいえ
282:デフォルトの名無しさん
08/03/05 00:48:41
静的コンストラクタが呼ばれるのは
>最初のインスタンスが作成される前、または静的メンバが参照される前
と書いてありますが、複数スレッドから同時にアクセスした場合でも正常に動作するのでしょうか?
283:デフォルトの名無しさん
08/03/05 00:49:32
gotoのラベルがfor文の最後に来る場合、ラベルの下にcontinueを書く必要がある
なんでそうなってるのかといえばラベルがforの最後にあるより、その下にcontinueがあったほうが
意味がはっきりするからだろう
284:デフォルトの名無しさん
08/03/05 00:52:24
>>280
bool flg = false;
if (flg) {
} else {
・・・
}
こんなコード書いちゃう人?
285:デフォルトの名無しさん
08/03/05 00:54:13
>>284
それはわかりにくいだろう
if(flg == false)
と俺は書くな
286:デフォルトの名無しさん
08/03/05 01:11:51
俺なら
if ( ! flg ) {
//・・・
}
って書くぜ。
っていうかたまに flg == false とか flg == true って書き方みるけど変じゃね?
287:デフォルトの名無しさん
08/03/05 01:18:00
if(flg == false)は
普通に左から読んでいけば
もしフラグがfalseならば、
と読める
!flgは頭の中で変換しなきゃならない
flgがよっぽど何のことか分からない名前でなければ==trueとも書かないな
しかし変数名がflgだったら==trueと書くかもしれない
288:デフォルトの名無しさん
08/03/05 01:32:30
!flg程度で頭動かさなきゃならんのは駄目だろ
289:デフォルトの名無しさん
08/03/05 02:21:11
>>271
ちょっとだんだん意味わかんなくなってきたんですけど、
もしかしてcontinueの意味取り違えてません?
あとに何か書き加えたときにcontinueあったら、「後に書き加えた何か」
無視して、次の反復処理に制御を移動されちゃうと思うんですが…。
break→以下無視して反復処理抜ける
continue→以下無視して 次の反復処理へ移動
だと思ってましたが、違いましたっけ?
290:デフォルトの名無しさん
08/03/05 02:30:41
>>289
何を言っているのか分からないが
後に書き加えた何かは、例外で失敗した後には実行されないものだ
そしてそれはtryブロックの後ろに配置されるべきものだ
全部をtryで囲んで全てをキャッチするというのは悪いコーディングだ
291:デフォルトの名無しさん
08/03/05 02:32:26
>>289
もう相手すんな
292:デフォルトの名無しさん
08/03/05 02:48:52
>>283
}の直前など、対応するコードの無い部分にラベル付けられないからだろ
どうしてもラベル付けたいなら、普通は空ステートメントを書く
>>284-288
if(flg == true)と書くやつは、何故if((flg == true) == true)あるいは
if((((flg == true) == true) == true) == true)と書かないのか
という指摘を見たことがあるな
293:デフォルトの名無しさん
08/03/05 03:00:03
>>292
空ステートメントなんていう異様なものを書くよりは、continueの方がずっと分かりやすいだろう
ちなみにCにはこんな制限はない。C#にわざわざ加えられたものだ。
おそらくcontinueと書かせるためだろう
>f(flg == true)と書くやつは、何故if((flg == true) == true)あるいは
>if((((flg == true) == true) == true) == true)と書かないのか
意味が伝わりにくくなるからだな
プログラムにとって大事なのは意味が伝わりやすいことであり
文の量が最小になることではない
294:デフォルトの名無しさん
08/03/05 03:01:10
>>290
例外で失敗した後には実行されないものはtryブロックの中に入れるべきで
>全部をtryで囲んで全てをキャッチするというのは悪いコーディングだ
とは全然無関係ですよ。
295:デフォルトの名無しさん
08/03/05 03:02:52
flgっつう名前が悪いだろ
bool isHogehoge
なら
if( isHogehoge )
と書いても違和感はない
296:デフォルトの名無しさん
08/03/05 03:09:48
>>294
それでは例外で失敗しなかった後に実行された文で起こった例外まで無差別にキャッチする
それはバグを握りつぶしてしまう
よくないコーディングだ
297:デフォルトの名無しさん
08/03/05 03:35:54
continue より flg の話が気になるな
まず flg という名前が論外で、if ... の ... に配置して意味が通るような名前を付けて、flg==true だの flg==false だのは今すぐ止めるべきと思うな
それが「プログラムにとって大事なのは意味が伝わりやすいこと」になるんだと思うよ。
298:293
08/03/05 03:39:42
>>297
全く同感だ
299:デフォルトの名無しさん
08/03/05 03:40:54
>プログラムにとって大事なのは意味が伝わりやすいことであり
>文の量が最小になることではない
まったくもって同感だが、ロジックの複雑さは最小にすべきだ。
300:292
08/03/05 04:36:35
>>293
continueを書くかどうかは好みの問題だから議論する気はないが、
「continueと書かせるため」というのは誤解を招くので
ラベルの後にステートメントが必須なのはC++からで、
一応、仕様ではlabeled statementということになっている
単にラベル単独では存在し得ないというだけのこと
301:デフォルトの名無しさん
08/03/05 04:40:14
>>283
ラベルは命令文の前に書く必要がある。命令文は空文でも良い。
for ( .. ) {
....
label_1: ;
}
でOK。
302:デフォルトの名無しさん
08/03/05 06:47:59
DataGridViewでのコンテキストメニューの抑制ができなくて困っています。
自作のコンテキストメニューではなく、標準というかShell(?)のコンテキストメニューです。
DataGridViewTextBoxColumn、DataGridViewTextBoxCellでセル選択後に
カーソルがあたった状態で編集可能になったときに
右クリックすると、このコンテキストメニューが出るのを抑えたいのです。
通常のTextBoxでは
TextBoxのContextMenuStripに、空のContextMenuStripを設定するなり
新しいContextMenuStripのインスタンスを(newする)設定するなりすれば
抑制できるとことまでは判明して、実行できているのですが
DataGridViewの場合に、同様の制御をするための実装方法がわからないのです。
ご存知の方、お教えください。
303:デフォルトの名無しさん
08/03/05 06:48:34
ifでの条件文の書き方についてのノウハウはCとC#で違うから混同すると議論が噛み合わない。
C++には論理型があるがCとの互換のために穴だらけだから結局Cと同じになる。
一方C#のifには条件文しかかけないし、論理型は単独で条件文たりえる。
304:デフォルトの名無しさん
08/03/05 07:05:06
>>302
EditingControlShowing とか
305:デフォルトの名無しさん
08/03/05 07:49:18
文字列をデータとしてファイルに保存してあとで読み込みたいと思っています。
文字列の構成は、9つの行と、行数不定の項目です。
その構成を一つのかたまりとしてたくさん扱いたいのですが、どうしたらいいんでしょうか?
306:デフォルトの名無しさん
08/03/05 08:23:00
C#というのはどういった場面で使われるんでしょうか?Windows環境で動くソフトウェア全般だとは思うのですが
実際本職の方達はC/C++ベースで作ってそうですし
いまいちピンとこないです
307:デフォルトの名無しさん
08/03/05 08:31:32
>>305
CSVでもXmlSerializeでもいいんじゃないかと。
>>306
ASP.NETとか?
308:デフォルトの名無しさん
08/03/05 08:49:49
>>297
flgの話は 命名法の問題は同意 その先 ==trueとするかどうかは趣味の問題。
>>296
continue書かないなら正解。
continueなんてせっかくの例外処理の構造化をわざわざ壊すようなもんをどうしても
書きたいなら不正解だろ。
309:デフォルトの名無しさん
08/03/05 09:40:47
>>262
RuntimeFieldHandle
フィールドを一意に識別出来るハンドル。
識別という意味では、FieldInfoに1対1で対応している。
RuntimeFieldHandleとFieldInfoは相互に取り出すことが出来る。
FieldInfoなどのオブジェクトはサイズが大きいため、
常に使い続ける必要がないものはRuntimeFieldHandleで保持しておき、
実際に必要になった時点でRuntimeFieldHandleからFieldInfoを取得する。
こうするとFieldInfoがGC対象となり、頻繁に使われないものはメモリを占有しなくなる。
310:デフォルトの名無しさん
08/03/05 10:25:56
>>306
いやいや、中小企業で使ってる業務システムには、VisualBasicが多いよ
Cで組んだシステムの方が珍しい。
大企業みたく開発費をかけたくないし、開発期間も短くしたいし、保守性を容易にしたいし、
負荷も少ないしリアルタイム性も求められない用途は多いから。
C#はVisualBasicよりいいし、そういう方面にも使われる
311:デフォルトの名無しさん
08/03/05 10:34:38
>>307
>>310
なるほど…
来年度から就職でして、使うのかなぁといった感じで質問しました。
C/C++をやりつつC#に手出してて最近はWinAPI関連の本買って手出し始めたので
ちょっと気になりました、ありがとう
312:デフォルトの名無しさん
08/03/05 10:35:48
どんな分野?それによるからなぁ、逆に低級言語ばっか使うとこもあるし
313:デフォルトの名無しさん
08/03/05 10:38:04
>>312
そこら辺が明確に教えてもらえてなくって(使う言語とか)
一応エンジニア業と営業のそれを両方出来る人材を…って感じで募集されてて
会社自体は自動車会社のシステム部門です
314:デフォルトの名無しさん
08/03/05 10:39:17
お前らそういう話大好きだな
315:デフォルトの名無しさん
08/03/05 10:53:19
>>313
だったら、営業の顧客管理表をC#でちゃちゃっと作ったり
(たいてい、個人が自分の机のPCでエクセルでちまちまやってるから、
活用するときに面倒だったり、顧客表の流出する可能性があったり、
各営業間で共有が出来てなかったり等々。システムを作れば、
顧客の誕生日一週間前にポップアップさせてみたり、
車検前や12ヶ月点検前にポップアップさせてみたり、いろんな活用も出来る)。
また、営業所とエンジニア部門とをLANで結んだ連絡システムを作ったりにも使えるだろ。
stand-aloneなシステムを手早く作るのにも、
離れた部門をLAN経由で結んだシステムにも、C#は向いているし。
316:デフォルトの名無しさん
08/03/05 11:02:40
文字列に指定の引用符を付けたり(Quote)、外したりする(Dequote)メソッドはないでしょうか?
317:デフォルトの名無しさん
08/03/05 11:11:46
>>316
ごめ質問が理解できないので具体例をあげて
>>313
続けたいならあとはマ板でたのむ
318:デフォルトの名無しさん
08/03/05 11:24:17
>>316です。
ええと。例えば、文字列ABCにダブルクォート"の引用符を付けると、
"ABC"、文字列DE"Fに付けると、"をエスケープ?して、"DE""F"にする
ようなメソッドです。Dequoteはその逆の操作です。
319:デフォルトの名無しさん
08/03/05 11:25:02
class = new class();
このclassに後から変数を追加するなんて暴挙はできないでしょうか?。
320:デフォルトの名無しさん
08/03/05 11:33:26
>>318
それくらい自分で作れば
>>319
無理
classのオブジェクトをキーにしたDictionary使うとか
321:デフォルトの名無しさん
08/03/05 11:57:01
初めまして。
C# 2008 Expressを使ってます。
OpenFileDialogで、画像を選択した際にdialogのウィンドーにプレビュー画像を表示したいのですが、
いったいどうすればいいのでしょうか。
322:デフォルトの名無しさん
08/03/05 12:00:53
>>304
ありがと。
それでなんとかなりそうです。
323:デフォルトの名無しさん
08/03/05 12:03:02
ボタンにUACのシールドアイコンを付加しようとしているのですが、
VS2005なので SystemIcons.Shieldが利用できません。
なので、APIから行おうとしたのですが、
internal class WinAPI
{
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
extern public static IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wp, IntPtr lp);
}
~
WinAPI.SendMessage(Target.Handle, (UInt32)0x160c, IntPtr.Zero, (IntPtr)1);
としてもシールドアイコンが表示されません。
何か間違ってるのでしょうか?
324:321
08/03/05 12:05:32
追加でごめんなさい。
↑の件ですが、「縮小版」ではなく、クリックしたときにパッと表示してほしいんです。
あと、openFileDialogには大きさのプロパティがありませんが、
実行時にはマウスでドラッグして大きさが変えられますよね。
プログラム上で自動で変更できるんでしょうか。
325:デフォルトの名無しさん
08/03/05 13:10:17
>>307
ありがとうございます。
XmlSerializeでなんとか出来そうです。
326:デフォルトの名無しさん
08/03/05 13:29:52
>>321>>324
つまり、OpenFileDialogを拡張したいということだろ
結論から言うと、Win32API使わないと無理
cf. URLリンク(msdn2.microsoft.com)
327:デフォルトの名無しさん
08/03/05 13:34:58
試しに>>174をDynamicMethodでif…else if…相当のコードを生成して
毎回リフレクションを使わないようにしてみたら10倍くらい速くなった
もっと速くなると思ったんだけどなあ
328:321
08/03/05 13:43:14
>>326
ありがとうございます。
敷居が高そうですね・・。もう少し慣れてから挑戦してみます。
329:デフォルトの名無しさん
08/03/05 14:59:10
>>327
if else は、フィールドの数が増えると遅くなるんじゃねえの、使うならswitchだろ。
330:デフォルトの名無しさん
08/03/05 15:19:44
どっちもJITコンパイルされれば同じだと思うのだが
331:デフォルトの名無しさん
08/03/05 15:45:36
switchは遅くならないのかよっ
332:デフォルトの名無しさん
08/03/05 15:50:58
>>331
若干最適化は効きやすいとされる。
333:デフォルトの名無しさん
08/03/05 16:13:40
>>330-332
おまいら今すぐC言語のスレで、コンピュータの基礎を勉強しやがれ
334:デフォルトの名無しさん
08/03/05 16:27:33
この場合アセンブラだろ
お前も基礎を勉強しやがれ
335:デフォルトの名無しさん
08/03/05 16:29:17
>>334
違うだろ、テーブルルックアップ式 goto label の勉強だ
336:デフォルトの名無しさん
08/03/05 16:29:20
>>327
FieldIndexerAttributeにAttributeUsage(Attribute)付けるといいかもと思った
あと、>>139の言ってるのは多分FieldInfo.FieldHandle/GetFieldFromHandleの事
>>329-332
以下、MSIL生成する言語に限った話しなのでそのように
疑問があれば逆アセンブル(ildasm.exe)してみればいい
判定するのが連続した整数値じゃないときはswitchもif~elseも大差ない
比較部分は同じで処理部分がサブルーチンかスパゲッティかって感じ
連続した整数値があれば(一部でも可)switchではその部分がまとめられる
MSILから先は分からないが、多分ジャンプ先を数値的に計算してるんだと思う
337:デフォルトの名無しさん
08/03/05 16:34:21
switchを逆アセンブルしてみると、if,elseとgo,labelの組み合わせだよ
338:デフォルトの名無しさん
08/03/05 16:39:46
値が連続したところは>>336の言うように纏められるよ
あれ手でやるのは面倒
339:デフォルトの名無しさん
08/03/05 16:49:22
class A
{
// ildasm.exe
static void Main( string [] arg )
{
System.Console.WriteLine( arg[0] ) ;
switch( (int)arg[0][0] )
{
case 0 : System.Console.WriteLine( 'A' ) ; break ;
case 1 : System.Console.WriteLine( 'B' ) ; break ;
case 2 : System.Console.WriteLine( 'C' ) ; break ;
}
}
}
340:デフォルトの名無しさん
08/03/05 16:50:36
.method private hidebysig static void Main(string[] arg) cil managed
{
.entrypoint
// コード サイズ 66 (0x42)
.maxstack 3
.locals init (int32 V_0)
IL_0000: ldarg.0
IL_0001: ldc.i4.0
IL_0002: ldelem.ref
IL_0003: call void [mscorlib]System.Console::WriteLine(string)
IL_0008: ldarg.0
IL_0009: ldc.i4.0
IL_000a: ldelem.ref
IL_000b: ldc.i4.0
IL_000c: callvirt instance char [mscorlib]System.String::get_Chars(int32)
IL_0011: stloc.0
IL_0012: ldloc.0
IL_0013: switch (
IL_0026,
IL_002f,
IL_0038)
IL_0024: br.s IL_0041
341:デフォルトの名無しさん
08/03/05 16:51:27
IL_0024: br.s IL_0041
IL_0026: ldc.i4.s 65
IL_0028: call void [mscorlib]System.Console::WriteLine(char)
IL_002d: br.s IL_0041
IL_002f: ldc.i4.s 66
IL_0031: call void [mscorlib]System.Console::WriteLine(char)
IL_0036: br.s IL_0041
IL_0038: ldc.i4.s 67
IL_003a: call void [mscorlib]System.Console::WriteLine(char)
IL_003f: br.s IL_0041
IL_0041: ret
} // end of method A::Main
このスレは息を吸うようにウソをつく奴が居るので注意が必要だ
342:デフォルトの名無しさん
08/03/05 16:55:09
まあ、間違いもあるだろうからそんなわざわざ相手逆なでするような言い方する必要はないと思うけど。
結局、IL レベルで switch 命令ありで、
JIT 時に if-else 式かテーブルルックアップ式かで最適な方選択ってこと?
343:デフォルトの名無しさん
08/03/05 16:57:31
間違いっつーか、これプログラマなら常識だろ?
344:デフォルトの名無しさん
08/03/05 17:04:55
自分の常識を人に押し付けるもんじゃないけど、
その常識ってのは、
MSIL が switch 命令を持ってるってのの方か、
一般に switch はルックアップテーブル使って高速化可能って話の方か、どっち?
345:デフォルトの名無しさん
08/03/05 17:07:01
そんな複雑な事は聞かないし、普通に学校で教えてもらえるだろ、switchの使い方。
346:デフォルトの名無しさん
08/03/05 17:15:14
CILのswitch命令はJavaバイトコードでいうところのtableswitch命令相当かな。
Javaバイトコードにはもう1つlookupswitchって命令もあって、CILにはこれに相当するものがない。
これがないせいでgotoだらけのコードができることもあるかもね。
あと、C#のswitch caseには文字列を突っ込むこともできて、このときはもはやswitch命令は関係なくなる。
MSのC#コンパイラは、分岐数増えてきたらDictionary<string,int>を裏で作るって実装になってたかと。
347:346
08/03/05 17:21:07
>このときはもはやswitch命令は関係なくなる。
すまん、これは言い過ぎか。
Dictionary<string,int>を使って無理矢理switch命令用のインデックスを作り出す。
が正しい。
348:デフォルトの名無しさん
08/03/05 17:26:34
今、色々 IL Disasm して遊んでみてるけど、switch のコンパイル結果、そんな単純でもなさそう。
case が 0 で始まる連続な整数 → IL switch 命令
非 0 から始まっての連続 → sub してから switch 命令
完全に不連続 → beq とか brtrue の連続(= if-else と変わらない)
だった。
349:デフォルトの名無しさん
08/03/05 17:29:51
あと、例えば、
switch(x) {
case 0: xxx; break;
case 4: xxx; break;
case 6: xxx; break;
case 9: xxx; break;
}
みたいなのは、0 のところだけ beq、
それから 4引いてから switch 命令、
その後さらに switch 後の default 句内で case 9 の判定するような妙なコードに。
ラベルが不連続でも、値の近い整数ならある程度最適化かけてるっぽい。
350:デフォルトの名無しさん
08/03/05 17:30:38
コンパイラの出力にあわせてチューンはすべきじゃないよ
高速化したいなら、コンパイラにキチンと意図の伝わる形でコードすべき
前から準にシーケンシャルに比較をする事を伝えたいなら if else if で
一括比較したいなら switch で、将来のJITのチューンにあやかれるようにね。
351:デフォルトの名無しさん
08/03/05 17:33:02
Cのswitchの実装は処理系依存だろ。常識って何だよ。
352:デフォルトの名無しさん
08/03/05 17:34:24
>>351
常識っていうのは、プログラマ間で意思疎通をするのに最低限必要な知識だよ
353:デフォルトの名無しさん
08/03/05 17:37:29
>>349
まあswitch命令がそういう仕様なんだから仕方ないよなぁ。
ここの議論とか参考になるかも。
URLリンク(www.atdot.net)
URLリンク(www.atdot.net)
354:デフォルトの名無しさん
08/03/05 17:38:13
>常識っていうのは、プログラマ間で意思疎通をするのに最低限必要な知識
これはどこに書いてありますか?
355:デフォルトの名無しさん
08/03/05 17:39:29
>>350
それは同意。
まあ、ただ、単なる興味本位で、IL の switch 命令に関して。
Java の tableswitch, lookupswitch とはどっちとも違うかも。
単に、スタックの先頭を見て、その値をインデックスにしてジャンプするだけっぽい。
ldloc.1
switch (0x10, 0x20, 0x30)
なら、ローカル変数1の値が 0 なら 0x10 に、1 なら 0x20 にジャンプってだけ。
switch をブランチの羅列にするか、引き算/テーブル参照+switch 命令にするかは
結局コンパイラ次第ね。
356:デフォルトの名無しさん
08/03/05 18:19:16
こういう議論て、ふらっとスレで行われることが多いのはなんで?
357:デフォルトの名無しさん
08/03/05 18:49:10
前からずっみみてきたが、誰か約一名、ウソを本当のように自信たっぷり書くアンポンタンが居ついているんだよ
コイツ以前マ板にもマルチレスで同僚がswitch文を使って if をごまかしたとか書きまくっていた奴じゃねぇかな
こういうキチガイはいっぺん地獄へ落ちればいいんだよ
358:デフォルトの名無しさん
08/03/05 18:54:31
>>356
一旦的外れな方向に話が行った方が議論が盛り上がるからとか?
>>357
そういう発言はキチガイをよりいっそう近づけるから、
キチガイがいやなら逆に抑えた方がいいよ。
359:デフォルトの名無しさん
08/03/05 20:11:27
paintイベントを発生させるにはRefresh()だったりを使ってイベントを発生させるけど、
任意のイベントを発生させるにはどうすればいいんでしょうか?
たとえば、textbox1でKeyPressが発生した時に、そのキーがエンターキーだった場合、
button1.Clickを発生させるときなどです。