トップページ⇒tech
1001コメント261KB

ふらっとC#,C♯,C#(初心者用) Part69

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/01/29(土) 11:39:22
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からない場合など、勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

なお、テンプレ2行目が読めない回答者は邪魔なので後述のC#相談室に移動して下さい。

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっとC#,C♯,C#(初心者用) Part68
http://hibari.2ch.net/test/read.cgi/tech/1294921393/

■関連スレ
C#, C♯, C#相談室 Part64
http://hibari.2ch.net/test/read.cgi/tech/1294734221/
VB.NET質問スレ(Part35)
http://hibari.2ch.net/test/read.cgi/tech/1284423653/
くだすれC++/CLI(初心者用)part2
http://pc12.2ch.net/test/read.cgi/tech/1268613679/

■備考
コードの量が多い場合は下記サイトを使うなどしたほうがいいかも
http://ideone.com/
コードを貼り付けてRun codeのチェックをはずしてsubmitボタンを押すと
コードを鯖側にアップして専用のアドレスが発行されます。

直接貼る場合は下記サイトなどを利用してhtmlエンコードした方が
インデントも残って見やすいです
http://kawama.jp/php/encode_html.php
0153デフォルトの名無しさん2011/02/01(火) 18:39:32
>>152
やっぱそうなのかなあ。
ちょっとTextBoxのControlTemplate見たけど、肝心のコードが絡む部分は
TemplatePart使ってるね。
http://msdn.microsoft.com/ja-jp/library/ms752068.aspx

じゃあとりあえずTextBoxに絡む機能を盛り込みたいとき用にTemplatePart用意して、
コントロールの利用者がテンプレートの定義でTextBox使うなら、バインドではなくNameで指定させる。
その他例えばBorderのコンテンツとして表示するだけ、とかはそのままプロパティをバインドさせる。

コントロールのコード部分に、表示に関するロジックがゴチャゴチャ増えるけど
そこはもう気にすんなということか。
0154デフォルトの名無しさん2011/02/01(火) 20:22:19
○年■月31日4時□分◇秒5 のような虫食いの時間と二つのDateTime 1・2がある。
datetime1<虫食いだった時間
かつ
虫食いだった時間<datetime2
を満たすような虫食いを埋める数字があるかどうかを判定したいんですがどうやったらいいですか
虫食いの数と場所と二つのDateTimeの間隔は不定です
0155デフォルトの名無しさん2011/02/01(火) 20:33:28
>>154
意味不明
0156デフォルトの名無しさん2011/02/01(火) 20:33:55
学校の課題臭がするし、本質的にはC#関係ないと思うが
年→月→日→…の順にdt1>dt2、dt1=dt2、dt1+1=dt2、dt1+1<dt2ぐらいに場合分けして考えてみれば?

まあ待ってれば誰かがLINQで書いてくれると思うよ
0157デフォルトの名無しさん2011/02/01(火) 20:34:54
既存の別言語のdll関数をDllImportで参照してるstaticクラスのスタティックメソッドがあるんだけど

