C#, C♯, C#相談室 Part53at TECH
C#, C♯, C#相談室 Part53 - 暇つぶし2ch577:デフォルトの名無しさん
09/08/04 20:30:01
>>574
プログラミング未経験者がいきなり本で独学でC#とか俺は無謀だと思う。
特別地頭がいいなら別だけど。
こういうスレの連中は変な見栄と気取りがあるから認めないと思うけどねw

いきなりC#でも人に直接教えて貰えばなんとかなるかもしれんけど、
そういう訳にいかんのかな。

578:デフォルトの名無しさん
09/08/04 20:30:59
だから地獄の始まりだと言ってるだろ

579:デフォルトの名無しさん
09/08/04 20:32:57
>>577
うちの会社教えてくれる人いないんですよ・・・
これやってねって言った人も始めてだし。

今まで仕事・・・まぁ新入社員だけど
プログラミング教えてもらったことなど一度もないんです。
本渡されてどうぞ?しかないです。

580:デフォルトの名無しさん
09/08/04 20:37:02
まあとりあえず触ってみりゃいいんじゃない
「VisualC#入門」みたいな本買ってきて一通り打ち込んで動かしてみてそれからだな
プログラミング自体に興味が持てれば次は文法の本に行けばいいし無理ならキャリアスクールへどうぞ

581:デフォルトの名無しさん
09/08/04 20:45:10
そのレベルの初心者なら、最初は研修に行かせてもらったほうが早いんだけどな。
最初は入門書は定番の有名なのより、
手取り足取りタイプの超入門書を2~3冊読み漁るのがいい。
物足りなくなったら定番に移行。

582:デフォルトの名無しさん
09/08/04 20:55:54
>>577
C#が無謀なら何ならいいの?

583:デフォルトの名無しさん
09/08/04 20:56:17
研修とかスクールって行った事ないけど意味あるの?
実際に仕事したことのない講師が教えてそうで怖いわ。

584:デフォルトの名無しさん
09/08/04 21:10:35
研修とかプログラム受けると
お金になるとききました
(経理的な意味で)

585:デフォルトの名無しさん
09/08/04 21:34:40
URLリンク(msdn.microsoft.com)

>複数の単語で構成されるパブリック メンバ、型、および名前空間の名前には、常に Pascal 形式を使用してください。

ってあるけどプライベートなメンバの命名規則はどこにあるの?

586:デフォルトの名無しさん
09/08/04 21:35:54
公式には原則自由
それ「クラスライブラリ開発者向け」のガイドラインだからアセンブリの外から見えないメンバについては
どうでもいいの

587:デフォルトの名無しさん
09/08/04 21:37:02
すばやい返答ありがとう

588:デフォルトの名無しさん
09/08/04 21:49:37
ちなみに非推奨のアンダーバー始まりを使ってます。

589:デフォルトの名無しさん
09/08/04 21:52:15
Cじゃないんだから取り立てて禁止というわけじゃないよ。

590:デフォルトの名無しさん
09/08/04 21:55:53
むしろMSが公開してるC#で書かれたコードでは _camelCase が多数派

591:デフォルトの名無しさん
09/08/04 22:29:41
C#って結構とっつきやすい方だと思うんだけどなぁ。


592:デフォルトの名無しさん
09/08/04 22:32:20
他の言語の経験がある人にはね
もともとそういうコンセプト

593:デフォルトの名無しさん
09/08/04 22:38:09
他の言語使ったことないと結構きつい気がするよ

594:デフォルトの名無しさん
09/08/04 22:40:13
他のってCとjavaだけだろ。

595:デフォルトの名無しさん
09/08/04 23:07:54
delphiから移行したけど結構簡単だった

596:デフォルトの名無しさん
09/08/04 23:09:54
delphi とは腹違いの兄弟みたいなものだからなぁ

597:デフォルトの名無しさん
09/08/04 23:12:02
>>590
そうなんだけど非推奨なんだよw

598:デフォルトの名無しさん
09/08/04 23:16:02
ああ・・・種は一緒だからな
確かに腹違いだ

599:デフォルトの名無しさん
09/08/04 23:18:45
お下品。

600:デフォルトの名無しさん
09/08/04 23:32:40
他の言語の経験なんているか?
どの辺が?

601:デフォルトの名無しさん
09/08/04 23:42:45
>>600
誰に向かって反論してるわけ?
「どの辺」にそんなこと書いてあるの?

どうでもいいけど、こんなちっちゃいことで自分を大きく見せたい奴は
大概その意図に反して無能な奴だわな。

602:デフォルトの名無しさん
09/08/04 23:46:25
C/C++やってた俺には最初ヘッダが無いのが気持ち悪くて仕方なかった

603:デフォルトの名無しさん
09/08/04 23:47:37
>>597
非推奨と書いてある箇所は何処でしたっけ?MSDNみてるけど出てこない。

604:デフォルトの名無しさん
09/08/04 23:48:08
#defineが無くて幸せ

605:デフォルトの名無しさん
09/08/04 23:49:24
マクロには使えないが一応あったような。#define

606:デフォルトの名無しさん
09/08/04 23:49:36
あ、#defineマクロのことな

607:デフォルトの名無しさん
09/08/04 23:59:12
条件付きコンパイルはもうちょっと言語を壊さない形で実現できなかったのかな
conditional (DEBUG) { }とか

608:デフォルトの名無しさん
09/08/04 23:59:40
プリプロセスを無くすのはいいが、ファイルのインクルードまで無くしたせいで
条件付コンパイルがやり難くてしょうがないと思うんだけど。

とくに条件が複数のプロジェクトを横断的に規定するようなものだった場合。

609:デフォルトの名無しさん
09/08/05 00:02:52
>>601
うわっ、キモっ

610:デフォルトの名無しさん
09/08/05 00:03:40
>>579
悪いことは言わん。明日の退社後にでも、夜でもやってるパソコン教室へ、せめて1日(2時間)だけでも行ってこい。
最低限のとっかかりがないと、参考書のコードをそのまま入力するのも大変だろうし、ぐぐることもできんはず。

つーか、俺を雇ってくれよ…

611:デフォルトの名無しさん
09/08/05 00:09:54
なんか変な妄想ふくらませてるのがいるなw
習得に相当時間がかかったのだろうか。

612:デフォルトの名無しさん
09/08/05 00:12:26
>>610
悪いことは言わん。明日の朝にでも職安へ行ってこい。

613:デフォルトの名無しさん
09/08/05 01:17:30
>>568
明日の朝、退職願出して、ハローワークに行って、事務か介護か土方の仕事探しな。
お前みたいな奴が居ると迷惑だ。

614:デフォルトの名無しさん
09/08/05 06:32:24
>>603
URLリンク(msdn.microsoft.com)
アンダースコア (_) やハイフン (-) など、英数字以外の文字は使用しないでください。
ハンガリー表記法は使用しないでください。


読み直したらこれはプロパティのことだけに言ってるのか一般的なことに言ってるのかがわからんようになった。


615:デフォルトの名無しさん
09/08/05 07:25:28
>>614
>>586の見解で正しいと思う。

自メンバーのアクセスには全部this.つけろより、
前か後ろにアンダーバーのほうが好みだ。

616:デフォルトの名無しさん
09/08/05 08:43:36
日本語使ってるコード見たことあるな

617:デフォルトの名無しさん
09/08/05 09:27:46
○○○○○○ToolStripMenuItem_Click(object sender, EventArgs e)
これの前に日本語つくよねw

618:デフォルトの名無しさん
09/08/05 09:42:06
インテリセンスの都合で、後ろに _ の方が好き。
アンダーバーってキーボードの位置的に押しづらくて、先頭に持ってきたくない。

619:デフォルトの名無しさん
09/08/05 09:46:47
private readonly stringのメンバー変数名って大文字から始まるの?

620:デフォルトの名無しさん
09/08/05 09:58:36
privateは好きにしろと何度も出てるだろ

621:デフォルトの名無しさん
09/08/05 10:18:09
今はC#だからメソッド名とか大文字にしてるけどF#始めるから小文字になる予感。
そのあとC#使うときはどっちになるんだか・・・

622:デフォルトの名無しさん
09/08/05 10:24:36
正直どうでもいいな。

623:デフォルトの名無しさん
09/08/05 10:25:16
F#ってC#と比べてどんなメリットあるの?

624:デフォルトの名無しさん
09/08/05 10:54:16
>>617
エンティティフレームワークなんて、Hogesってテーブルがあったらデフォルトで

エンティティ=Hoges
エンティティセット=Hoges設定

だぜ。

625:デフォルトの名無しさん
09/08/05 11:12:59
ワロタ

626:デフォルトの名無しさん
09/08/05 12:05:34
プログラミングで初めての言語が C# だとクラスとか
よくわからないままになるかもしれないかな。
C++ から入るとあまり問題にならないような気がする。

627:デフォルトの名無しさん
09/08/05 12:08:04
C++こそクラスから逃げられないと思うんだが…

628:デフォルトの名無しさん
09/08/05 12:18:26
C# をはじめてのプログラミング言語にすると Main メソッドをもつクラスの意味がわかりづらい。
いきなりおまじないから始まるのはちょっと考えもの。

629:デフォルトの名無しさん
09/08/05 12:30:56
>>627
逃げられないからこそよくわからないままでいられないってことでしょ?

630:デフォルトの名無しさん
09/08/05 12:51:18
クラス設計が難しい

631:デフォルトの名無しさん
09/08/05 14:33:24
>>608
プリプロセスのうちヤバイとされる物の一つだからそりゃなくなるだろ。
また、define の方は、Conditional アトリビュートを使えとのいうがC#流。
これによって、マクロ機能等をライブラリ化する時に捨てず、きっちりdllまで維持して再コンパイル等を防止している。

632:デフォルトの名無しさん
09/08/05 15:14:12
ファイル横断的にやりたいなら、
csc /define:HOGE ... やMSBUILDのスクリプトで指定するのが原則。

633:デフォルトの名無しさん
09/08/05 17:17:09
C#でのスレッドセーフなプログラミングに関する簡単な質問なんですが
あるクラスインスタンスの値を取得する部分

work = myClass;

と、クラスインスタンスの参照をセットする部分

myClass = new MyClass();

これってそれぞれクリティカルセクション化しないとまずいですか?
内部で何をやっているのか分からず不安なんですが、何でもかんでもlockするのは嫌なので…

また、intなどの値型でも同じことが言えるんでしょうか。お願いします。

634:デフォルトの名無しさん
09/08/05 17:57:08
前提が抜けすぎてて答えようがない。もう少しシナリオをしっかり書こうよ。

635:デフォルトの名無しさん
09/08/05 18:42:23
そこだけをロックしなけりゃならないことはあまりない

636:デフォルトの名無しさん
09/08/05 18:50:18
念のため、なんでもかんでもロックしたところでそれでもスレッドセーフになるわけじゃないぜ

637:デフォルトの名無しさん
09/08/05 18:59:04
普通は想定される複数スレッドからの使われ方というのがあって、
その時にどのように動作させるという設計があって、
その上で内部のデータや動作が不正にならないための条件を導いて、
それを壊さないようにロックなどで保護するんだよ。

だから何の前提もなくただスレッドセーフなんてのはない。


638:デフォルトの名無しさん
09/08/05 21:49:32
// どちらが実行されるでしょうか?

bool a = true, b = false, c = true;
if ((a = b == c) == (a == b == c))
 d();
else
 e();

639:デフォルトの名無しさん
09/08/05 21:53:46


640:デフォルトの名無しさん
09/08/05 21:53:47
宿題か?

641:デフォルトの名無しさん
09/08/05 21:55:20
貼りつければ分かるから宿題じゃないです
クイズです

