1 名前:デフォルトの名無しさん [2008/02/27(水) 18:24:40 ] このスレッドは 「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。 ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、 勇気をもって書き込んでください。 内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。 前スレ ふらっとC#,C♯,C#(初心者用) Part24 pc11.2ch.net/test/read.cgi/tech/1202028267/
152 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:00:40 ] 初心者なんですが実際のソフトウェア開発なんかでビット単位で何かを扱うなんてことあるんですか? どんな場合に使うかちょっと想像できないでいます
153 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:05:02 ] >>152 いろいろある、データ圧縮では定番のテクニックの一つ
154 名前:152 mailto:sage [2008/03/02(日) 14:06:40 ] データ圧縮ですか…ということは限定的なソフトウェアに限る、のかな
155 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:07:10 ] アーカイバならC#で作らんだろう
156 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:08:59 ] >>155 #ZipLibを馬鹿にしたな!?
157 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:13:48 ] DGCAが気になってる最近
158 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:14:17 ] でも、MSIL上でビット単位の処理できても嬉しくないよね 消費リソースを抑えたいなら、結局はそこだけnativeにする形になるし
159 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:14:48 ] >>152 ネットワークプログラミングやバイナリファイルの読み込みではビットオーダーに気をつけないといけないね。
160 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:15:43 ] 自分で作ったクラスライブラリのファイルを複数のプロジェクトで利用する事は出来ないのでしょうか?。 プロジェクト毎にコピーされるのではなく1つのクラスライブラリファイルを複数のプロジェクトで共有したい。
161 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:17:42 ] >>158 環境非依存ビットストリームライブラリは欲しいと思うけど、なおnativeは今後の事を考えると問題を引き起こす可能性が高いから止めるべき。 そもそもCom相互運用では処理速度が低下してかえって良くない状態に陥る。
162 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:19:27 ] >>160 普通にできるよ、追加のところのメニューをくまなく探す
163 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:25:39 ] >>160 聞く前に検索くらいしろよ。一発で出てきたぞ ttp://www.atmarkit.co.jp/fdotnet/dotnettips/596vssharelinkfile/vssharelinkfile.html
164 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:37:00 ] >>162-163 ありがとうございます。追加ボタンの横にある矢印に気付きませんでした。
165 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 14:37:05 ] まあ、新興の言語だとビットフィールドを採用しない傾向にあるからね。 intrinsicなビット操作命令は持ってたりするけど。
166 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:03:15 ] 自作板のAHCIスレから来ました。 「iata75_cd.exeに-a -aって起動オプションをつけて走らせる。」 って言われたんですが、-a -aって起動オプションをつけて 走らせるにはどうしたらいいですか? 何か書き換えるためのプログラムが必要なんでしょうか。
167 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:06:54 ] スレ違いだコマンドラインでググれ低能
168 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:08:17 ] >>152 GUIの設定(ラジオボタン)とかはよくビットでデータ持つよ
169 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:09:57 ] >>168 あー、チェックが入ってるか否かを0と1でって感じでしょうか? bool型とかにしてもそんな問題ない気はするけど実際はそういう話でもないのかな
170 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:13:18 ] >>169 boolで一つ一つ持つよりも、ビットでまとめて マスク処理とかした方が分岐させやすい
171 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:16:14 ] >>167 コマンドラインですか>< 了解しますた。
172 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:33:45 ] iata75_cd.exeでぐぐるとあら不思議w
173 名前:デフォルトの名無しさん mailto:sage [2008/03/02(日) 15:34:23 ] 盛大なマルチだな
174 名前:102 [2008/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 [2008/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 [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 07:10:05 ] マルチスレッド云々ならば性的コンストラクタ使えばいいじゃん
178 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 10:24:34 ] >>170 どんな手順か教えてちょ
179 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 11:35:54 ] C#ってswitch文でbreakかかなくてもだーっと全部実行されないの?
180 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 11:43:27 ] 関数ポインタ使えないだけですごい構文崩れるなぁ
181 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 11:53:38 ] >>179 そもそもコンパイルエラー
182 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 11:53:55 ] >>179 フォールスルーしたいなら明示的にgoto caseラベル間が空白でない場合は、break/return/gotoが必要
183 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 13:12:48 ] おまえら、そんなにC#でビットマスク使いたいなら、すなおに System.FlagsAttribute を適用した enum 使えゴラー msdn2.microsoft.com/ja-jp/library/sbbt4032 (VS.80).aspx
186 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 13:38:10 ] >>184 なんで148?
187 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 13:44:28 ] LINQのある今、ビット操作類もここに統合すると便利かもしれないな bitvector.All() 指定のビットすべてについて true なら true bitvector.Any() 指定のビットのなかに true なものがあれば true はるかに柔軟性があるし。
188 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 13:45:06 ] そんくらい自分で
189 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 13:49:22 ] >>186 2進数だろカス
190 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 14:03:49 ] >>187 BitArrayならOfType<bool>通せば可能だよ 列挙体やBitVectorにも拡張メソッド付けて flag.ToEnumerable().Anyとかできるようにしたら面白いかもね
191 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 16:43:20 ] ひとつのクラスで何行以上はよろしくないみたいなのはありますか?
192 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 16:48:08 ] >>191 ない
193 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 16:56:34 ] なるほど、ないんですかー 今色々試してみてるところで、ちょこっと場当たり的に作ってみたのですが 1つのクラスは2000行ほどなのに対してもうひとつが200行弱ほどで、その2つのみなのでどうも不自然に感じていたようです
194 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 17:02:30 ] あんまり長いのは常識的によろしくないから気になるんだったら切ればいい
195 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 17:05:43 ] 切るっていうのはpartialってことではないですよね 主要処理部分のswitchが厄介だしここを別クラスにすべきっぽいかな… ありがとうございました
196 名前:102 [2008/03/03(月) 17:20:58 ] 適当に長そうなところを、マウスでにるにるっと選択して 右クリック→リファクタ→メソッドの抽出 ってやればいいんだよ
197 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 17:22:20 ] その機能はしってるんだけれども抽出してどうするんだろう
198 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 17:24:04 ] 最近namespaceを namespace ソリューション名.Properties にしているんですが namespace ソリューション名 と違いはあるんでしょうか、普通にやると下になってそれがデフォルトのようですが
199 名前:102 [2008/03/03(月) 17:25:39 ] >>198 こらー、何処にいれちょるかー そこは、アプリケーションプロパティーの居るべき場所じゃー
200 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 17:26:27 ] まあ名前空間はほんとにただの名前だからどうでもいいといえばどうでもいい
201 名前:198 mailto:sage [2008/03/03(月) 17:30:31 ] 最初はソリューション名だけだったけどなぜか途中から切り替えました たしかコードか何か新規項目を追加したときかな で、今戻したらエラーが、Propertiesでいいや
202 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 20:22:54 ] Enum.GetValuesで得られる値の配列と, Enum.GetNamesで得られる名前の配列の 要素の順番の対応は保障されてるの?
203 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 20:38:06 ] されてるって書かれてなかったっけ?
204 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:43:45 ] されないよ 同値異名が可能なことを考えれば明らか
205 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 21:48:21 ] >>203 謎の日本語だけれど、期待するなと書かれているように受け止められますな > 解説 >戻り値の配列の要素は列挙定数の値に基づいて並べ替えられます。同じ値を持つ列挙定数がある場合、対応する名前の順序は指定されていません。
206 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:07:43 ] 保障も何もどういう順序づけしていいかわかんないだろ
207 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:51:40 ] enum Hoge { A = 4, B = 3 } こんなん書けたよな
208 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 22:54:56 ] 泉あつの?
209 名前:デフォルトの名無しさん [2008/03/03(月) 22:56:46 ] >>207 書けるんじゃね 続いてCだけを定義すると自動的に4になる
210 名前:デフォルトの名無しさん [2008/03/03(月) 23:08:46 ] すいません C#でExcelへの書き込みを行ってるのですが、 jeanne.wankuma.com/tips/programing/releasecom.html このソースコードでExcelの解放が出来たのですが、書き込みをする為に xlSheet.Cells[1, 2] = "テスト"; この上記の一行を入れたら解放されなくなりました。 何が原因なのでしょうか?? もしくは上記以外でExcelに書き込んで保存する方法はあるのでしょうか?
211 名前:デフォルトの名無しさん [2008/03/03(月) 23:11:11 ] 210です! 問題解決しました!!!!!
212 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 23:11:35 ] CellsもCOMオブジェクト返すんじゃなかったっけ
213 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 23:22:51 ] >>211 どう解決したか書けっつーのカス 書けないなら最初から2chで質問すんな
214 名前:デフォルトの名無しさん [2008/03/03(月) 23:23:49 ] 211です。 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet.Cells); これを入れたら、なんか解放したりしなかったり・・・ VSの問題???
215 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 23:24:27 ] さんざん既出な気がするが回答忘れた
216 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 23:35:33 ] もう、GC.Collect(); GC.WaitForPendingFinalizers();でいいよ
218 名前:デフォルトの名無しさん [2008/03/03(月) 23:41:22 ] なんで同じロジックで解放したりしなかったりするんだろうか・・・
219 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 23:46:45 ] たとえば、 app.Workbooks.Open ここで、Workbooksが漏れる wb.Application.Visible = false; ここでApplicationが漏れる
220 名前:デフォルトの名無しさん [2008/03/03(月) 23:52:36 ] >>219 ありがとう、なんか現象として、cellに入れる値を変えてリビルドすると 解放されるんだけど、すぐにもう一回すると解放されない・・・みたいな
221 名前:デフォルトの名無しさん [2008/03/03(月) 23:54:55 ] 220です すいません。 リビルドでなくデバックです^^;
222 名前:デフォルトの名無しさん mailto:sage [2008/03/03(月) 23:56:03 ] ws.Cells[5, 5] = "テスト"; を分解すると a1 = ws.Cells a2 = a1[5, 5] a2.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, "テスト"); でa2の開放がもれている。
223 名前:デフォルトの名無しさん [2008/03/04(火) 00:00:02 ] >>222 すいません。 a1,a2はなんの変数でしょうか?
224 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:00:21 ] a1も漏れる気がするけど?
225 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:01:27 ] a1はRangeでa2もRange。
226 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:12:15 ] >>202 ・各要素は列挙定数でソートされる ・列挙定数が同値の要素の順序は不定 Enumとしてはともかく、値だけ見れば対応していると言えるな 列挙定数が同値というのは要するに別名だし とりあえず、(type)Enum.Parse(type,names[i])==values[i]は真 >>224 開放されてるように見えるが? 念のために補足しておくと、>>216 でws.Cells[5,5]も解放しろって話だろ
227 名前:デフォルトの名無しさん [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:33:15 ] COMラッパの開放漏れをなくすのには限度があるから、諦めれ
229 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:33:27 ] ws.Cellsと言った時点でリファレンスカウントが1進むんじゃないの? だからReleaseComObject(ws.Cells)は、増やして減らして意味ない 文かなーと思ったけど
230 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:35:44 ] >>229 RCWの参照とCOMの参照カウンタは別。 RCW、つまりマネージ参照をいくらコピーしてもCOMの参照カウンタは増えない。
231 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:38:41 ] ReleaseComObject(ws.Cells) は新しいCOMオブジェクトを取ってきてそれを開放するから意味がないだろ。
232 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:39:39 ] ws.Cellsは同じオブジェクトを返してくれるの? ExcelのCOMを経由して、あたらしいオブジェクトが2つ、3つとできるんでなくて?
233 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:41:12 ] jeanne.wankuma.com/tips/programing/releasecom.html ネスト深すぎテラワロス
234 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:45:36 ] ExcelのCOMインターフェイスはExcelマクロ(VBAやそれに準じるDLLなど)のための機能で 外部の独立したプロセスからExcelを操作することを意図して作られていない。 VSTOもそういう設計思想。
235 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:50:06 ] というより単に.NETとCOMの相性が悪い点が見事に現れただけではないの?
236 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:54:02 ] デストラクタでReleaseComObjectするラッパ被せてusing使うと大分ましにはなるけど、それでも汚いな
237 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:55:07 ] Office.Netマダー?
238 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 00:59:00 ] ふつーのGCみたいに消極追跡(使われていないかを調査)じゃなくて 積極追跡(Excel.Applicationから生み出されたRCWすべてのweakrefリストとか)して まとめてあぼーん、みたいにはできないものかね? まあ、COM一般を対象にするならイマイチつかえない、Office用途な使い方になるけど。
239 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 01:05:53 ] タイプライブラリから生成されるアセンブリに手を加えれば出来ると思うよ。
240 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 02:41:38 ] こんなコード書くくらいならGCにやってもらう方を選ぶね
241 名前:デフォルトの名無しさん [2008/03/04(火) 07:36:08 ] Comが入り込む場合は、出来る限り開放したら、あとはガベージコレクタを無難なタイミングで起動して解放するほうがいいような気がします。 自分はなんとなく全部書ききってしまってますけど・・・
242 名前:デフォルトの名無しさん [2008/03/04(火) 07:38:03 ] ↓
243 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:26:26 ] なあに?
244 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 08:30:22 ] >>174 フィールドハンドルを保持しといて、必要になった時点で フィールドインフォを取得するやり方のこと。 まあ必ずしもやる必要はないし、 単純な速度的にはやらない方が有利だけどね。
245 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 09:19:35 ] XmlSerializerを使った場合、BinaryFormatterでの[OnDeserialized()]に相当する機能はないのでしょうか? TreeNode.Parentのように、 あるオブジェクトAの内部で持っているオブジェクトBでオブジェクトAをプロパティParentで持っているのですが、 これを復帰させる方法に悩んでいます。 そのままだと循環参照でエラーになってしまうのでParentには[XmlIgnore]をつけてあります。 Deserialize()したあとに再セット用のメソッドを動かせば済むのですが、 オブジェクトAはList<>の中で持っているのでループを回す必要があることもあって、 あまり美しくないのでできれば避けたいのですが、何かいい方法はないのでしょうか?
246 名前:デフォルトの名無しさん [2008/03/04(火) 09:34:44 ] webbrowserコントロールで navigateを同期的に行う方法ってないですかね? webbrowser.Navigate(url); してDocumentCompletedイベントでDocument拾うと、 コードが分離されてわかりにくいし、遷移先のページごとにあれこれ処理変えたい 場合、複数のイベントハンドラメソッドを定義して イベントにアタッチ、デタッチを 繰り返さないといけないので、ロジックがスパゲッティになっちまうんですが…。 webbrowser.Navigate(url) while(webbrowser.IsBusy) { } でループ回しても、Documentが読み込まれていないタイミングのこともあるんで いまいち信用ならないんですが、IsBusyプロパティ以外になんか判定タイミング ってあるんでしょうか?
247 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/03/04(火) 10:22:16 ] >>246 >遷移先のページごとにあれこれ処理変えたい場合、 >複数のイベントハンドラメソッドを定義して イベントにアタッチ、デタッチを >繰り返さないといけない が理解できないが イベントハンドラ内で分岐すりゃいいだけじゃね? IsBusyループはあほかって感じ >>247 >まず、コピーや削除が失敗することがあるのか 当たり前だが、ある。 >tryで処理を囲みcatchでcontinueするような処理が一般的なのか エラー処理でどんな処理をしたいかによる 一般にcatchで握りつぶすのはよくないが、ファイル操作のときは 仕方ないときもある >FileInfoを使うことで... 同じ。Fileの静的メソッドは内部でFileInfo使ってる >trycatchの処理速度の低下 tryはコスト高くない。catchが発生した場合は高コスト ディスクIOの方が重いだろうけど
249 名前:デフォルトの名無しさん [2008/03/04(火) 10:24:58 ] >>247 > まず、コピーや削除が失敗することがあるのか(File.Copy、File.Delete等) ありますね。destpathが無効だったり、アクセス許可が無かったり、ファイルがロックされていたり destpathが既に存在したりしていれば失敗します。 > 次に、私が上記で示したようにtryで処理を囲みcatchでcontinueするような処理が一般的なのかどうか この例でcontinueがいるとは思えないですが…。。。 > 次に、出した例ではstringで処理していますがFileInfoなどを利用してみてもいます。 > FileInfoを使うことで、他の質問にある答えが変わる場合それも教えて頂きたいです。 同じだと思います。 > 最後に、trycatchで処理部分を囲んでいるとして、それをループしています(そこがおそらく一番時間かかる主要処理) > その際、処理速度の低下などは気にするほどあるのでしょうか? try-catchでも例外が起きない限り、ほとんどコストはかからないと思います。 逆にコストが問題になるほどしょっちゅう例外が起きるなら、ロジックを見直すべきだと 思います。 ファイルがらみの例外は種々雑多なので例外処理のコストを嫌ってすべて条件判定 で処理しようとしても、労多く益は少ないと思いますが。
250 名前:デフォルトの名無しさん [2008/03/04(火) 10:35:19 ] >>248 二つや三つの場合分けならいいんですが、たとえば Aページでフォームに自動記入してBページに飛んで、そこでなんか情報取って さらにCページへ飛んで、サーバ側やクライアントスクリプト、activeXコンポーネント等で自動 ジャンプさせたのを判定して…Dページでまたフォームを記入して……… などと一連の動作を自動化することを考えると、条件分岐が異常に深くなってしまって、 それはそれでものすごく読みにくいんですわ。 素直にwebclientで同期的にダウンロードしてHTML独自に解析しろって言われそうですが、 ページでスクリプトやらactiveXコンポーネント使っているとお手上げなもんで、どうしても DOM操作して人間の動作をエミュレートしたいときがあるもんで…。
251 名前:デフォルトの名無しさん mailto:sage [2008/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 mailto:sage [2008/03/04(火) 11:15:49 ] >>248 >>249 ありがとうございます。 trycatchはコストが低いということが聞けて安心しました もし、以下の処理だけならcatch{}だけでよかったですね、反省 foreach (string file in Directory.GetFiles(dir)) { try { File.Copy(file, destpath, true); } catch { continue; } }