いま、このスタティックメソッドを別クラスから使おうとしてるけどうまくいかない なぜだか心当たりある人いますか?
ちなみにデバッグしてみると、スタティックメソッドを実行してる行で「dll関数のdllが見つかりませんでした」って内容の例外が発生してる
0158デフォルトの名無しさん2011/02/01(火) 20:40:04
まず別言語とは何か書け
0159デフォルトの名無しさん2011/02/01(火) 20:50:31
>>157
C++です(externがある)
0160デフォルトの名無しさん2011/02/01(火) 20:52:52
extern "C"は指定した?
正しく関数がエクスポートされてることはdumpbinで確認した?
0161デフォルトの名無しさん2011/02/01(火) 21:15:52
Stopwatch.Start();
Stopwatch.Stop();
とやるだけで15ticksは進んでるんですが、
どういう事なんでしょうか、
この行間で15clockの処理が行われているという事ですか?
それともメソッドそのものが15clockで実行されてるのでしょうか
0162デフォルトの名無しさん2011/02/01(火) 21:18:37
http://msdn.microsoft.com/ja-jp/library/system.diagnostics.stopwatch.frequency%28v=VS.100%29.aspx
タイマ自体がその程度の解像度しかないんでしょ
0163デフォルトの名無しさん2011/02/01(火) 21:37:10
>>157
DLLファイルが見つからないのかDLL内に指定された関数が見つからないのかどっちよ>例外
0164デフォルトの名無しさん2011/02/01(火) 21:41:41
>>161
前者じゃないの?
Frequencyの値はCPUのクロック(の半分?)だと思えば、まあそんなもんでしょ。
0165デフォルトの名無しさん2011/02/01(火) 22:49:35
てす
0166デフォルトの名無しさん2011/02/01(火) 22:57:29
GeckoFX 1.9.1.0 を使ってるんだけど、
geckoWebBrowser1.Document.DocumentElement
を取得しようとすると、必ず、InvalidCastException が出るんだが、
解決策しってる人いたら助けて欲しい。

ちなみに VS2010&Win7(32bit)&WinForms&.Net Framwork 4
で開発してます。
0167デフォルトの名無しさん2011/02/02(水) 00:03:59
List<T>のインスタンス生成時に大きさを指定することってできますか?
0168デフォルトの名無しさん2011/02/02(水) 00:10:27
コンストラクターにint渡せば
0169デフォルトの名無しさん2011/02/02(水) 00:18:56
oh shit
0170デフォルトの名無しさん2011/02/02(水) 00:32:28
omfg
0171デフォルトの名無しさん2011/02/02(水) 00:46:39
1つのクラスを複数のソースファイルに分割して記述するにはどうしたらよいでしょうか?
0172デフォルトの名無しさん2011/02/02(水) 00:48:59
partial class
0173デフォルトの名無しさん2011/02/02(水) 00:49:02
partial
0174デフォルトの名無しさん2011/02/02(水) 00:56:21
複数のファイルに分割して書かないといけないような巨大クラス作るなよ…
あれはWinFormsのデザイナみたいにコード生成するやつで使うためにある。
0175デフォルトの名無しさん2011/02/02(水) 00:59:56
好きに使えばいいよ
0176デフォルトの名無しさん2011/02/02(水) 01:00:00
>>172-173
ありがとうございます

>>174
いえ、どー考えてもこのクラスこれっきゃねーよ
みたいな場合に無理やり意味付けしてクラスを作るのってなんか違う気がするんですよ
そんなときにC/C++だとヘッダ1つにしてソース複数にして書いていたもので・・・
0177デフォルトの名無しさん2011/02/02(水) 01:12:01
分割したくなるレベルのスパゲティコード・・・
0178デフォルトの名無しさん2011/02/02(水) 01:15:34
嫌な予感しかしないけど人に見せないなら好きにやるといい
0179デフォルトの名無しさん2011/02/02(水) 01:20:46
C++使っててクラスが肥大化しがちなのはクラス作ったりインスタンス管理したりするのが面倒だからだろ
C#は気軽にクラス増やせるから自然にクラスが小さくなると思う
0180デフォルトの名無しさん2011/02/02(水) 01:27:53
クラスは小さければ小さい方が見通しがいいに決まってるけど、
*ちゃんと設計すれば*常に小さなクラスに機能分割できるはずだ、とは俺は思わない。
0181デフォルトの名無しさん2011/02/02(水) 01:35:51
クラスの大きさそのものに注目することはあまりないな
0182デフォルトの名無しさん2011/02/02(水) 01:41:35
具体的にいうとゲームのステージなんですけどね
プレイヤ、敵A、B、C、壁、地面、扉、弾、敵弾、爆発A、B、C的なものが
仕様によって相互に影響しあうんですけど