642:デフォルトの名無しさん
09/08/05 21:58:15
不適切な問題じゃね

演算子の優先順を問う感じだろうけど=と==をどっち優先にしてもdになる気がする

643:デフォルトの名無しさん
09/08/05 22:01:08
d?


644:デフォルトの名無しさん
09/08/05 22:03:05
>>642

(a = t == f) == (f == t == f)
(a = f) == (f == t)
(f) == (f)
t

(a = t == f) == (f == t == f)
(t == f) == (f == t)
(f) == (f)
t

ホントだw

645:デフォルトの名無しさん
09/08/05 22:17:53
あほやのう

646:デフォルトの名無しさん
09/08/05 22:26:34
>>644
(f == t == f) が (f == t) ?
なんで?


647:デフォルトの名無しさん
09/08/05 22:33:06
安産してeだと思った15年目の俺・・・orz

基本的に優先順位とか気にしたくないのでかっこでくくってますが( ゚Д゚)ナニカ?

648:デフォルトの名無しさん
09/08/05 22:34:56
なんだろうねぇ

649:デフォルトの名無しさん
09/08/05 22:39:14
なにいってんの?
eだろ

650:デフォルトの名無しさん
09/08/05 22:53:01
>>644
(f == t == f) の出所は?

651:デフォルトの名無しさん
09/08/05 23:18:16
(a = b == c) == (a == b == c)
=> (a = (F == T)) == (a == b == c)
=> (a = F) == (a == b == c)
=> F == (F == (F == T))
=> F == (F == F)
=> F == T
=> F

なので e が正解

652:デフォルトの名無しさん
09/08/05 23:21:37
==演算子って左結合じゃなかった?

653:デフォルトの名無しさん
09/08/05 23:28:05
>>651
まて結合の優先順位と、実行される順序は別だ。

(a = b == c) == (a == b == c)
=> (a = (F == T)) == (a == b == c)
=> (a = F) == (a == b == c)

1)
=> F == (F == (F == T))
=> F == (F == F)
=> F == T
=> F

2)
=> (a = F) == (T == (F == T))
=> (a = F) == (T == F)
=> F == F
=> T

