ふらっとC#,C♯,C#( ..
[2ch|▼Menu]
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 命令にするかは
結局コンパイラ次第ね。


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

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