これってやっぱりステージはステージ以外なにものでもないじゃないですか?
(それぞれ意味わかんねーよって人は無視してください、説明するのが面倒ですw)
0183デフォルトの名無しさん2011/02/02(水) 01:50:44
好きに使えばいいよw
0184デフォルトの名無しさん2011/02/02(水) 02:06:23
オブジェクトというより名前空間みたいなもんだよねそれ
別にそれが悪いとも思わないし自分で作ってもそんな感じになりそうだけど
0185デフォルトの名無しさん2011/02/02(水) 02:15:38
俺もゲームだと無駄に複雑になりがちだったけど
デリゲートやイテレータブロックを使うようになってからはましになったな
0186デフォルトの名無しさん2011/02/02(水) 02:16:14
C#は#regionのおかげで、でかいクラスという現実から逃避できるのは有り難い
0187デフォルトの名無しさん2011/02/02(水) 02:29:06
regionを律儀に付けるのも面倒くさくなってきたんだが
0188デフォルトの名無しさん2011/02/02(水) 02:33:34
オブジェクトブラウザがあるじゃあないか。
0189デフォルトの名無しさん2011/02/02(水) 02:44:24
メソッドが長くなった時、分けるのめんどくさくなってregionで誤魔化すことがある・・・いいのか?
0190デフォルトの名無しさん2011/02/02(水) 02:44:26
>>182
それぞれのステージオブジェクトごとにクラスにしていけば普通に分割できそうな気もしつつ、
多重ディスパッチする場合は、確かに1クラス大きくなることはあるなぁ。
ビジターパターンみたいなのもあるけど、あれが書きやすいとも思えず。
0191デフォルトの名無しさん2011/02/02(水) 10:52:12
string s="aewta"のような文字列を
"aaetw"になるようアルファベット順でソートしたいんですが、どうすればいいですか?
0192デフォルトの名無しさん2011/02/02(水) 10:56:16
charの配列と考えて好きなソート使えば
0193デフォルトの名無しさん2011/02/02(水) 13:55:17
文字列の中の一カ所だけをreplaceしたい時はどうすればいいですか?
str.Replace('a','1')
だと文字列中のaが全て1になってしまいます。
0194デフォルトの名無しさん2011/02/02(水) 14:01:16
>>193
条件が決まってるなら簡単じゃね?
最初にでてきた'a'をリプレースとかさ

そういう条件は無いの?
0195デフォルトの名無しさん2011/02/02(水) 14:18:20
特定の箇所(str[x])を置換したいんですけど、単純に
str[x]='1';
だと読み取り専用だからアカンって言われます。
0196デフォルトの名無しさん2011/02/02(水) 14:25:14
昔のVBだとMid(str, x, 1) = "1"とか意味不明な構文があって便利だったんだがな
って調べてみたらVB.NETでも使えるのかw

Substring駆使するかToCharArrayでcharの配列にしてうんたらかんたらだな
0197デフォルトの名無しさん2011/02/02(水) 14:31:14
>>193
IndexOf()で探してSubstring()で置き換えれば
0198デフォルトの名無しさん2011/02/02(水) 14:48:31
そんなあなたにStringBuilder
01991952011/02/02(水) 14:51:35
一旦removeしてinsertする事にしました。
0200デフォルトの名無しさん2011/02/02(水) 16:58:57
C# 4.0 でファイルを保存する部分を作成しているのですが少し教えてください。

現在5秒に1つの画像データ(1つ1MByte)を作成し、それを24時間365日動作させようとしています。
この時、保存される場所はネットワークディスク(LANDISK)上に作成されます。

通常ネットワーク的に問題なければ保存処理は成功すると思いますが、
何らかの原因でネットワークが切断された時に一旦ローカルへ保存するようにしたいと考えています。

上記前提条件の上で保存処理をFileStreamのBeginWriteを使用し非同期的に処理したいと考えています。
保存順序が処理順序にならなくても構わないのですが、存在しなくなったネットワークに書き込みを行うと
呼び出し元スレッドが固まるのでそのようにしたいと考えています。