654:デフォルトの名無しさん
09/08/05 23:32:29
大漁ですな(;´Д`)

655:デフォルトの名無しさん
09/08/05 23:34:36
式は右辺からと思っていると、
(a = b == c) == (a == b == c)
-> X == Y
の右辺Yからやることになり、地獄行きになるんです

656:デフォルトの名無しさん
09/08/06 00:13:44
(==)((a = b == c), (a == b == c))

657:651
09/08/06 03:03:09
>>652
すまん4行目は F == ((F == F) == T) だな。
結果は一緒。
URLリンク(msdn.microsoft.com)(VS.71).aspx

658:633
09/08/06 09:04:57
>>634-637
遅くなってすみません。

たとえば、スレッドAとスレッドBで変数myClassを共有している

スレッドAでは、myClassに新規インスタンスをセットする

while( 1 )
{
myClass = new MyClass();
}

スレッドBでは、myClassを作業用変数に確保し、さまざまな処理を実行する
while( 1 )
{
MyClass work = myClass;
workに対しての様々な処理
}

代入演算子はオーバーロードしていません
ちょっと何をやりたいかわかりにくいかもしれませんが、これだけを見た場合に問題はありそうですか?

内部的に参照カウント関係の処理が走っていたりして、危険だったりしますか?お願いします。

659:デフォルトの名無しさん
09/08/06 09:10:07
ダメダメ絶対ダメ
スレッドBのループが一回回る間にスレッドAのループが何回回るか全く分からないんだよ?
それにいくらメモリを意識しなくていいといったってさすがにノーウェイトでnewしまくったらGCの負担になる

660:デフォルトの名無しさん
09/08/06 09:21:04
スレッドAとスレッドBの周回数は同期がとれていなくていいです
GCの負荷は考慮しないとして、スレッドセーフかっていう質問なんですが・・・

要するに
myClass = new MyClass();

MyClass work = myClass;
のところをロックしないとメモリを壊したりしますか?ってことが聞きたいんです

C言語なら問題無いはずですがC#だとどうなのかな?って

>>635 の言うようにこれ自体はロックしなくても問題ないんですかね^^;

661:デフォルトの名無しさん
09/08/06 09:28:22
myClassが共有されてると言うことでおけー?
ロックされる云々の前に多分それ意図してるように動かないよ。エスパーしてみるとw

662:デフォルトの名無しさん
09/08/06 09:29:44
必ずしも間違った扱いではないけど問題あるかどうかは別だな
AでMyClassのコンストラクタが呼ばれた後に,Bで古いインスタンスが使われる可能性はある

663:デフォルトの名無しさん
09/08/06 09:32:02
ロックするならスレッドBの書かれてない処理のところじゃね?

664:デフォルトの名無しさん
09/08/06 09:36:37
参照やintへのアクセスはアトミックと規定されている。
つまり、myClassが32bitだとすると16bitだけ新しい値に書き換わってるという状態は存在しない。
一方doubleやlongはそういう状態が発生しえる。

ただしマルチCPUの場合はもう少しややこしくて、
スレッドAが書き換えたmyClassの内容がスレッドBに反映するまでにタイムラグが発生する場合がある。
これが問題になるならlockを使用するかmyClassをvolatileで宣言する。
Cのvolatileとの違いに注意。

665:デフォルトの名無しさん
09/08/06 09:44:52
あと、C#のGCは参照カウントじゃないよ。

666:デフォルトの名無しさん
09/08/06 09:58:55
ま、確実性という意味なら、volatileつけとけば確実。
ただしなくてもメモリが壊れるとかのレベルの問題はない。

実質的にはCLR2.0以降のメモリモデルと86系CPUのメモリモデルから、
事実上はvolatileなくても問題ないはず。



667:デフォルトの名無しさん
09/08/06 10:02:26
あ、確実というのは、可能な限り最新のインスタンスを使うという意味でね。


668:デフォルトの名無しさん
09/08/06 10:13:30
Interlocked.Exchangeでも使えば

669:デフォルトの名無しさん
09/08/06 10:40:47
volatileを使わない場合はもうひとつ問題があって、
MyClassの初期化が終わる前にスレッドBに参照が渡ってしまう可能性がある。
ただし、これが起きるのはMSだとItatiumの場合だけ。
原理的には有名なダブルチェックロッキング問題と同じ。

myClassをvolatileにしない場合のスレッドA
while( true ){ 
 MyClass tmp = new MyClass();
 Thread.MemoryBarrier();
 myClass = tmp;
} 


670:デフォルトの名無しさん
09/08/06 11:15:28
おまいら詳しいのな

671:デフォルトの名無しさん
09/08/06 11:20:35
それもCLR2.0以降では大丈夫でそ。
ついでにその問題を出すなら、Aのメモリバリアだけじゃだめ。

なぜなら、Bスレッドのワーク変数が目的通りに動かないから。
ワーク変数への各アクセスで、新しい参照を読んでしまう危険がある。
かなり直感に反する動作だと思うけど。

結局この場合もvolatileつけるのが最も簡単確実。

672:デフォルトの名無しさん
09/08/06 11:58:19
>>671
いや大丈夫でないから.NET2.0で.MemoryBarrier()が追加になってるわけで。

myClassからworkの参照コピーは1回限りのようだから問題ない。
work変数はローカルなんだし、
MyClassはスレッドAでセットしたあとは放置状態なのだから、
途中で新しい参照を読み込むことはありえない。
workは一貫したクラスを参照できてれば、MyClassのバージョンは問わないという前提だよ。

673:デフォルトの名無しさん
09/08/06 12:00:37
C# 2.0で質問です。

List<int> _list = new List<int>();

//(本当はintではなくクラスなんですが説明しやすいようにintで・・・)

_list.Add(1);
_list.Add(2);
_list.Add(3);
_list.Add(4);
_list.Add(5);

foreach(int data in _list)
{
 Console.WriteLine(data);
}

このような感じで記述した時に
List<int>はインデックス0からデータを順番に必ず返すのでしょうか?
やってみた感じ必ず返っては来ているようなんですが、保障されているというような感じの文章がヘルプから探せなかったので質問させていただきました。
よろしくお願いいたします。

コレクションやソーテッドリストなんかはその並び順は勝手に変わるようですがListオブジェクトはどうもみあたらない・・・orz

674:デフォルトの名無しさん
09/08/06 12:11:22
foreach が配列の要素を走査する順序は、次のように定義されます。
1 次元配列の場合、要素はインデックス 0 から始まってインデックス Length ? 1 で終わるインデックスの昇順に走査されます。
多次元配列の場合、要素は、最初に右端の次元のインデックスが増加し、次にその左側の次元のインデックスが増加し、さらにその左側の次元のインデックスが増加する、というように走査されます。

675:デフォルトの名無しさん
09/08/06 12:37:54
>>674
int のコレクションとして考えれば0~インデックスの最後までの順序で処理される
それでもってListコレクションの中身も同じように処理されるということでしょうか?

ということであればすっきり処理を続けることができます。
ありがとうございました!

676:デフォルトの名無しさん
09/08/06 13:09:05
>>672
違うよ。
メモリバリアはCLIの標準仕様では必要。
CLR2.0以降の実装では不要だとしても、互換性の為には必要になる。
だからある。

あとソースコード上はワーク変数に1回だけ取得してても、
実際にはワーク変数を削除して毎回実体にアクセスするという、
直感的でない最適化が行われる可能性があるんだよ。

共有してる変数をvolatileにすればそれを防げる。


677:デフォルトの名無しさん
09/08/06 13:11:03
この辺はいつだったかのMSDNマガジンに詳しく書かれてる。


678:デフォルトの名無しさん
09/08/06 14:05:33
>>676
ありがと、勉強になった。MSDNマガジンで確かに見た気がするがスルーしてた。

679:デフォルトの名無しさん
09/08/06 14:46:29
ごめんもう一つ補足。
CLR2.0以降では書き込みアクセスでのvolatileは事実上不要だけど、
読み取りでは必要な可能性もあったと思う。
書き込み順序と回数はデフォルトでvolatileのように保証されるが、
読み込みは場合によっては省略されることがある。
ただ、その他諸々の事情により、実際に問題が出るパターンはあまりなかったと思う。


680:デフォルトの名無しさん
09/08/06 17:20:59
C#からUnmanaged-DLLを利用する場合についての質問です。

DLL側でThread Local Strage(__declspec(thread)を付けた静的変数)を使用し
ている場合、(DLL内の関数がC#から呼び出され)DLL内でこれにアクセスしよう
とした時にSystem.AccessViolationExceptionになるようです。(エラー画面.PNG)
DLL側を修正せずに、C#側の修正もしくは他の手段でこれを回避する方法はあ
りませんでしょうか?

URLリンク(www1.axfc.net)
は問題を再現する簡単なコード例です。
Test\MyDll\MyDll.cpp の18行目が__declspec(thread)を付けた静的変数で、
これを、N:\Test\MyCSApp\Program.cs の29行目から呼び出されたMyFunc(5)の
処理でszMyLastErrorにエラー情報をセットするところで例外が発生します。

Test\MyC++App は同じ処理をC++で記述した場合で、これは問題なく動作しま
す。

以上、よろしくお願いいたします。

681:デフォルトの名無しさん
09/08/06 17:43:07
>>680
URLリンク(msdn.microsoft.com)(VS.80).aspx
の一番下

682:デフォルトの名無しさん
09/08/06 17:57:52
C++/CLIあたりでlibを使ってラッパ作れば何とかなるかもね

683:デフォルトの名無しさん
09/08/06 21:44:03
レスありがとうございます。

>>681
症状からして、そのページに書かれていることが起きている(C#はDLLを動的にローディングしている)
のだろうな、とは思っていたのですが、それを回避する方法がなにかあるのではないかと質問させてい
ただきました。

>>682
MangedなラッパDLLを作成し、これにMyDll.libをリンクしてみましたが、ラッパDLLがC#アプリからは
動的にローディングためか結局ダメでした。

何か、裏技がありませんかねえ??

684:デフォルトの名無しさん
09/08/06 21:52:25
別 Exe にしてプロセス間通信するしかないだろ。

685:デフォルトの名無しさん
09/08/06 21:57:02
C++/CLIから起動してC#側を動的ロードするとか

686:デフォルトの名無しさん
09/08/06 22:23:54
DLLのほうを触っていいならTlsAllocを使えばいいはずだけど。


687:デフォルトの名無しさん
09/08/06 23:40:08
COMのアウトプロセスサーバーでラップすると何とかなりそうだが、
激しくめんどい。
インプロセスサーバーだと駄目だった。

688:デフォルトの名無しさん
09/08/07 02:56:45
一番現実的なのは>>685だろうな
マネージ側は参照だけでいいんで動的ロードとか言わんけど

689:デフォルトの名無しさん
09/08/07 08:47:30
.NETのWindowsアプリケーションで作成したプログラムにおいて、
ネットワークPCのドライブにあるフォルダをアクセスしようとした時、
たまたまそのPCが立ち上がっていなくてネットワーク上に見つからない
場合に長く待たされていました。このタイムアウト時間はたぶんOS
の設定で変えられるものとは思うのですが、タイムアウトにならない
うちにプログラムでアクセスを中断してしまうことは可能でしょうか?

690:デフォルトの名無しさん
09/08/07 10:09:55
C#でパケットキャプチャしたいのですが、サンプルありますか?

691:デフォルトの名無しさん
09/08/07 10:18:07
URLリンク(www.stackasterisk.jp)
URLリンク(sourceforge.net)

692:デフォルトの名無しさん
09/08/07 11:42:39
>>691
ども、でもなんかよくわからないです
エラー 2 型または名前空間名 'NetDefineSet' は名前空間 'StackAsterisk' に存在しません。アセンブリ参照が不足しています。
とか

693:デフォルトの名無しさん
09/08/07 12:04:49
お前にはまだ早いということだね

694:デフォルトの名無しさん
09/08/07 12:16:19
>>689
別スレッドでチェックしに行って適当にタイムアウトとかできるんじゃ?

695:デフォルトの名無しさん
09/08/07 13:22:57
>>692
そういやなんかサンプルそのままじゃビルドできなかった記憶があるな

>The Code Projectによいサンプルがあったので拝借させていただき、それを元に書いてみました。
>元となったのは 「RawSocket Class-Create Network Monitoring (Packet Sniffing) Apps」 というものです。

って書いてあるしそっちも参考にするといい

696:デフォルトの名無しさん
09/08/07 14:39:34
スレッド分けるのに一票

697:デフォルトの名無しさん
09/08/07 14:49:45
Process.Start()で存在しないフォルダを起動したら、FileNotFoundExceptionじゃなくてSystem.ComponentModel.Win32Exceptionというのが来る
Frameworkが吸収するところじゃないのか

698:デフォルトの名無しさん
09/08/07 15:34:45
あなたはそれがいいと思うかもしれないが、
大多数の他人はそう思わない

699:デフォルトの名無しさん
09/08/07 16:48:15
いやそうでもない

700:デフォルトの名無しさん
09/08/07 16:59:52
Frameworkが吸収すべき所のような気がするけど
実害は無いからとやかく言わない

701:デフォルトの名無しさん
09/08/07 17:06:23
>>697
つうかふつうに固まるだろ・・・・
問題はみに行く時に固まるつうのが問題なわけで

なにかボタン押したときにチェック

チェック中ですのダイアログ的なものと共に強制キャンセルボタン

チェック開始(バックグラウンドワーカーでもなんでも)

バックグラウンド終了前にキャンセルされたら
ナックグラウンドワーカー停止

こんなんでいいんじゃね?

成功のときはバックグラウンドの完了イベントかなんかで処理するとか

色々あると思うけど

702:デフォルトの名無しさん
09/08/07 17:25:47
Microsoftの決めたことなんだから正しいお

703:デフォルトの名無しさん
09/08/07 18:37:58
>>697
吸収してどうしろって?
別プロセスからの例外をプロセス間通信で受け取るの?
それをフレームワークでやれって?

704:デフォルトの名無しさん
09/08/07 19:01:23
なん…だと…

705:デフォルトの名無しさん
09/08/07 20:19:40
Windowsフォームで質問。

Form2 _form2 = new Form2(_form1);

としたとき、_form2.FormClosedのイベントハンドラで_form1.Close()するコードを書くと、
Form2.OnFormClosed()が何度も呼ばれる(つまりFormClosedイベントが何度も発生する)
ようなんだけど、これは仕様?バグ?

仕様だとしたらどう理解したらいいんだろう?

706:デフォルトの名無しさん
09/08/07 20:25:45
OwnerはCloseするときOwnedFormsを全部Closeする
って言えば分かる?

707:デフォルトの名無しさん
09/08/07 20:34:10
>>706
そのレベルの話はOK

708:デフォルトの名無しさん
09/08/07 20:53:58
普通に再帰呼び出しになってるだけっしょ
止まるのはハンドルが消えるから

709:デフォルトの名無しさん
09/08/07 20:59:15
>>708
現象の説明としてはそれでいいと思うんだけど、
俺が聞きたいのはそういうことじゃなくて、それが仕様なのか、
仕様だとしてそれに何らかの意味があるのかってこと。

FormClosedイベントの意味は、「Close()が呼ばれました」ではないはずだよね。

710:デフォルトの名無しさん
09/08/07 21:06:03
> FormClosed イベントは、ユーザー、Close メソッド、または Application クラスの Exit メソッドによって
> フォームが閉じられた後に発生します。
「Form.Closeが呼ばれました」でも大体いいんじゃないかな

ま、おいらはMSの人じゃないので意味とか答えられないけど

711:デフォルトの名無しさん
09/08/07 21:09:46
>>710
それはさすがに読解力マズいんじゃないかと思うけど。。

712:デフォルトの名無しさん
09/08/07 21:50:30
何度も呼ばれるって何度?

713:デフォルトの名無しさん
09/08/07 21:52:55
バグだよ、>>705のプログラムのね

714:デフォルトの名無しさん
09/08/07 21:55:57
Closed≠Disposedと理解すれば良い

715:デフォルトの名無しさん
09/08/07 22:07:36
>>710-711
MSDNの説明から読み取れるのは

・ユーザ操作、Close()、Application.Exit()で発生しうる
・FormClosedが発生した時点ではフォームは閉じられている

の2点だけじゃね?

てか、説明が怪しいと感じたら英語版を読むといい
それでも怪しいときも多いけどな

716:デフォルトの名無しさん
09/08/07 22:20:48
ちなみに何回くらい呼ばれるの?
また毎回同じ回数なのか場合によって変わるのかどんな感じ?


717:デフォルトの名無しさん
09/08/07 22:33:34
>>716
以下が問題を再現する最短のコード。
コンストラクタは省略してある。

public partial class Form1 : Form
{
  Form2 _form2;

  protected override void OnLoad(EventArgs e)
  {
    base.OnLoad(e);
    _form2 = new Form2();
    _form2.FormClosed += new FormClosedEventHandler(_form2_FormClosed);
    _form2.Show(this);
  }

  void _form2_FormClosed(object sender, FormClosedEventArgs e)
  {
    Close();
  }
}

public partial class Form2 : Form
{
  int _count = 0;
  protected override void OnFormClosed(FormClosedEventArgs e)
  {
    base.OnFormClosed(e);
    Console.WriteLine("Form2.OnFormClosed Called ! // count = {0}", _count++);
  }
}

718:デフォルトの名無しさん
09/08/07 22:53:53
>>717
とりあえずDisposedイベントでForm1.Closeやるように変更したら
現象回避出来たぞ

719:デフォルトの名無しさん
09/08/07 23:00:06
>>718
うん、それはわかるけど、
俺が知りたいのはこういうコードを書くと「何故」そんなことになってしまうか、なんだ。

普通に考えれば、OnFormClosedが何度も呼ばれるのは理解に苦しむと思うんだが。

720:デフォルトの名無しさん
09/08/07 23:00:45
Form2ClosedでForm1Closeして新しいClosedが発生するのがおかしいと言ってるの?
何がおかしいのかよくわからない

721:デフォルトの名無しさん
09/08/07 23:02:44
>>719

まあ所持関係にあるForm同士として呼び出してるんだから
>    _form2.Show(this);

Form1閉じる→Form2閉じる
っていうのは標準動作として組み込まれてる

逆方向の動きを追加したい場合(Form2閉じる→Form1閉じる)は
標準の動作と競合しないようにしなきゃ不具合が起きて当たり前

FormClosed()の時点ではForm同士の所持関係を破棄していないようなので
無限ループが起きる
Disposed()の時点でForm同士の所持関係を破棄しきったので
やりたい動作が実現できる

722:デフォルトの名無しさん
09/08/07 23:07:42
FormClosedイベントなんだから、「完全にフォームが閉じた後」に発生しないとおかしい
と言いたい訳か。
んで_form2が完全に閉じた後だから、_form2_FormClosedが呼ばれても子フォームのCloseが呼ばれるのはおかしい、と

723:デフォルトの名無しさん
09/08/07 23:15:06
Close()をこうやって呼べばいけるっちゃいける。
this.BeginInvoke((MethodInvoker) (() => Close()));

親フォームが子フォームを閉じるための参照のコレクションを持ってて、
親フォームから登録を抹消するタイミングがFormClosedの後なんだろうな。

724:デフォルトの名無しさん
09/08/07 23:16:44
>>722
>_form2が完全に閉じた後だから、_form2_FormClosedが呼ばれても子フォームのCloseが呼ばれるのはおかしい、と
いや、そこは必ずしもそうは思わないけど、>>717のコードの動作が「おかしい」と思う点は、
何度も言うけどOnFormClosedの呼ばれ方が、MSDNに書かれたFormClosedイベントの仕様に
反するように思える点。

725:デフォルトの名無しさん
09/08/07 23:17:10
>>723
なんかそれタイミング次第で
うまく行ったり例外おきたり
危険な動作しそうな気がする

726:デフォルトの名無しさん
09/08/07 23:18:43
例えば、Form.Show()は何度でも呼べるけど、
その都度Shownイベントが発生したりはしないよね。

727:デフォルトの名無しさん
09/08/07 23:19:47
>>724
Formのオーナーシップの関係で
Formクラスから子FormのCloseが呼び出されるってことでしょ
何も反してないよ

728:デフォルトの名無しさん
09/08/07 23:23:40
>>727
だから、FormClosedイベントの意味、つまり仕様は、「Closeメソッドが呼ばれました」
ではないよね。少なくともMSDNライブラリを詠む限り、そうは読み取れない。

729:デフォルトの名無しさん
09/08/08 00:26:58
お前が明示的に呼んだときしかCloseメソッドが呼ばれないと思ってるということか

730:デフォルトの名無しさん
09/08/08 00:37:46
>>729
こんなこと言いたくないが、馬鹿はすっこんでてくれよ。
二重の意味で日本語も読めないのかまったく……

731:デフォルトの名無しさん
09/08/08 00:40:59
>>730
どう見てもお前の方が馬鹿だが

732:デフォルトの名無しさん
09/08/08 00:41:33
むしろMSDライブラリを読み取れないレベルの馬鹿がやめた方がいい
お話になりません

733:デフォルトの名無しさん
09/08/08 00:59:09
横やりだが>>728とかの言ってることは別にそんなおかしくないぞ。
Closeを何度呼ぼうが、実際に閉じたタイミングで一度だけ発生する
と期待するのは普通の感覚。
MSDNの説明も普通に読めばそうだと期待する。

一度しか呼ばれない、とは明記されてないし結局仕様なんだろうとは思うけど。


734:デフォルトの名無しさん
09/08/08 01:05:38
1度テストしてみて理解できないようなら方法は無い

735:デフォルトの名無しさん
09/08/08 01:14:25
MSDNのクラスのドキュメントって
クラス単体の動作を説明してるのが基本であって
フレームワークの中でそのクラスがどう扱われてるかは
オマケ程度にしか説明されていない

っていうことをわかって無いから的外れなこと言い出すんだよね

736:デフォルトの名無しさん
09/08/08 01:28:44
>>735
ほほう、「的外れ」とは?
具体的に何がどう「的外れ」だ、と?

いや、無理しなくていいよ。
そんな自分の頭で理解していることを表現しているとは思えない、
悪いけど意味不明な文章を書いているようじゃたぶん正面からの回答は無理だと思うから。

しかし、別に初心者が悪いと思わんけど(誰だって最初はそうだし)
知りもしないことに口出しして挙句に相手をいきなり罵倒する奴っていうのは
迷惑以外の何者でもないな本当。

初心者どころか自分でイベントを生成するコードすら書いたことすらないのが、
言っちゃ悪いがミエミエなのに。
まあそれ以前に日本語もまともに読めていないようだけどw

2chでこんなこと言ってみても仕方ないのは分かっているが、あまりに腹が立ったのでね。

737:デフォルトの名無しさん
09/08/08 03:20:05
ここでクダ巻いててもしょーもねーだろw

738:デフォルトの名無しさん
09/08/08 04:57:36
長文書いたら負けですよ

739:デフォルトの名無しさん
09/08/08 06:37:29
閉じられる理由位見ろ
_form2_FormClosed() の処理が
if (e.CloseReason == CloseReason.UserClosing)
  Close();
じゃないの点が問題なんだよ

何度も Form2 に FormClosed が送られてくるのも
あくまでも Form2.FormClosed イベントが終了していない段階で
Form1 を改めて閉じようとしているからループしてるに決まってるだろ

ユーザ操作以外ではどうせ親から Close が送られてくるから無視でいい

740:デフォルトの名無しさん
09/08/08 16:24:06
Form 1 の中で生成した Form2 を破棄しようとして起きるんじゃないの

741:デフォルトの名無しさん
09/08/08 18:41:56
テキストボックスやパネルの境界線の色をグレーや薄いブルーなどにするにはどうすればいいですか?
また、
ラベルの上に小さめのテキストボックスを重ね、一つのコントロールにすることはできますか?

調べましたが分かりませんでした。
どなたか教えてください
(T_T;)。




742:デフォルトの名無しさん
09/08/08 19:08:28
WPFをつかっとけ

743:デフォルトの名無しさん
09/08/08 19:45:28
>>742
WindowsフォームアプリケーションでWPFのコントロールを使えるんだっけ…。

744:デフォルトの名無しさん
09/08/08 19:50:05
>>740
ユーザ要求により Form2 に WM_CLOSE が送られ
その処理中に Form2 から Form1 に WM_CLOSE が送られ
Form1 が閉じる際に子ウィンドウに対して WM_CLOSE が送られ
その処理中に Form2 から Form1 に WM_CLOSE が送られ……

WM_CLOSE から発生する一連の処理が終了してない間に
改めて WM_CLOSE を流したらループするだろ

745:デフォルトの名無しさん
09/08/08 19:51:38
>>743
Windows Forms の編集時にツールボックス見たら
WPF 相互運用機能グループに ElementHost あるでしょ

746:デフォルトの名無しさん
09/08/08 19:56:57
>>717の場合は、別にWin32のウィンドウメッセージの水準で連鎖が起こってるわけじゃなく、
あくまで.NET Frameworkの、いわゆる「イベントの連鎖」が起こってるだけ
(しかも仕様というよりバグが原因ぽい)だから、ちょっとその説明は違うと思うけど。

747:デフォルトの名無しさん
09/08/08 19:57:05
なんでElementHost なんてわけわからん名前にしたんだ?

748:デフォルトの名無しさん
09/08/08 20:09:08
至って普通の名前だと思うが・・・

749:デフォルトの名無しさん
09/08/08 20:11:01
わけわからんって。
Element(UIElement) を Host するから ElementHost。


750:デフォルトの名無しさん
09/08/08 20:14:18
WinFormだけでやるなら、
TextBoxやらはボーダーなしにして、
その親としてPanelを用意して、
そのPanelのPaintで枠を描画

751:デフォルトの名無しさん
09/08/08 20:15:37
このスレはMS信者に乗っ取られているようだ
嘆かわしい

752:デフォルトの名無しさん
09/08/08 20:31:56
まぁC#使ってる奴の99.9%がMS使いだと思うよ(´・ω・`)
だれかC#でiPhone開発してる人来ないかな・・・

753:デフォルトの名無しさん
09/08/08 20:34:52
というかどこから >>751 が出てきたんだ?

754:デフォルトの名無しさん
09/08/08 20:44:26
何かのキーワードに反応するボットじゃない?

755:デフォルトの名無しさん
09/08/08 21:12:16
>>750
PanelにPaintができるの?
枠線入りの画像をパネルの背景にするってこと?

756:デフォルトの名無しさん
09/08/08 21:17:07
普通にPaintできるだろ
もしWPFを使うなら,テキストボックス一つ一つをElementHostでホストするようなことはお勧めしない
ある程度の大きい範囲で丸ごとWPFにしてElementHostに乗せる

757:デフォルトの名無しさん
09/08/08 21:28:28
>>755
具体的にどうやるの?
panel1_iventが出てきたけど…。

758:デフォルトの名無しさん
09/08/08 21:45:35
paintイベントって、formをloadしたときに自動で発生するの?

759:デフォルトの名無しさん
09/08/08 21:51:23
描画が必要なとき
もちろん初めにフォームを表示するときも呼ばれるな

760:デフォルトの名無しさん
09/08/08 21:51:35
くれくれしすぎは

761:デフォルトの名無しさん
09/08/08 22:14:24
もしパネルやテキストボックスがたくさんある場合、
それらの全ての四辺を描画するならば、
重たくなりそう。


762:デフォルトの名無しさん
09/08/08 22:16:19
>>756
ラベルやテキストボックスにbordercolorがないのが困る。

763:デフォルトの名無しさん
09/08/08 22:17:19
>>756
エレメントホストはどれくらい重たいのかな。
今からやってみよ。

764:デフォルトの名無しさん
09/08/08 23:01:35
>>741
なんかまともにレスする奴がいないんで見てられないからレスするけど、
そんなのは普通にTextBoxを継承してカスタムコントロール作ってやればいいんだよ。
class TextBoxEx:TextBox
{
  public TextBoxEx()
  {
    BorderColor = Color.Red;
    BorderStyle = BorderStyle.FixedSingle;
  }

  [Category("Design"), DefaultValue(typeof(Color), "Red")]
  public Color BorderColor { get; set; }

  [Browsable(false),
  DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public new BorderStyle BorderStyle
  {
    get { return base.BorderStyle; }
    set { base.BorderStyle = value; }
  }

765:デフォルトの名無しさん
09/08/08 23:02:47
* 764続き *

  protected override void WndProc(ref Message m)
  {
    base.WndProc(ref m);
    const int WM_PAINT = 0xF;
    switch (m.Msg)
    {
      case WM_PAINT:
        using (Graphics g = CreateGraphics())
        {
          using (Pen pen = new Pen(BorderColor))
          {
            Rectangle rect = ClientRectangle;
            rect.Width -= 1; rect.Height -= 1;
            g.DrawRectangle(pen, rect);
          }
        }
        break;
    }
  }
}

766:デフォルトの名無しさん
09/08/08 23:09:41
>>765
細かいことだけど、WndProcよりもOnPaintのオーバーライドのほうが簡潔では?
もちろんsuper.OnPaint呼ぶ手間含んで。

767:デフォルトの名無しさん
09/08/08 23:09:50
>>765
すごい。ありがとうございます。がんばって解読します。
この継承クラスをまた継承したら、命令を抑えてコーディングできますね。

※ なんで継承したら、bodercolorが出てくるんだろう---。


768:デフォルトの名無しさん
09/08/08 23:10:55
>>766
やってみればわかるよ。

769:デフォルトの名無しさん
09/08/08 23:12:08
例えば50個のテキストボックスを表示させ、
それら全てに色枠線を描いたら、重たいのかな。

770:デフォルトの名無しさん
09/08/08 23:30:00
>>768
ごめんなさい。言うとおりだった。

ググったらこんな記述も見つけた。PaintイベントがないならOnPaintもなくて当然か。
URLリンク(msdn.microsoft.com)
> TextBoxBase.Paint イベント
> コントロールが再描画されると発生します。このクラスでは、このイベントは使用されません。

771:デフォルトの名無しさん
09/08/08 23:35:45
panelならOnpaintも可能なんだろか。

772:デフォルトの名無しさん
09/08/09 07:46:49
>>765
さんの記事に、
「using (Pen pen = new Pen(BorderColor)) 」
という行がありますが、using句は名前空間の定義のみに使用するわけではないのですか?
どういうケースでusing句を指定するケースがあるのでしょうか。

773:デフォルトの名無しさん
09/08/09 07:47:50
URLリンク(msdn.microsoft.com)
MSDNくらい読めよクソタコ

774:デフォルトの名無しさん
09/08/09 07:54:42
>>765
using (Graphics g = CreateGraphics())
{
 using (Pen pen = new Pen(BorderColor))
 {
 }
}

だとネストが深くなるから

using (Graphics g = CreateGraphics())
using (Pen pen = new Pen(BorderColor))
{
}

の方がいいな。

775:デフォルトの名無しさん
09/08/09 07:56:28
}それならこれでいいだろ
using (Graphics g = CreateGraphics(), Pen pen = new Pen(BorderColor))


776:デフォルトの名無しさん
09/08/09 09:16:17
>>775
そうやって並べると見辛くないか? >>774でいいじゃん

777:デフォルトの名無しさん
09/08/09 10:00:28
わざわざ1行にする意味ないな

778:デフォルトの名無しさん
09/08/09 10:26:24
「黄金分割」<副題> ピラミッドから ル・コルビュジェまで 柳亮著 美術出版社
1965年の出版でしかも純粋な美術書。でも、なぜフィボナッチ数の課題を
出されるのかピンとこないプログラマは一度目を通してみるとよい。

779:デフォルトの名無しさん
09/08/09 11:14:40
黄金分割なんてうさんくさいと思うのは俺だけか?

780:デフォルトの名無しさん
09/08/09 12:15:28
みんなが黄金といっているのだから黄金なんだろう

781:デフォルトの名無しさん
09/08/09 12:23:24
僕には黄金はまだきついので聖水でいいです

782:デフォルトの名無しさん
09/08/09 13:30:33
名前が胡散臭いだけで特別なものでも不可思議なものでもないけどね。

783:778
09/08/09 17:47:10
>>779すみません。これ誤爆でした。

784:デフォルトの名無しさん
09/08/09 18:35:56
>>775
コンパイル


785:デフォルトの名無しさん
09/08/09 19:08:36
>>765
こうやると枠線だけ書いて、中の文字塗り潰してしまうイメージあったけど
これでいけるんだ