例えば30秒固まったとしてその間にもどんどんファイルを保存しようとBeginWriteが呼び出されるようになると思うのですが、実際はこういう運用は問題ありそうでしょうか?
もし、なにかスマートな方法があればいいのですが・・・
(例えばキューに入れてそっちで処理させるとか)
スレッドプールを使用しようとも考えたのですが、ほかの場所でちょこちょことBerginInvokeで表示等を行っている為スレッドプールでスレッドを止める処理が多発した時にUIが固まりそうでちょっとやめてみました。
色々検証して試してみるのがいいんですが、ひとまず動かし始めるまでに時間があまりないので運用だけ開始してあとで変更する方向です。

ぶっちゃけた話、少々バグってても個人的な用途なので問題はないのですが・・・
安定稼働を目指したいのです。

ファイルのサイズ・削除処理等は今の段階では放置しておいてください。

0201デフォルトの名無しさん2011/02/02(水) 17:04:39
ファイルはローカルに保存する。
コピーは別プロセスで。
0202デフォルトの名無しさん2011/02/02(水) 17:08:52
常に最初にローカルに保存しておいて
NASへの保存が成功した時点でローカルを消す
0203デフォルトの名無しさん2011/02/02(水) 17:11:52
長いことC嫌いで通してきたけどブルーバックスの見てわかるC言語入門(CD−ROM同梱 を買ってきた。

なんでも聞いてくれ。
0204デフォルトの名無しさん2011/02/02(水) 17:16:00
困ったときのTask
0205デフォルトの名無しさん2011/02/02(水) 17:22:23
>>203
なんでこのスレに来たんですか?
0206デフォルトの名無しさん2011/02/02(水) 17:28:16
ありがとうございます。

>>201-202
一旦それも考えましたが出来るだけローカルPCのHDDやSSDの寿命を削りたくないので
可能な限りローカル保存は避けておきたいのです・・・
もし、他の方法でダメならこの方法が確実に残せるかな・・・と

>>204
折角4.0使うのだからそれがよさそうな気がしてきました。
MSDN見た感じも小さな処理を回数こなす場合はこれがよさそうなことも書いてありましたし

アドバイスありがとうございました。
0207デフォルトの名無しさん2011/02/02(水) 18:28:12
>>205
初心者だからだヨ

有名なライブラリやそれでサポートされる関数なんてひとつも知らないヨ←そうゆうものだとは知っている
0208デフォルトの名無しさん2011/02/02(水) 18:44:30
>>192
それを簡単にできる方法を聞いているんですが。
要するに1行で
Sort(s.begin(),s.end())みたいに書きたいのです
0209デフォルトの名無しさん2011/02/02(水) 18:53:11
>>208
短くしたいと思う最新の候補コードを晒してみるとか
0210デフォルトの名無しさん2011/02/02(水) 18:59:58
>>208
http://ideone.com/WjM2Q
0211デフォルトの名無しさん2011/02/02(水) 19:52:44
switchの分岐はポリモーフィズムに書き換えられるっていうけど、
こういうコードの時はどう表せるの?

public Unko GetUnko(string key)
{
switch (key){
case Normal: return new NormalUnko();
case Liquid: return new LiquidUnko();
case Lumpy: return new LumpyUnko();
...
}
}

ただたんにオブジェクトを返すようなのならswitchでもいいのかな
0212デフォルトの名無しさん2011/02/02(水) 20:04:15
factories: Dictionary<string, IUnkoFactory>にUnkoの派生クラスのファクトリを登録しておいて
factories[key].CreateUnko() かな。ファクトリはFunc<Unko>でも構わない。
それかDI使う。実質同じようなもんだけど。
0213デフォルトの名無しさん2011/02/02(水) 20:05:38
>>206
5秒ごとにたった1MBのファイルを作るのになんで非同期でやる必要があるのかよく分からない。

それに、FileStreamって一旦オープンしたら、実体のディスクが切断されても
例外も吐かなければ固まるなんてこともなかった気がしたけど....
0214デフォルトの名無しさん2011/02/02(水) 21:00:33
普通は利用側の話だと思うけど一応こんな感じに書ける

public Unko GetUnko<T>() where T:Unko,new(){
    return new T();
}
0215デフォルトの名無しさん2011/02/02(水) 21:03:14
利用側が具体的な型に依存してどうする
0216デフォルトの名無しさん2011/02/02(水) 21:09:52
はあ?
0217デフォルトの名無しさん2011/02/02(水) 21:14:36
>>200
書き込み用にワーカースレッドを一つ作成。
書き込みファイル情報はキューに貯める。
まあ劣化Producer-Consumerパターンみたいな感じで行ける。
Write処理自体を非同期でやるのは今回に関してはあまり意味ないからやめとけ。
確かスレッドセーフなBlockingQueueみたいのも.NET4じゃできてたと思うから簡単だろ。
ああ、まあもちろんTaskでやってもいいけど。
0218デフォルトの名無しさん2011/02/02(水) 21:25:15
>>214が要件を満たすには、
(Unko)GetMethod("GetUnko").MakeGenericMethod(types[key]).Invoke(this);って動的に型指定して使わないといかんね
そんなことするんだったらActivatorに渡すだろ
まさにUnko
0219デフォルトの名無しさん2011/02/02(水) 21:34:45
>>211はこの手の例として始めから合ってないからw
インターフェースを守る努力とか無意味だし
0220デフォルトの名無しさん2011/02/02(水) 21:39:22
>>211は別におかしくない
Unkoを利用する側がUnkoの具体的な実装クラスを知らなくて済むようにするためのパターン
さらに、GetUnkoを提供するクラスも具体的な実装クラスを知らなくて済むようにしたいならDIになる
0221デフォルトの名無しさん2011/02/02(水) 21:48:55
>switchの分岐はポリモーフィズムに書き換えられる
こういう目的には合ってないと思うけどなぁ
もしこの例でうまく説明できるなら、頑張って教えてあげなよ
0222デフォルトの名無しさん2011/02/02(水) 21:53:51
それは>>212で答え出てるだろ
abstract factoryでFA
0223デフォルトの名無しさん2011/02/02(水) 21:59:19
VC#Express落として2時間の若輩ですが、質問です。
ポインタ操作する際に、unsafeでビルドする必要があるみたいなのですが、unsafeでビルドした際にデメリットのような物はあるのでしょうか?
BitmapData.Scan0で得たポインタに対して操作したいので、unsafeは現状避けられなさそうですが。

それと、MouseEventArgs型のボタン取得で「左ボタンだけ押されている」は簡単に処理できるのですが、「左ボタンは押されているが、他のボタンも押されている」
はどう取得すればいいのでしょうか
  if ((e.Button & MouseButtons.Left) == true)
では型エラーになってしまいます。
0224デフォルトの名無しさん2011/02/02(水) 22:01:05
こうかな
if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
0225デフォルトの名無しさん2011/02/02(水) 22:02:03
BitmapData.Scan0はunsafeでなくても配列にコピーしたりして使えたと思う
ググれば出てくるはず
0226デフォルトの名無しさん2011/02/02(水) 22:02:28
ちなみにやってることはマスクってやつね
MouseButtons.Leftの具体的な値はしらんが
0227デフォルトの名無しさん2011/02/02(水) 22:03:22
unsafeはセキュリティの制限がかけられた環境では動かなかったりする
ASP.NETとかClickOnceとかSilverlightとか(設定による)
0228デフォルトの名無しさん2011/02/02(水) 22:07:50
設定によるね
0229デフォルトの名無しさん2011/02/02(水) 22:11:32
Silverlightは問答無用でunsafe動かないけどな
0230デフォルトの名無しさん2011/02/02(水) 22:14:01
Unkoについて必死に議論するのやめw
HogeとかHageとか他のにしろやw
0231デフォルトの名無しさん2011/02/02(水) 22:17:24
IUnkoとコンクリートUnko
02322232011/02/02(水) 22:17:32
ありがとうございます。
マウスの方は問題ありませんでした。
unsafeのほうはMarshal.Copy()でbyte[]へコピー、いじった後に再度Marshal.Copy()でいけそうです。
通常のWindowsアプリなのでunsafeでポインタ操作と比較して考えてみます。
0233デフォルトの名無しさん2011/02/02(水) 22:26:17
うんこw
ファクトリーメソッドとファクトリーパターンの違いが分かってない奴多そうだな
0234デフォルトの名無しさん2011/02/02(水) 22:31:57
ポインタ操作にunsafeなんか使わなくても大抵マネージドでなんとかできるよ
0235デフォルトの名無しさん2011/02/02(水) 22:32:02
>>211のメソッド自体はFactory Methodで
>>211のswitchをポリモーフィズムで置き換えるとしたらAbstract Factoryってことだろ
0236デフォルトの名無しさん2011/02/02(水) 22:32:39
デザインパターンは間違って覚えるためにある
0237デフォルトの名無しさん2011/02/02(水) 22:37:39
別にGoFの信者やってるわけでもないし
0238デフォルトの名無しさん2011/02/02(水) 22:42:10
パターンの目的を忘れて不必要に複雑にしちゃうんだよな
0239デフォルトの名無しさん2011/02/02(水) 22:45:21
>>235
速攻で間違えんなw
0240デフォルトの名無しさん2011/02/02(水) 23:01:03
テンプレートパターンでなくても>>211みたいなのをUnkoのファクトリメソッドと呼ぶことはあるよ
XmlReader.Createはfactory methodとMSDNに書かれてる
0241デフォルトの名無しさん2011/02/02(水) 23:03:29
一番いいデザインパターンを頼む
0242デフォルトの名無しさん2011/02/02(水) 23:39:38
[Export(typeof(Unko), "Normal")] class NormalUnko : Unko { }
[Export(typeof(Unko), "Lumpy")] class LumpyUnko : Unko { }
class Anus {
private CompositionContainer container;
public Unko GetUnko(string key) { return container.GetExport<Unko>(key); }
}
こうだな
0243デフォルトの名無しさん2011/02/02(水) 23:58:30
Unkoはもう禁止ね
0244デフォルトの名無しさん2011/02/03(木) 00:13:37
FooとかBarとかにだな
0245デフォルトの名無しさん2011/02/03(木) 00:17:19
でも何でもいい言葉としてはFooやBarより優れてるな
バリエーションも作りやすいしanus.GetUnkoとか超わかりやすく意図を表現できるじゃん
0246デフォルトの名無しさん2011/02/03(木) 00:28:34
くだらねぇ
0247デフォルトの名無しさん2011/02/03(木) 00:35:23
俺はhogeとかの代わりにunkoをよく使ってるが、普通じゃなかったのか。
0248デフォルトの名無しさん2011/02/03(木) 00:41:00
意味のない言葉であるという共通認識は十分すぎるほどだな
0249デフォルトの名無しさん2011/02/03(木) 00:48:22
絶対に名前を修正しなければならない と迫るにはいい・・・・・・のか?
0250デフォルトの名無しさん2011/02/03(木) 04:49:24
newするだけのクラスにAbstract Factoryを使うというのに衝撃を受けたわw
0251デフォルトの名無しさん2011/02/03(木) 05:04:43
俺もデザパタ覚えたての頃は何にでも適用しまくってたものさ
0252デフォルトの名無しさん2011/02/03(木) 10:45:54
IWebRequestCreateなんかそんな感じじゃね
>>242みたいなことやりだすとfactoryだらけのマジキチコードになるが
Javaワールドではやたらと有難がられるスタイルだ
■ このスレッドは過去ログ倉庫に格納されています