勉強になりました

786:デフォルトの名無しさん
09/08/09 19:13:38
このやり方で重たくならないならば、俺もやりたい。
みんな、なんでそんなに詳しいの?
頭脳を分けてほしいよ。

787:デフォルトの名無しさん
09/08/09 19:14:55
もっと簡単にできたとおもうが。

788:デフォルトの名無しさん
09/08/09 20:23:35
listviewのcustomdrowめんどくさー

789:デフォルトの名無しさん
09/08/09 20:27:50
ユーlistviewつくっちゃいなYO!

790:デフォルトの名無しさん
09/08/09 20:33:28
customdrow?


791:デフォルトの名無しさん
09/08/09 20:37:31
カスタムドローで合ってるぞ
オーナードローじゃないぜ

792:デフォルトの名無しさん
09/08/09 20:44:39
dr o w?

793:デフォルトの名無しさん
09/08/09 21:05:54
>>784
このロジックはどこに書くの?
デザイナーズcs?
それとも本体の方?

794:デフォルトの名無しさん
09/08/09 21:39:42
いろいろ作ったらさ
SS見せてほしいんだけどw

795:デフォルトの名無しさん
09/08/09 22:21:54
>>794
SSってなに?

796:デフォルトの名無しさん
09/08/09 22:24:17
Secret Service

797:デフォルトの名無しさん
09/08/09 22:26:35
SQLサーバーを借りてるんですが、直にSQLを書くのと、linqを使うのと、どちらがメリットが高いですか?

798:デフォルトの名無しさん
09/08/09 22:28:15
ボーリングのスコア表をC♯で作りたいんだけど、
膨大な数のテキストボックスを早く負担なく描くには何かいいテクニックはありますか?

799:デフォルトの名無しさん
09/08/09 22:29:39
>>798
なんでボーリングスコア表なんていんねん。

800:デフォルトの名無しさん
09/08/09 22:31:47
>>798
マウスを使って一つずつペタペタ描く。
それしかないだろ。
本を見てもそう書いてた。
間違っていたらごめん。

801:デフォルトの名無しさん
09/08/09 22:40:38
手っ取り早いのはGirdじゃね

802:デフォルトの名無しさん
09/08/09 22:45:24
>>801
ジードって読むの?
初めて聞きました。
詳しく教えてください。
僕もマウスて配置していてくたびれました。

803:デフォルトの名無しさん
09/08/09 22:47:17
1文字間違えるのが流行りなのか?
DateGridView

804:デフォルトの名無しさん
09/08/09 22:48:40
>>800
その本は何個のテキストボックスをポトペしていた?
10個超えてたらダウト

805:デフォルトの名無しさん
09/08/09 22:59:55
>>804
5つのコマンドボタン。
揃える技は書いてたけど、大量描画についてはコメントなし。

806:デフォルトの名無しさん
09/08/10 00:37:08
ストライクとかのアイコンはどうすんの?
結局自前で描画する予感
なら1枚絵で作ってしまえ!とか

807:デフォルトの名無しさん
09/08/10 00:42:53
DataGridViewはアイコン置けるよー

808:デフォルトの名無しさん
09/08/10 01:34:20
複数の定数を定義したクラスの中に存在する、
定数に要素に全てアクセスするにはどうすればよいでしょうか?
for each 的なコードがあればお教えください。

class TestClass
{

  public const string const_test_1 = "aaa1";
  public const string const_test_2 = "aaa2";
  public const string const_test_3 = "aaa3";
  public const string const_test_4 = "aaa4";
}



809:デフォルトの名無しさん
09/08/10 01:39:29
設計から見直せタコ

810:デフォルトの名無しさん
09/08/10 01:41:46
>>808
案1 人手で全て列挙を行う
案2 コンパイラの忠告を無視して後々のメンテナンスを全て投げきってもいいならリフレクション

後で人手で行った場合の数倍のツケを支払う覚悟があるなら
機械的にリフレクションを通してもいいかも

811:デフォルトの名無しさん
09/08/10 01:41:54
配列で用意しとけよそんなん

812:デフォルトの名無しさん
09/08/10 01:47:17
>>810
案2の方法をお教えください。



813:デフォルトの名無しさん
09/08/10 01:48:25
>>812
c# リフレクション フィールド 列挙
で出てきたの↓
URLリンク(dobon.net)

814:デフォルトの名無しさん
09/08/10 01:50:23
>>813
ありがとうございました。

815:デフォルトの名無しさん
09/08/10 02:11:58
リフレクションなんか馬鹿に勧めるな馬鹿。

816:デフォルトの名無しさん
09/08/10 02:29:09
>>815
馬鹿のお前がいっても説得力がない。

817:デフォルトの名無しさん
09/08/10 02:31:24
リフレクション使って全部実行時に行う必要もなくて

一旦リフレクション使って集計して
その後手作業でソース起こしてもいいかもね

818:デフォルトの名無しさん
09/08/10 07:04:01
yieldでよくね?

819:デフォルトの名無しさん
09/08/10 09:10:28
>>817
これはよくやる
自動生成しちゃえばいいんだよね

820:デフォルトの名無しさん
09/08/10 11:09:01
リフレクションとか難しすぎて頭おかしくなりそう

821:デフォルトの名無しさん
09/08/10 11:26:49
>>819
日本語としては「ひちがつ」が正しいがレッドブックの「なながつ」も間違いではない
ただ朝鮮人や関西人が良く使う「しちがつ」は明らかに間違い
これを使っていると日本人である事を疑われるので気を付けるように

822:デフォルトの名無しさん
09/08/10 11:31:29
>>821
なんか最近BOT多くね?

823:デフォルトの名無しさん
09/08/10 14:27:14
馬鹿ウヨ死ねや

824:デフォルトの名無しさん
09/08/10 20:20:39
lex とか yacc を思いだした

825:デフォルトの名無しさん
09/08/11 00:07:46
リフレクション使うならせめてconstではなくreadonly使おう
constとリフレクションは非常に相性が悪い

826:デフォルトの名無しさん
09/08/11 01:13:45
>>825
もしかしてCLI時点でconst修飾の名前ってきえちゃうの?

827:デフォルトの名無しさん
09/08/11 01:29:13
ビルドした時点でリテラルに置き換わるんじゃなかったか

828:デフォルトの名無しさん
09/08/11 01:31:13
んだよ
だからリテラルにできない物はconst宣言できない

829:デフォルトの名無しさん
09/08/11 01:38:09
使用した場所はリテラルに置き換わってるが、
型の定義としては残っているのでリフレクションで確認できる。

public static const field System.String const_test_1


830:デフォルトの名無しさん
09/08/11 01:40:05
ildasmの表記のほうがいいな。

.field public static literal string const_test_1 = "aaa1"


831:デフォルトの名無しさん
09/08/11 01:57:24
しょうがないんだろうけれど、Attributeのコンストラクタ?に普通のオブジェクト生成式とか書けるようになって欲しいお(´・ω・`)

832:デフォルトの名無しさん
09/08/11 02:26:21
むちゃゆうな
まあ気持ちは分かる


833:デフォルトの名無しさん
09/08/11 08:30:52
Expression<TDelegate>さえ書ければ解決なのに

834:デフォルトの名無しさん
09/08/12 02:27:35
TDelegateってなんだ。

835:デフォルトの名無しさん
09/08/12 06:20:06
Delegateは特殊クラスなのでこういう制約は作れないってことだと思う。
class F<T> where T : System.Delegate


836:デフォルトの名無しさん
09/08/12 20:09:48
IL 上作れないわけじゃないよ。実際 ECMA335 には
一例として載ってる。
要するにわざと禁止しているものなので理由を考えて
みるといいと思うよ

837:デフォルトの名無しさん
09/08/13 15:52:09
1日分のログを日付フォルダごとに分けて保存していて
一定期間経過したフォルダを
DirectoryInfo.Delete(true)で削除しているんだが
毎日少しずつ削除時間が延びていくんだが
なんか理由知っている人いない?
削除の他にも処理をしているんだが
なぜか削除だけ時間がかかる
IOの問題なのかな?

ちなみに、、、
OS:windows 2003 server R2
Enterprise x64 Edition
Service Pack2

838:デフォルトの名無しさん
09/08/13 16:39:00
普通にコマンドで消した時は遅くないの?

839:デフォルトの名無しさん
09/08/13 20:45:04
削除してる間にログを他者が見てるって事はないの?
そもそもログの量、大きさは同じくらいなの?

840:デフォルトの名無しさん
09/08/14 00:23:18
処理内容がわからんから何とも胃炎。
毎日一定時間に処理をしてるんじゃないのか。

削除終了時に終了後から一定時間をセットするなら
削除処理にかかる時間分ずれていくだろ。

841:デフォルトの名無しさん
09/08/14 00:45:25
すいません
vista + C# express edition + excel2007です
参照設定で参照の追加でcom タブでmicrosoft excel5.0をみると
microsoft excel5.0 ?????????? と出てるんですけど・・・
これって一体・・・・2007以前のexcel入れれば治るのでしょうか?
とても不安です・・・
壊れてるのかなC#・・・(涙

842:デフォルトの名無しさん
09/08/14 02:03:58
>>837
最初は断片化かな?とか思ったけど、メモリリークな気もする。
C#はジェネリクスとnewで管理されているけど解放されないメモリが
簡単にできちゃうから、仮想メモリにガリガリアクセスして時間が
かかってしまう可能性も否めない。
Process Explorerあたりで確認して、GCのジェネレーション2が
異常にでかいサイズなら解放漏れ(ジェネリクスのClearやDisposeのし忘れ)を
確認してみたらどうだろう。

843:デフォルトの名無しさん
09/08/14 02:06:10
>>842
気になる
これってアンマネージドで管理されているメモリの話?
それともマネージドだが古すぎてpermanent(永久?)領域に直ぐに移されちゃう話?
それとも両方混ざった話?

844:デフォルトの名無しさん
09/08/14 02:13:25
マネージドでしょ

845:842
09/08/14 02:35:11
マネージドの話。
ちょっと怖い書き方をしてしまったけど、要は使わないクラスがどっかで
参照されてるので消されずにメモリが圧迫されてるかも、という事です。
ソートとかで一時領域として使ってたDictionaryに、そのまま参照が残っちゃってて、みたいな。
開発中、デバッガ終了後なかなか処理が戻ってこない時はこの現象が起きてるか
疑ってみたほうがいいかも。と、経験者よりorz

846:デフォルトの名無しさん
09/08/14 05:20:44
DirectoryInfoのインスタンスは使いまわしてるか、毎回newしてるか。
Directory.Delete(String, Boolean)を使ったらどうか。

847:841
09/08/14 08:32:26
初心板にまわります

848:837
09/08/14 11:20:52
みなさん、ありがとうございます。

>>838
ディレクトリのサイズが32MBぐらいで
普通に"rmdir"コマンドで削除すると1分ぐらいです。

>>839
削除しているのは、数日経過したディレクトリなので
他の人は見てないです。

>>840
日付ごとにディレクトリを作成して
その配下に時間ごとのサブディレクトリを
作成してプロセスごとのログを出力しています。
"日付ディレクトリ"の日付を見て
数日経過していたら削除するという
処理を行っています。

>>842
自分も最初はメモリリークを疑っていました。
ページファイルが1日で5MBずつ増えていますが
そのせいで削除処理が約30秒も伸びるんでしょうか?
削除処理だけで、他の処理は遅くなっていないのも
気になっています。

>>846
毎回newしています。
解放処理は明示的に行っていないので
参照が残ってしまっているのでしょうか?

849:デフォルトの名無しさん
09/08/14 12:18:00
>ディレクトリのサイズが32MBぐらいで
>普通に"rmdir"コマンドで削除すると1分ぐらいです。

850:デフォルトの名無しさん
09/08/14 12:58:35
削除の処理にかかる時間が延びてるってことか

851:デフォルトの名無しさん
09/08/14 13:54:14
32MBで一分ってその時点で遅すぎねーか?

852:837
09/08/14 14:04:49
>>850
そうです。
削除の時間が日々伸びています。

>>851
ディスク上のサイズは204MBでした。
遅すぎですかね?

853:デフォルトの名無しさん
09/08/14 14:07:13
ファイル数くらい書けよ。
エスパーさせんな

854:デフォルトの名無しさん
09/08/14 14:08:40
シャドウコピーとかは有効になってる?

855:デフォルトの名無しさん
09/08/14 14:42:25
ファイル数がきっと膨大なはず
ファイルの数があまりに多いと関連の処理がどんどん重くなる

確かWindowsのファイルテーブルてツリー構造してるの見た目だけで
実際はドライブごとに一つの表があるだけだから
ドライブ内のファイル/フォルダの数が多くなる度に
ファイル/フォルダ絡みのあらゆる動作が遅くなる

間違ってたらごめん

856:デフォルトの名無しさん
09/08/14 15:14:19
NTFSだったらB木使ってるからFAT32よりも格段に速いよ

857:デフォルトの名無しさん
09/08/14 15:22:48
>>856
フォルダの中身ごと削除の時点で全スキャンだし

858:837
09/08/14 15:58:22
>>853
すみません。。
フォルダ数:約9500
ファイル数:約52500
膨大な数ですよね。

>>855
毎回削除する"フォルダ数"/"ディレクトリ数"は
変わらないのですが
それでも段々遅くなるのでしょうか?



859:デフォルトの名無しさん
09/08/14 16:07:16
>>858
数日でそんなに溜まるログとか設計が狂ってる

860:デフォルトの名無しさん
09/08/14 16:10:39
いっその事DBにログ記録しろ

861:デフォルトの名無しさん
09/08/14 16:18:10
単純に一日のログを1ファイルにまとめるだけでも
相当マシになるはず

862:837
09/08/14 17:51:15
みなさん、ありがとうございます。
設計というよりも、そういう仕様なので
仕方ない部分もあるのですが・・・

アドバイスを参考にしたいと思います。

863:デフォルトの名無しさん
09/08/14 18:46:36
それ、プログラム終了させて新たに起動したらあきらかに速度が違う
というのなら、今まで消したファイルもスキャンしてるとかないか?

864:842
09/08/15 01:15:55
>ページファイルが1日で5MBずつ増えていますが
>そのせいで削除処理が約30秒も伸びるんでしょうか?
>削除処理だけで、他の処理は遅くなっていないのも
>気になっています。

その、今の所、日を追うごとに増えているデータってのが
ページファイルだけなら疑ってみる価値はあるかと。
ファイル削除とページングでハードディスクへのリクエストがかち合って
ガリガリ言ってる時間が長くなれば可能性はあるかと。

削除プログラムが常駐プログラムなら一度再起動してみて速度をみてみるのはどうだろう?
それ以前にgen2の値はどうなんだろう?これでリークか否かの答えは出ると思うんだけど。

毎回起動なら、そのページファイルを増やしている別のプログラムをつきとめた方がいいかも。
なんにせよ、そのサーバはリークを起こしているっぽいw

865:デフォルトの名無しさん
09/08/16 12:42:56
webbrowserに表示しているHTMLを画像として保存するには、
どのような方法が一番妥当ですか?

クライアントの隠れている部分も含めて画像変換したいので、
PrintScreenではだめです。


866:865
09/08/16 13:00:41
ネットで探してて最初は見つからなかったのですが、
書き込んでからいろいろ見つかってきました。

URLリンク(homepage1.nifty.com)

URLリンク(www.i-tribe.info)

すみませんでした。

867:865
09/08/16 13:04:11
ここが一番よさそうでした。

URLリンク(ufreyr.blog80.fc2.com)


868:837
09/08/17 14:29:39
>>864
遅くなりましたが、「Process Explorer」で見てみました。
削除しているプログラムの値です。

#Gen0 Collection 14,220
#Gen1 Collection 5,952
#Gen2 Collection 314

Gen0 Heap Size 3,145,728
Gen1 Heap Size 30,976
Gen2 Heap Size 64,076,116

これって、リークしているのでしょうか?

869:864
09/08/17 18:07:10
Gen2を知らないなら、今だけはプログラムを起動中に常に必要なメモリサイズだと思ってください。
削除プログラムに常に必要とされているメモリが64M弱が正しいならリークしてないです。
これが削除処理を実行する度に増えているなら、かなり怪しいです。
個人的な見解としてはファイルが何ギガあっても削除するだけに64Mは異常です。
CLR Profilerで何にメモリを使っているのか調べます。
更にいうと、64M程度で体感速度に差が出るとは考えづらいです。
他のヒープも合わせ削除処理中にムチャなメモリ確保がある可能性も視野に入れます。
ただし処理時間の原因がメモリリークであり、それが改善された場合、
これ以上削除時間が延びる事は無いはずなのでクレームが来るまで放置しますw

870:デフォルトの名無しさん
09/08/17 23:10:33
サーバーでPaythonスクリプトを実行し、
特定の命令が呼び出されたら割り込みが入るまで待機ということをしたい。
それを実現するために、スクリプトを実行するごとにスレッドを呼び出してイベント来るまで待機ということをしているんだが、
これだと多数のユーザーがスクリプトを実行したときにリソースが枯渇しそうなことに気付いた。
スレッドプールで書き直したいんだが、ブロックするような処理をするのはまずいとMSDNに書いてあった.

これってイベントが来るまで待機するような処理も含まれるの?

871:デフォルトの名無しさん
09/08/17 23:44:28
どの辺にC#がw

872:870
09/08/17 23:55:18
使用言語:C#3.0

873:デフォルトの名無しさん
09/08/18 00:22:37
>>870
そのまえにペイソンとかいう言語はC#とどの程度相互運用できるんだ

874:デフォルトの名無しさん
09/08/18 00:28:52
phython≠paython

875:デフォルトの名無しさん
09/08/18 00:59:19
また変なエサを投下して・・・

876:デフォルトの名無しさん
09/08/18 01:07:01
ふぁいそん?

877:デフォルトの名無しさん
09/08/18 01:46:04
北米的にはぺいずぅぁん。

878:デフォルトの名無しさん
09/08/18 10:24:41
SORPとかでWCF使うとか

879:870
09/08/18 16:49:05
>>873
ironpaythonを使えば、楽に相互運用ができる。

880:デフォルトの名無しさん
09/08/18 17:25:17
>>879
paythonって何だよ
ironpaythonって何だよ

881:デフォルトの名無しさん
09/08/18 17:36:43
試しにググったらここのPart42が引っかかったw

882:デフォルトの名無しさん
09/08/18 20:44:15
SORP?

883:デフォルトの名無しさん
09/08/18 20:46:14
>>879
アイロンペイソンってサーバーで動かすPaythonスクリプトにもなれるの?

884:デフォルトの名無しさん
09/08/18 21:22:55
おまえらペイトホンも知らねーのかよ。

>>870
マジレスしようと何度か読み直してみたがさっぱり意味が解らない。
とりあえず質問の内容は最後の2行のみ?
で、ブロックしそうなのはクライアント側?サーバ側?
っつか多分日本語でやりとりしてもらちがあかなそう。簡単なソース出して
これはおk?ってやった方が、キミとは上手くやっていけそうな気がする。

885:デフォルトの名無しさん
09/08/18 21:53:42
boid mein() {
}

とかってコード期待w

886:デフォルトの名無しさん
09/08/18 22:35:00
>>869
亀だが・・・

64M程度ならドトネトでは普通じゃないかと思う
結局メモリ量は予約領域でもあるはずだから純粋に使用しているメモリというわけではないだろうし

887:870
09/08/18 23:54:18
>>884
ソースをさらします。
サーバーがRunScriptというパケットを受け取ると実行される
void talk()
{
Thread t = new Thread(executeScript);
t.Start(this.remoteip);
}
private void executeScript(object data)
{
PythonEngine pe = new PythonEngine();
pe.deliverVarible("_self", this);
pe.deliverVarible("_target", target);
pe.deliverVarible("_remoteip", (string)data);
pe.execute("foo.py");
}
//リモートIPとManualResetEventが対になってる
static Dictionary<string, ManualResetEvent> ManualEvent = new Dictionary<string, ManualResetEvent>();
//foo.pyがwaitForSignalを実行すると呼び出させる
public void waitForSignal()
{
if (remoteip == null) return;
ManualEvent[remoteip].Reset();
ManualEvent[remoteip].WaitOne(Globals.script_wait_time);
}
//別スレッドから呼び出し
public void setSignal()
{
if (remoteip == null) return;
ManualEvent[remoteip].Set();
}


888:870
09/08/18 23:55:49
訂正
×//別スレッドから呼び出し
○//同じクライアントから特定のパケットを受け取ると呼び出される(パケットを受け取る部分は非同期ソケットを使ってます)

889:デフォルトの名無しさん
09/08/19 00:08:34
Directory.Delete("パス",true);
これに64Mはありえない。それからgen2は回収に何度か失敗している領域。
現在使用中かつ長い間確保されている可能性が高い。

とまぁ、レスの情報と自分の経験からの推測な訳です。はい。
本当に64Mが適正か否かは>>837氏のみが知る所でしょう。

890:デフォルトの名無しさん
09/08/19 19:00:23
質問です

今ちょっと頼まれて
テキストボックスとボタンのフォームだけがあります。
そしてそれに必須入力チェック、桁数チェック、書式チェックと言う条件を作らないといけないのですが

当方初心者でまるでわかりません。

まず、True,Falseの場合に出すメッセージボックスを作ります。
そしてIF文でどっちに行くかを条件付けるんですが
どのようにして記述していけばいいのでしょうか・・・・

891:デフォルトの名無しさん
09/08/19 21:30:38
ググれ

892:デフォルトの名無しさん
09/08/19 21:31:42
初心者向けの本でも買え。

893:デフォルトの名無しさん
09/08/19 21:53:52
カスどもありがとう助かったわ

894:デフォルトの名無しさん
09/08/19 22:19:58
タブコントロールのタブなしってあるの?
アクセスではあるらしいね。

895:デフォルトの名無しさん
09/08/19 22:34:11
フラットスタイルじゃなくて?

896:デフォルトの名しさん
09/08/19 22:46:10
ふらっとの方でもたずねたのですが、返事がないので
C#を始めて1年くらいで、2Dグラフィック周りを主にやってます。
最近、JAVAプログラムのオープンソフトでJDrafter(hhp://jdrafter.com/)とい
うソフトを発見したのですが、 このソフトは、イラレ感覚で2Dグラフィックを作成し、Javaの
オブジェクトとして保存できるため、Javaプログラムからの表示やアニメーションなどにも応
用できるようなのですが、 どなたか、C#でこんなプログラムをご存知の方いないでしょうか。
もしくは、オープンソフトなので、描画周りのクラスをC#に変換して利用できないか考え
ているところですが、どなたかその方法やこれに適したjava→C#変換ツールをご存知
の方があれば、ご教授をお願いします。

897:デフォルトの名無しさん
09/08/19 22:54:20
何文字目?

898:デフォルトの名無しさん
09/08/19 22:55:30
Java使えよ

899:デフォルトの名無しさん
09/08/19 22:56:59
つJ#

900:デフォルトの名無しさん
09/08/19 22:59:36
>>895
フラットスタイル…
C♯にあるの?

901:デフォルトの名しさん
09/08/19 22:59:48
>>898
javaに変えてもいいのですが、今までの資産や、C#の将来性を考えると簡単に
は決断できません。
ググってもみましたが、どうしてもわからないのでお尋ねしているところです。

902:デフォルトの名無しさん
09/08/19 23:01:03
つか xaml に変換できるもの、Expression とかがまさにそのまま
イラレ感覚がいいんならイラレ -> xaml のエクスポータ使えばー

903:デフォルトの名しさん
09/08/19 23:17:21
>>902
ありがとうございました。
xamlテクノロジーは始めて知りました。(勉強不足ですみません。)
xamlについて調べて、フリーの(金がないので) ツールなんかがない
かいググります。どうもありがとうございました。

904:デフォルトの名無しさん
09/08/19 23:36:49
イラレってxaml生成できんのか。おどろいた。

905:デフォルトの名無しさん
09/08/19 23:49:29
XPSじゃねーのと思って調べたらほんとにXAMLだった

906:デフォルトの名無しさん
09/08/20 00:11:20
イラレ10でも出力できますか?

907:デフォルトの名無しさん
09/08/20 00:59:00
プラグイン形式のやつはCS以降じゃないと無理なんじゃないかな?
Photoshop(.psd)やIllustrator(.ai)を直接取り込めるようになったBlend 3を使うのが楽だとは思うけど↓みたいなのもある。

XamlXporter for Illustrator
URLリンク(www.codeplex.com)

>>903
Inkscapeがオススメ。日本語化されてて標準でXAML出力に対応してる。

908:デフォルトの名無しさん
09/08/20 02:14:50
(´・∀・`)ヘー

909:デフォルトの名無しさん
09/08/20 06:44:32
イラレでコントロールを作成してWPFコントロールにすることは可能なの?

910:デフォルトの名無しさん
09/08/20 07:02:50
仮にCanvasしか吐けなくても好きなルート要素で囲んでやるだけで
ユーザーコントロールでもコントロールテンプレートでも作れるはず

911:デフォルトの名無しさん
09/08/20 08:27:03
へーへーへー

912:デフォルトの名無しさん
09/08/20 11:35:37
すいません。教えてくらはい。

VS2008のプロジェクトに*.iniファイルを含めて
プロジェクト出力として一緒に出力したいのですが、
クラスライブラリプロジェクトの場合うまくいきません。

これは仕様でなんでしょうか?

<<設定例>>
ファイルプロパティ
 ビルドアクション:コンテンツ
 出力ディレクトリにコピー:常にコピー


913:デフォルトの名無しさん
09/08/20 11:56:20

質問ですが、遅延バインディングにてExcelの単一セルの中に入っている情報を取り出すにはどうすればよいでしょうか?
遅延バインディング レイトバインディング 実行時バインディング いろんな呼び方がありますね。

URLリンク(www6.atwiki.jp) にありましたコードの一部を参照させていただいております。

// セルデータを2次元配列にいっぺんに読み込みます。
objRange_Late = objSheet_Late.GetType().InvokeMember("UsedRange", BindingFlags.GetProperty, null, objSheet_Late, null);
Object[,] tmpTable;
tmpTable = (System.Object[,])(objRange_Late.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, objRange_Late, null));

↑上記コードはうまくいったのですが、
単一のセルを指定し(Rangeを使うのだと思います)そのセル内のデータを取得する方法がわかりません。

やりたいこと 例)
A1セル「hoge」 の文字列hogeを取得したいです。

試しに書いたコード(実行時にエラーが出たのでできませんでしたが)を乗せておきます。

parameters = new Object[] { "A1",Missing.Value };
objRange_Late = objSheet_Late.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, objSheet_Late, parameters);
Object tmpTable = new object[1];
tmpTable = (System.Object[,])(objRange_Late.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, objRange_Late, null));

こういう雰囲気でいけそうな気がするのですが、わかりません。よろしくお願いします。


914:デフォルトの名無しさん
09/08/20 18:43:57
Webサーバ機能を、作ってるアプリに付けたいのですが、
単一ループ内でkeep-aliveを処理できるお手軽なアプローチ無いでしょうか?


// listner起動

while (true)
{
 // Context取得 (ブロック)

 // Request処理

 // Response処理

 if (Connection == close)
 {
   break;
 }
}

と言う様な処理を行い、
要は、ソケットの接続~切断のモデルと近似にしたいのです。

理由は、データ管理や前回のリクエスト/レスポンスに強く依存した処理の為、簡単に回したいと言う感じです。

アドバイスと慈悲を下さい。


915:デフォルトの名無しさん
09/08/20 18:52:23
>>912
プロジェクト出力ってセットアッププロジェクトの話?
セットアッププロジェクトでDLLだけ配布するの?

>>914
プロトコルに何使うのさ

>>913
Excelの質問には答えられないけど、エラーの内容ぐらい書いた方がいいんでないか

916:デフォルトの名無しさん
09/08/20 18:55:59
>>915
httpです

917:デフォルトの名無しさん
09/08/20 20:16:18
>>916
HTTP で keep-alive でのみセッションが維持されるなんて
仕様外の特殊な事考えたりしてるなら
独自プロトコルでやった方がいい

918:デフォルトの名無しさん
09/08/20 22:27:31
前回のリクエスト/レスポンスに強く依存した処理ってviewstateじゃだめなん?

919:デフォルトの名無しさん
09/08/20 22:37:11
>>914
つまりソケットの接続~切断のモデルと同じなんじゃね?
ソケットつかえばおk


920:デフォルトの名無しさん
09/08/20 23:46:05
.net 3.5、 WinXP VS2008、C#で開発しています。
開発するアプリケーションの利用環境は、Win2003、Win2008、WinVistaなどを想定している開発です。

質問します。
C#でファイル名の整合性を確認する関数はあるでしょうか?
ファイル名に使えない文字を取得する、System.IO.GetInvalidFileNameChars()は知っていますが、これだと
CON, PRN, AUX, CLOCK$, NUL COM0, COM1, COM2, COM3……
のような文字列を調べることができません。

また、開発環境こそWinXP Proなんですけれども、開発するアプリケーションは
クライアント・サーバ方式のアプリケーションで、クライアントからサーバにファイルを作成する形式のものです。

サーバはWin2003かWin2008、クライアントはWinVistaかWinXPです。
そうなってくると、いったんクライアントでファイルを作成して、実際に有効なファイル名かどうかを
確認する手段もOSの差を吸収できるかどうかに疑問が生じます。

このような場合、一体どのようにしてファイル名として有効な文字列かどうか判断したらよいか
教えてください。

お願いいたします。

921:デフォルトの名無しさん
09/08/20 23:48:30
最近C#をはじめました。ワケあってちょっと急いで基本を学ばなければなりません。
質問させていただきたいのですが、sqrtやsinなどの数学系の関数を使うとき
Math.Sqrt(2.0)
といちいちMath.をつけるのが(複雑な式をコーディングするときにMathだらけになる)
嫌なのですがこれを書かないでいいようにするにはどうしたらいいのでしょうか。
多分Console.WriteをWriteだけにしたいというのと同じ意味だと思いますが。
よろしくお願いいたします。

922:920
09/08/20 23:54:54
ごめんなさい、よく考えたら権限の問題とかもあるので、サーバ側でディレクトリ作ってみて、失敗するかどうかで判断したほうがよさそうです。

質問を取り消します。

923:デフォルトの名無しさん
09/08/20 23:56:21
>>921
Math.Sinを呼び出すだけのローカル関数でも作っとけば

924:デフォルトの名無しさん
09/08/20 23:56:42
>>919
開発効率が悪いからもっと便利なクラスを使いたいです

925:デフォルトの名無しさん
09/08/20 23:58:21
便利なクラスを作れ

926:デフォルトの名無しさん
09/08/21 00:00:06
static import は?と思ってしまった・・・orz

927:デフォルトの名無しさん
09/08/21 00:16:18
>>923>>925
それはそういうものなのですか。VC#で開発してるとあまりそういうことは
みんな面倒とは思わないためでしょうか?
いずれにせよ、手軽にできるわけではないんですね。ありがとうございました。

928:デフォルトの名無しさん
09/08/21 00:18:17
>>927
Math って書くのが普通。とくに面倒じゃないよ。

929:デフォルトの名無しさん
09/08/21 00:36:50
>>927
オブジェクト指向というのはそういうもの。

930:デフォルトの名無しさん
09/08/21 00:52:29
>>927
Math.Sinをコンパクトに記述することを考えるより、
式そのものを簡単にすることをまず考えるべきだろうね。

数学の数式だって同じだと思うけど、式が複雑だっていうなら
いくつかの部分に分けて部分ごとに一時変数に入れるとかね。

まあ数式の場合と違って、数値計算の場合は演算誤差に対する配慮は
必要になるけど。

931:デフォルトの名無しさん
09/08/21 01:25:51
using使えば

932:デフォルトの名無しさん
09/08/21 01:29:53
Func<double, double> sin = Math.Sin;
とかできねーの?

933:デフォルトの名無しさん
09/08/21 01:30:22
>>927
VC#っていうか、フレームワークの関数がいくつあると思ってるん?
全部一発で書けるようトップレベルに置いたらとんでもないことになる。
Mathだけ特別扱いなんて出来ないよ。

934:デフォルトの名無しさん
09/08/21 01:37:07
>>927
そういうのは学生のうちに卒業しよう。
プロジェクトメンバーが迷惑するから。

935:デフォルトの名無しさん
09/08/21 01:41:10
>>932
できるよ

936:デフォルトの名無しさん
09/08/21 01:44:44
>927 うるせーよ

937:デフォルトの名無しさん
09/08/21 02:17:22
普段使わない関数がIntelliSenseでわらわら出られたらよっぽど面倒だわね

938:デフォルトの名無しさん
09/08/21 06:34:37
ExpressionTree使え

939:デフォルトの名無しさん
09/08/21 07:35:53
>>927
その書き方だと「面倒だなぁ……。よくみんな我慢してるよなw」って考えてるみたいだが、
こうやって分類されている方が、長い目で見れば便利なんだ。
このめんどくささはむしろ必要なめんどくささ。いずれわかるよ。

940:デフォルトの名無しさん
09/08/21 07:36:37
>>932
Math.を省略したくなるような状況でそんなことしたら遅くなるからやめれ

941:デフォルトの名無しさん
09/08/21 08:03:24
コードを書くときには面倒かもしれないけど
コードを読むときには何してるかわかるからいいと思うんだが。
というか実際のところたいした手間じゃないだろう。

942:デフォルトの名無しさん
09/08/21 08:07:18
>>939がもっともだと思う

943:デフォルトの名無しさん
09/08/21 08:47:45
F#でかけばMath.とか書かずにすむお

944:>>913
09/08/21 10:39:22
>>913です。
自己解決したので解決方法を。

parameters = new Object[] { "A1" };
objRange_Late = objSheet_Late.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, objSheet_Late, parameters);
Object tmpTable = new object[1];
→tmpTable = (System.Object[])(objRange_Late.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, objRange_Late, null));

// 「→」行部分実行時に Error:型'System.String'オブジェクトを型'System.Object[]'にキャストできません のエラー

parameters = new Object[] { "A1" };
objRange_Late = objSheet_Late.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, objSheet_Late, parameters);
String str = string.Empty;
str = (System.String)(objRange_Late.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, objRange_Late, null));

MessageBox.Show(str);

無事A1セルに入力されていたValueを取得することができました。
無駄にキャストしていたことが問題だったのですね。エラーみろよっていってくれた>>915さんどうもです。


945:デフォルトの名無しさん
09/08/21 16:47:03
Double型をString型に変換する方法を教えていただけませんか?


946:デフォルトの名無しさん
09/08/21 16:53:59
ToString

947:デフォルトの名無しさん
09/08/21 17:43:13
>>946
ありがとうございます。>>945です
doubleを無理やりstring型にキャストしようとしてました^^;

948:デフォルトの名無しさん
09/08/21 17:44:05
キャストの意味を勉強しなおそう

949:デフォルトの名無しさん
09/08/21 17:51:22
DataGrid へ適当なクラスリストのバインドを考えています。
ただ、表示対象は対象クラスが保持するプロパティの一つに限定したいです。
後々にDataGrid から SelectedItems として、バインドしたクラスのデータを取得を考えます。

ここで、クラスをそのまま ItemsSource へ突っ込むと、クラス名が表示されてしまいます。
こういった場合、特に二行目の部分ではどんな風にすれば対象プロパティのみ表示可能でしょうか。

よろしくおねがいします。

950:デフォルトの名無しさん
09/08/21 18:04:56
全体に意味が分からんが、まずそれはWPFか?

951:デフォルトの名無しさん
09/08/21 18:07:19
>>949
>ここで、クラスをそのまま ItemsSource へ突っ込むと、クラス名が表示されてしまいます。
ここで、クラスをそのまま ItemsSource へ突っ込むと、突っ込んだリスト中のクラスが保持するメンバクラスの名前、でした。

class hoge
{
public int m_hoge;
public foo m_foo;
}

class foo
{

で言う foo です。

m_hoge | m_foo
------+------
 2   | m_foo
 2   | m_foo
 3   | m_foo
 4   | m_foo


952:デフォルトの名無しさん
09/08/21 18:10:29
>>950
WPF というか、 Silverlight でやってます。



>>951 では途中で送信してしまったので、続きです。

class foo
{
public int m_x;
public int m_y;
}

ここで、 foo というクラス名ではなく、数字の x を出力したい。


953:デフォルトの名無しさん
09/08/21 18:10:59
パブリックプロパティ用意すりゃいい

954:デフォルトの名無しさん
09/08/21 18:18:24
XAML側でどのプロパティを表示するかの指定があったはず-。
それにしてもpublicなフィールドでm_って気持ち悪い命名規則だね。

955:デフォルトの名無しさん
09/08/21 18:27:16
>>954
ありがとうございますっ!
そういうのを探していました。
とても助かりました。

956:デフォルトの名無しさん
09/08/21 18:51:19
アクセサを使いましょう

957:デフォルトの名無しさん
09/08/21 18:53:43
XAMLのバインディングってわかりづらいよね
もとより人間が書くものじゃないんだろうけど

958:デフォルトの名無しさん
09/08/21 19:01:24
>>956
アクセサって get とか set ですよね?
XAML と合わせて検索しても、どうにも分らないです。
すみません。

バインディングの記述に利用する識別子でしょうか?

>>957
未だにクラス名やそのメンバ名を直接 XAML ファイルに記述するのが気持ち悪くて仕方ありません。
慣れの問題でしょうか……。

959:デフォルトの名無しさん
09/08/21 19:20:53
BindingのPathは . 使ってプロパティのプロパティを指すこともできる
つかフィールドってバインディングできたっけ? プロパティじゃないとダメな気が

> 未だにクラス名やそのメンバ名を直接 XAML ファイルに記述するのが気持ち悪くて仕方ありません。
XAMLに記述するのはViewModelのクラスのだから問題ない

960:デフォルトの名無しさん
09/08/21 19:23:48
>>942
>>927の考えは>>939やチミが勝手に心配しているような意味じゃないと思うぞw
別にクラスの中にしかメソッドが存在できないのがウザい、
というような意味のことは言ってないだろう。

っていうか、複雑な計算式をベタにコーディングしたら
>>927のように思うのはむしろ普通のこと。
実際見難くくてかなわんよ。

だから>>930のようにアドバイスするのが正しい。

しかし、今に始まったことじゃないけど本当シロートがシロートに講釈垂れる
図式が多すぎるなここ。

961:デフォルトの名無しさん
09/08/21 20:55:24
>> 未だにクラス名やそのメンバ名を直接 XAML ファイルに記述するのが気持ち悪くて仕方ありません。
>XAMLに記述するのはViewModelのクラスのだから問題ない
どうにもバインディングを勘違いしていました。
特に制約無く作ったデータでもバインディングは行えるものとして考えていました。
バインディングは特定のインタフェースを実装したクラスしか不可能なのですね。

962:デフォルトの名無しさん
09/08/21 21:01:05
>>961
>バインディングは特定のインタフェースを実装したクラスしか不可能なのですね。
違う。
設計の問題で、バインディング自体にそういう制限は無い。

963:デフォルトの名無しさん
09/08/22 00:13:55
>>960
このレベルの自分で頭使わないで文句言うタイプには「黙って書いとけ」が正しい。

964:デフォルトの名無しさん
09/08/22 00:39:36
""(空文字列)との比較は以下のどれがいいですか?
それぞれのメリット・デメリットを教えてください。

①str.Equals("")
②String.Equals(str, "")
③str == ""
④srt.Length == 0
⑤"".Equals(str)

965:デフォルトの名無しさん
09/08/22 00:45:34
個人的には3
他は4以外objectで比較できちゃう
14はstrがnullのときを考慮しないといけない

でも大体はString.IsNullOrEmptyで片付けるかな

966:デフォルトの名無しさん
09/08/22 00:46:47
あくまで個人的な意見だけど。
俺は「str==""」が一番シンプルかつ直感的でいいと思うね。

1. 参照アドレスの比較と差別化するという意味合いはご尤もだが…。ここまでする必要あるかなぁ。
2. 冗長。
4. 使う場面による。文字列自体に着目した流れで来てるのか、
  文字列の長さに着目した流れで来てるのか、というのが判断基準。
5. これは逆。どういう意図でこう書くんだろう。

967:デフォルトの名無しさん
09/08/22 00:58:15
5の書き方はJavaかなんかでこうするのがイイ
みたいなのがどっかに載ってた気がする(そして当然叩かれてた)

C#だと3かIsNullOrEmptyだよね。

968:デフォルトの名無しさん
09/08/22 01:05:59
fxcopにIsNullOrEmpty使えっていわれたような

969:デフォルトの名無しさん
09/08/22 01:14:50
C#の世界でも割と「==使うなEquals()使え」っていう教条主義的意見は
見かけるね。

というか、俺の見解では、そもそも==がデフォで参照等価の検査なのが直感的じゃない。
少なくともこれに関してはVBの方がまともに感じる。
つまり、参照等価の検査用には別の演算子を導入することにして、==の方は
値等価用にオーバーロードしないと使えない方が分かりやすい。

まあそれを言うと、そもそもC由来の=と==からして逆なんじゃないのかとも思うが…

970:デフォルトの名無しさん
09/08/22 01:34:35
しかし値の同一性ってのはデフォで定義できない

971:デフォルトの名無しさん
09/08/22 01:40:47
⑥str == string.Empty

972:デフォルトの名無しさん
09/08/22 01:42:52
IsNullOrEmpty 派です。

973:デフォルトの名無しさん
09/08/22 02:14:56
>>966
>5. これは逆。どういう意図でこう書くんだろう。
これはリテラルのequals()呼び出しだから、コンパイラが最適化してくれる
可能性がある、という説明で自分は納得した。
実際のところ本当かは検証したわけじゃないけど、どう再定義してるかわか
んないstrのequals()を呼び出すよりは速い可能性があるというだけで充分
に意味はあると考えてる。

974:デフォルトの名無しさん
09/08/22 02:22:55
Javaでの話だけど、str.equals("")だとstrがnullのときにぬるぽの例外になるので、
"".equals(str)がいいんだって言っていた。
でも、まともな意見の人は"".equals(str)に否定的な人が多いという印象。

975:デフォルトの名無しさん
09/08/22 02:25:37
君の印象ではなく「まともな意見」でどう否定したかが重要。

976:デフォルトの名無しさん
09/08/22 02:29:39
つか str.Equals("") とほぼ等価でかつ str が null でも大丈夫だから
だろ。2 と 3 がほぼ同じ意味であることを除けば他は意味とか前提が
色々微妙に違う

977:デフォルトの名無しさん
09/08/22 02:57:02
class Tuple<T1,T2>{ T1 _t1,T2 _t2}(アクセッサとか省略)みたいな奴で
Tuple<Hoge,HogeHoge> tuple1,tuple2の比較したいときに、class でなくstructなら_t1,_t2が各々==でtrueの時tuple1==tuple2になるんだっけ?
classでEqualsとかoverrideするのめんどくさいよ(´д`)ママン…
属性とかの指定一発でやってくれ・・・

978:デフォルトの名無しさん
09/08/22 03:46:49
>>964
俺も>>971と同じ書き方するな。
でも null と空文字列で特別に違う意味がなければ IsNullOrEmpty を使う。

979:デフォルトの名無しさん
09/08/22 05:58:42
str.Equals(string.Empty)か
String.Equals(str,stringEmpty)
だな。

javaと違って参照でも'=='が使えるのは知ってるんだけどね。


980:デフォルトの名無しさん
09/08/22 06:46:21
String以外にも話を展開してみる。

Equalsはタイプセーフではない。
Equalsをoverrideするなら==、!=もoverrideしなければならない。
a.Equals(b)はnullチェックが面倒なので、Object.Equals(a,b)が有効。


981:デフォルトの名無しさん
09/08/22 06:50:49
タイプセーフでないというのは事実だけど、型を意識しないで比較するのは個人的にはなしだ。
ライブラリ製作者と使用者で意見が食い違うところか。

982:デフォルトの名無しさん
09/08/22 07:22:05
10.0と10は違うのか?→時と場合と人による
"a"と'a'は違うのか?→〃
10と10は違うのか?→〃

しかし”参照”としての比較はドメインが”参照”に固定されているので混乱しない
値の比較はドメインが固定できないので混乱する
値の比較であーだこーだ言っていてもはじまらね

983:デフォルトの名無しさん
09/08/22 07:35:17
>>968はこれか
URLリンク(msdn.microsoft.com)

それはそうと次スレは?

984:デフォルトの名無しさん
09/08/22 08:59:39
>>980
>タイプセーフではない。(
値型以外では使うことはまずないけど
IEquatable<T>.Equals(T o)
>Equalsをoverrideするなら==、!=もoverrideしなければならない。 
Stringのようにimutableでない限りは==や!=演算子のoverrideはするべきではない。

985:デフォルトの名無しさん
09/08/22 11:02:53
なんで

986:デフォルトの名無しさん
09/08/22 12:31:41
次ぎたててくる

987:デフォルトの名無しさん
09/08/22 12:34:22
C#, C♯, C#相談室 Part54
スレリンク(tech板)

はい

988:デフォルトの名無しさん
09/08/22 12:44:02
>>987
^^

989:デフォルトの名無しさん
09/08/22 13:00:55
.NET 4では2.0の部分のパフォーマンスの向上とかあるのかな?

990:デフォルトの名無しさん
09/08/22 13:09:55
BCL部分はC#4.0などにあわせて確実に手が入るけど
WinFormsはどうせ放置だろ

991:デフォルトの名無しさん
09/08/22 13:36:55
>WinFormsはどうせ放置だろ
せっかく枯れてきたのに手を入れられてもねぇ…

992:デフォルトの名無しさん
09/08/22 13:40:42
2005以降に追加されたコントロールのバグはしっかり直してくれないと
困ると思うけど…

toolstrip関連はバグ多過ぎなんだよ本当。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch