1 :
デフォルトの名無しさん :
2010/05/16(日) 23:13:52
-- .._ , ´ ー-ミ `丶、 / ' , `ヽ/´. -ヽ . ′' ¦ 厶>ー-'´‐¬ | l i l | L! | l ! i l レ-‐ '⌒LI | l 」 にコ,. _- 斤L.! l l lf| l |ィ ハ-‐┐イソ リ| !.l l | 代ソ ,几`..ィ | V ! | i i| ` ̄ ' ノi,⊥、 j l ! ! ! l| ー_'´∠-'─‐'ァ、 ゆっくりしていってね! . 厶ノl l l li l|` ァーr'^7ー,⊆ニ´ イ /⌒ヽ`、| | |l l| / ハ V /フニ二ブ、 /^ヽ ヽ ヽ`ヽ、{__'ノ `、V´ ヽ. \ i 丶 ヽ ヽ 〉V_∠___ヽ ヽ . l V `、`、 _.. - ニ -ヘ `、 ノ lヘ ヽ. l 二 -' 囘 ヽ `ー' . lヽ l l ,. -‐┴゙- 、 ', Tー---‐r' l / 二7´ 丿 l l ノ ,ニ7’.イ ) ) . l ム- ´ / ̄ _||'´ノハ (⌒ く l '´ ∠ -‐ '´ ||´ / ハ、 ( _.. -‐)‐- . l / ` ー ∥ / i , ´_.. -‐‐‐- . ,ハ. /`丶、_ __ ∥_.. ..._ |f , ´c ~⌒ { `7丁 ヾニ二ブ |'、 ~ (つ ヽ ,′l _, -'´ | ` ー----‐ ´ l ¦ _, -'´ _, -'´! | | _, -'´ `ヽ ` ー- .._.. -
3 :
デフォルトの名無しさん :2010/05/17(月) 22:41:30
C#初心者です。やりたいことはWebアプリでキーボードのEnterキーを押すと テキストボックス内のワードで検索する、ということです。 まず、ファイル名.aspx内に <body onkeydown="click_sub()" <script language="Javascript"> function click_sub() { if(windows.event.keyCode == 13) { CallServer("",""); }
C#初心者です。やりたいことはWebアプリでキーボードのEnterキーを押すと
テキストボックス内のワードで検索する、ということです。
まず、ファイル名.aspx内に
<body onkeydown="click_sub()"
<script language="Javascript">
<!--
function click_sub() {
if(windows.event.keyCode == 13) {
CallServer("","");
}
}
function ReceiveServerData(rBValue) {
window.open('Search.aspx', '検索')
}
略
と追加し、ファイル名.aspx.csのPage_Load(object sender, EventArgs e)に
callbackScript ="function CallServer(arg, contexct)" +
"{" + cbReference + ";};
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
"CallServer", callbackScript, true);
と追加しました。
public void RaiseCallbackEvent(String evenArguemnt)
でtxtSearch.Textの中が空になってしまい、
文字列が正常に取得できません。
デバッグでこの処理まで来るのは確認しましたが、
テキストボックスの値が何も入っていません。
ボタンクリックイベントだと正常に取得できました。
txtSearchに親の名前空間が必要なのでしょうか?
うまく説明できませんが、よろしくお願いします。
>>3 は失敗しました。申し訳ありませんでした。
普通にPostすればいいじゃん。
>>4 その提示したソース以外の所に問題があるな
具体的にはTextBoxにrunat="server"ねーだろ?
>>5-6 ありがとうございました。
その辺で調べてみます。
プロパティグリッドのカテゴリを任意の順番にする方法を教えてください。 プロパティの順番を任意に変える方法はすぐ見つかったんですが、カテゴリの 並び順を変えるのってなかなか見つからないです。
カテゴリ名の先頭にタブ文字(\t)を入れまくる プロパティグリッドねえ あんまり非プログラマに触らせるようなもんじゃないと思う
10 :
8 :2010/05/19(水) 08:38:14
>>9 ありがとう!
なるほどタブ文字とはね。
これは思いつきませんでした。
>>10 人生で初めてお礼を言われたように思う
うひょーw
>>11 おめでとう!
おめでとう!!
おめでとう!!!
app.configって配列が扱えないんだけど どうしても使いたい場合、XmlDocumentで読み込まないといけないのかな?
カンマで区切ってSplit、という悲しい技を使ったことがある。
文字列ならStringCollectionが使えるだろ
EXEと同じ場所に設定保存する簡単な仕組みがあったらよかったのになぁー
17 :
デフォルトの名無しさん :2010/05/20(木) 23:38:26
xmlシリアラザー使えばいいんじゃないの?
あれやこれやと便利なものを提供されてるにもかかわらずこのざまですよ
CFにはapp.config無いので自前で用意したのを使ってる
20 :
デフォルトの名無しさん :2010/05/21(金) 00:01:25
保存場所の問題はXPのあれな状態が長期できちゃって ユーザーに変な癖が付いてるのが最大のネックだと思います。 UACとか理解してくれるならありがたい機能をバシバシ使いますがな それとベビーカーのCM?やってたけど多すぎると迷ったりするんですよ あれこれ試す労力も大変なのでふら~とこういとことで 何かいい方法な~い?と愚痴をこぼすんですよ
MSの言うとおりレジストリに保存すればよろしい
>>17 いまはそうしてるけど、せっかくVS標準のがあるんだから
あれが使えたらな~って思ってさ
Windows Vista/7対応をうたっておきながら実行ファイルと同じ場所に設定を保存しようとする男の人って
ちゃんとレジストリ使おうね
XPだって管理者以外は正常に動作しないけどね。 (ProgramFiles以下にインストールした場合) プログラマでもWin9x時代のラフな考え方をむしろ「俺はわかってるんだ」 みたいに勘違いしてる奴が未だに多いのは困ったもんだね
>>23 世の中にはポータブル版っていうのがあるんだよ
誰もポータブル版の話なんてしてないだろ
>>26 Program Files内にポータブル版をぶちこむのがそもそもの誤りだと気付けよww
29 :
デフォルトの名無しさん :2010/05/21(金) 02:14:23
>>28 Program Files内に入れないといけないと勝手に思いこんでるのかw
どうしようもないなw
設定を保存してないのにファイルを開くダイアログの ファイルを開く場所が前回開いた場所になってる ちゃんとアプリごとに OSがやってると思うんだけど、どこに設定保存してるんだろう?
別にアプリごとに保存してるわけじゃないように思うんだが、そうでもないのかね。
昔作ったアプリを数ヶ月ぶりに起動してファイルを開くダイアログを開いてみたら、 きちんと前にそのアプリで開いたファイルのフォルダを表示したから、OSが情報を保持してるはず 俺、開いた場所を保存して、次回起動時に読み込んでダイアログに設定するとか、どれ一つやってない
あ、ごめん、C#2008で作ってなかった・・・Delphi6で作ったんだった・・・ C#だとファイルを開くダイアログの挙動が違うかも・・・
今は、レジストリではなく、AppDataに保存が推奨されている。
XMLシリアライザって、なんで多元配列使えないんだよ
多元配列なんて子供が使うもんだよ
>>32 コモンファイルダイアログはシェルの管轄
最後に選択した場所の基本的に実行ファイル名で管理してるな
なにそれこわい
最近は猿がプログラミングしてるのか。
×猿がプログラミングしてる ○猿が居着いている
>>45 それ、ダイアログによって変更されるカレントディレクトリを元に戻すかどうかじゃね?
EWF周辺をC#で触ってるんだけど、 一箇所C#での書き方があったので教えてください。 typedef struct _EWF_VOLUME_NAME_ENTRY { struct _EWF_VOLUME_NAME_ENTRY * Next; WCHAR Name[1]; } EWF_VOLUME_NAME_ENTRY, *PEWF_VOLUME_NAME_ENTRY; この構造体の定義をC#で書き直すとどのように書くのですか?
不定長(を目的とした)構造体は型として記述できない
50 :
48 :2010/05/21(金) 21:08:40
>>49 んー・・・そうですか。。。
ありがとです。VC++でラップdll作るか…。
iPhone SDKのUITableViewみたいに、リストの各項目をカスタマイズできるコントロールってないですか? ListView + ListViewItemでは無理ですよね。 どこかにオープンソースなライブラリはないものでしょうか。 自前で作ると結構大変そうで・・・
53 :
デフォルトの名無しさん :2010/05/22(土) 13:40:28
自作するか既存のコントロールのオーナードロー関連を利用して 自分で描画部分を書くか 後はWPFへいくか・・・
どぼんの
http://dobon.net/vb/dotnet/process/standardoutput.html のソースを実行しても、
resultに結果を取得できる端末とは空文字列しか拾えない端末があります。
共にDOS窓でdirを実行したら、ディレクトリ情報は表示されます。
何か権限とかあるのでしょうか?
System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
//ComSpecのパスを取得する
psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
//出力を読み取れるようにする
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
//ウィンドウを表示しないようにする
psi.CreateNoWindow = true;
//コマンドラインを指定("/c"は実行後閉じるために必要)
psi.Arguments = @"/c dir c:\ /w";
//起動
System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
//出力を読み取る
string results = p.StandardOutput.ReadToEnd();
//WaitForExitはReadToEndの後である必要がある
//(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit();
//出力された結果を表示
Console.WriteLine(results);
VB.netのStartupNextInstance実装ってどうやってるのかな。 とりあえず、名前付きパイプで同じ事しようと書き始めたけど、 起動中に、名前付きパイプを開っぱなしにしていいものかどうか 気になってきた。 具体的には、二重起動を禁止して、 後から起動されたプログラムのコマンドラインを取得したい。
>>55 C#で同じことをやる方法がどこかに公開されてたはずだから、ググれば出てくるよきっと。
会社のブラウザにはブックマークしてあるんだが...
まあでも、スタートアッププロジェクトをVBにすれば妙な技巧を使う必要もないな。
IpcChannelとか
同じ事がしたいだけなら、 Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBaseの派生クラス作って IsSingleInstanceとかコンストラクタで設定、 でApplication.Runの代わりにそいつのRunを使えばよい
59 :
55 :2010/05/22(土) 15:03:32
VBのスタートアップ使うですか。 ちょっと抵抗が・・・w
60 :
デフォルトの名無しさん :2010/05/22(土) 15:13:16
学校のC言語のレポート課題なんですが、少し知恵を分けてください。 問題:5個の値を入力してその中にひとつでも偶数があれば『偶』、奇数しかなければ『奇』と出力するプログラム (※複数個の偶数があったとしても『偶』と表示するのは1回だけとする) 途中まではこんな風に書いてみたのですが #include<stdio.h> int main(void){ int x[5]; int i; for(i=0;i<=4;i=i+1){ printf("x[%d]を入力してください。\n",i); scanf("%d",&x[i]); } if (x[i] % 2 == 0){ printf("偶\n"); } else{ printf("奇\n"); } return 0; }
61 :
デフォルトの名無しさん :2010/05/22(土) 15:16:02
62 :
55 :2010/05/22(土) 15:16:26
IpcChannelでググったら、沢山見つかったけど、 内部で名前付きパイプ使ってるとの情報がw このまま、名前付きパイプでやってみます。 どうもでした。
.NETのリモーティングは.NETのオブジェクトをプロセス間で受け渡しできるところが キモなんで、その必要がなければ名前付きパイプでも十分かもね。
64 :
52 :2010/05/22(土) 18:01:07
>>53 WPFってスレもないようですが、どうなんでしょう?
ひょっとして死亡フラグ立ってますか?
66 :
52 :2010/05/22(土) 19:45:22
>>65 なんかだめぽな感じですね・・・
こうまでマイクロソフトの凋落が激しいと逆に応援したくなります
Slievrlight3でデスクトップアプリもいける?ようなので、そっちを模索してみます。
結局、.net + C#のコントロールって従来のWindowsAPI準拠のものがほとんどですからね。
Silverlight3のブラウザ外実行は全く使い物にならん デスクトップアプリはSilverlight4から
ドラクエじゃねえんだから3だの4だの短期間にアホみたいにバージョンアップしないで欲しいよw
糞でかい.NETとは違ってどうせインストール1分だからそんなに問題にならないんでしょ JavaFXみたいにフェードアウトするよりはマシ
>>60 #include <stdio.h>
int main(void){
int a,b=1,c;
for(c=0;c<5;c++)
{
printf("値を入力してください。\n");
scanf("%d",&a);
b*=(a%2);
}
printf((b==0)?"偶\n":"奇\n");
return(0);
}
72 :
52 :2010/05/22(土) 23:24:10
>>67 なるほど。4は開発環境まだRCみたいですが、やってみます。
Silverlightには未来があると信じたい。
73 :
デフォルトの名無しさん :2010/05/23(日) 11:50:39
HTML5でFlashがいらなくなるって話だけどSliverlightがこの先生きのこるには
ガキくさ。 2chだからって無理して面白くしようとか(いや全く面白くもなんともないが) 思わなくていいのに。
>>73 それはない。
HTML5、標準ってのが強みでも弱みでもあって、
弱み的には、機能充実が遅すぎて Flash とか Silverlight の代替にはならない。
段々スレチだが、個人的にデスクトップアプリ構築環境として、 ・マルチプラットフォーム ・HTMLで画面デザインできる ものとしてSilverlightに期待したい。 Adobeの開発環境は好きになれない。 特定のプラットフォーム依存のものは、もう未来がないと思う。 C# + .netはマルチプラットフォーム普及に失敗したので、 残念ながら、もう勉強する価値があると思えない。 培った技術は、Silverlightとかに受け継がれればよいけど。
お前がそう思うんならそうなんだろう お前ん中ではな
全然外してるけどな。
>>76 monoガン無視とは恐れ入る
・HTMLで画面デザインできる
ってのも意味不明だが。
今すぐコードを書いて来週には環境依存でもなんでもいいからとにかく動く物を納品しなきゃいけないのに そんな遠い未来の話やら理想論を真面目に語られてもなあ まあ学生さんはがんばってねとしか
デスクトップアプリでマルチプラットフォームなんてファンタジーまだ信じてる人いたんだ
>>80 >まあ学生さんはがんばってねとしか
あるあるw
HTML界隈はそういうの本当に多かった。
まー標準()笑 に夢みんのは学生までにしとけってこったな HTML5だってまたどーせブラウザ依存でgdgdだよ 船頭多くて上手く行った例なんか見たことないわ
84 :
デフォルトの名無しさん :2010/05/23(日) 16:47:43
.NET4の透過セキュリティモデルが分かりません。 例えばFileIOPermissionが制限されたサンドボックスのTransparentコードから SafeCritical/Criticalのアセンブリへの遷移してFileIOを行う場合に、 遷移したことで自動的に完全信頼になりファイル操作が出来るようになるのか、 Assertが必要なのかこの辺はどうなのでしょう。
プリントスクリーンや外部ツールの画面キャプチャで画面を撮られないように、 キャプチャ時にウィンドウに画像を被せるとかのマスク処理をしたいです。 (Acrobatで同じようなことをやってると思います) .NETで画面キャプチャイベント拾えないかなぁと探してるんですが、 それっぽい情報に見あたらないです。 何かやりようがありますでしょうか。
>>86 それ抜け道たくさんあるからやるだけ無駄だよ
デジカメで撮る。
90 :
デフォルトの名無しさん :2010/05/23(日) 18:22:58
ローレベルなところでフックなんて使われたらどうしようもないしなあ flashゲームなどのチートの際に使うツールは別プロセスのメモリ 覗き放題だしねえ windowsで完璧なプロテクトは無理と思ったほうがいいよ
>>86 OSが頑張って保護している地デジを表示しているWMCの画面も
キャプチャできるアプリがあるのにどうやってブロックできると思うんだ?
>>90 うーん、じゃあ例えば、クローズドな社内システムか何かで、
ユーザが勝手にソフトやツールを追加できないって前提ならどうでしょう。
社員にPC使わせなければいいんじゃね?
94 :
デフォルトの名無しさん :2010/05/23(日) 18:53:16
汎用のOSや汎用の部品使ってるうちは無理だしなあ
それに最近のマシンはディスプレイアウトが高画質だし
それ経由で簡単にキャプチャできちゃうからフック系だけ気に
してればいいわけじゃないしね
あと
>>89 のようなのもあるしw
うーん、読み取れるようにするのかあ
89は最強だよな
映画ではプロテクト用に人の目には分からないように赤外線も出力して カメラで撮ったらまともに見れないようにしてるというものがあったと思った。
>>97 それは実験段階で、導入した劇場はまだなかったはず。
うちの会社はデジカメ持ち込み禁止。カメラ付き携帯も禁止で、入社すると強制的に機種変させられる。
100 :
デフォルトの名無しさん :2010/05/23(日) 20:20:47
そういや守秘義務守るために プリンタ出力禁止とかUSB書き込み禁止するシステムは結構あるけど デジカメ阻止するようなのはあんまりないね。
常にモニタの前をWebカムで撮って、デジカメに類する機器を検出したら画面を 切り替えるような仕組みを作ればいいんじゃね?
レベルの高いスレですね。 僕もいつかは皆さんのような高度な話題を展開できるようになりたいと思います。
デジカメ対策するなら、 OSやソフトじゃなくモニタにつけるスクリーンやシートの役割じゃね?
なんとかしてデジカメ阻止したとしても 手書きのメモとか脳内コピーはどうしようもないよな
>>102 Web カムで顔認識して PC の前に人がくるとメール飛すアプリは公開されてたな。
>>105 まあ、悪意あるヤツはどう防御線張っても乗り越えて盗むってことだな。
ソフトやハードでは、悪意無く漏洩してしまう場合の対策だろうな。
>>100 ものすごく選択肢が狭くなるけど、あることはある。
だから同期はほとんどみんな同じ機種。区別するためにストラップ必須。
>>99 まだ導入されてないのか。
映画を見るたびにミスターVTRが出てくるのが鬱陶しく思うんだよね。
>>108 もしITの仕事についててスマホが使えないってのは勿体無いと思うんだが、
難しいところだよな。。。
標準スクリーンショットを封じたいのならオーバーレイ使えばいいじゃない と言おうと思ったがAeroだとオーバーレイそのものがなかったでござるの巻
現在C#を使ってWEBページからデータを取得しようと考えています。 urlを指定して取得することはできたのですが、ajaxによって送信されてくるデータを取得できなくて困っています。 post形式でデータを送信していることはfirebugを使ってわかっているのですが、 どうすればそのpostデータを使ってxmlを取得できるのかがわかりません。 WebClient wc = new WebClient(); byte[] res_data = wc.UploadValues(url, post); こんな感じでやってみたところできませんでした。 たぶん使うメソッドが間違っていると思うのですが、何を使えばいいのかわかりません。 どなたかよろしくお願いします。
スクリーンショット封じると無条件で仮想環境リモートデスクトップ不可という ハメ技に陥るんじゃないか?
115 :
デフォルトの名無しさん :2010/05/23(日) 23:26:29
116 :
デフォルトの名無しさん :2010/05/23(日) 23:27:34
パケットキャプチャしてみれば?
>>113 ajaxって言ってるから、多分JSONかSOAPでWSDLのどちらか。とか知ったかしてみよう。
119 :
デフォルトの名無しさん :2010/05/23(日) 23:32:31
>>118 その辺だって結局postかgetリクエスト作って通信してるだけでしょ?
>>115 で可能だよ
>>113 C#でpostして、そのレスポンスが欲しいってことかな?
Ajaxっても、普通のHTTPのpost通信だから、
HTTPリクエストとHTTPレスポンスを使ったらできないかな?
見当違いのこと言ってたらゴメン。
>>99 ああ、逆にザルのパターンだなそれ
セキュリティについてまじめに取り組まないからそんな雑なことになってる
123 :
113 :2010/05/24(月) 00:00:53
>>115 ,117,118,119,120,122
皆様アドバイスありがとうございました。
無事取得することができました。
どうやら問題は122さんがおっしゃっていた通り文字コードでした。
本当にありがとうございました。
セキュリティ対策って結局は対外的なポーズに過ぎないんだろうな。 悪意のある人間に対しては何をやっても無駄な気がする。
犯罪者予備軍を諦めさせるための抑止力として相手にセキュリティ対策してるよってことが伝わるだけでいいんだよ そこから踏み込んでくるやつは仕方ない
そうだよね。 そこらへんに落ちてるツールで攻撃してくるようなのをはねるだけでも 充分な効果があると思うぜ
で、抑止力としてのプリントスクリーン禁止はどうやりゃいいの
キーボードから PrintScreenキーを外す。
スクリーンキーボードから PrintScreenキーを外すのってどうやるの?
本気でやるならドライバレベルで無効化しようぜ
カメラで撮影されたら(ry
監視カメラ
さすがC#スレ れべるのたかいぷろぐらむだんぎですね
List<>の全要素中の条件にあう要素を削除したい場合、 foreachじゃなくてforでCount分だけ回して削除した時だけi--するっていうのが一般的ですかね?
後ろから削除する
RemoveAll
後ろから削除する方法もありますね。 どちらにせよforで泥臭くやるんですね。 もっとスマートなやり方が無いのか気になっただけでした。
もいっこList<>作ってforeachで残す奴だけコピーして差し替え。 としているが問題はない。(作りによるかもしれないが)
selectしてdeleteとかできないんだっけ。 もしくはdeleteifみたいなのとか。
142 :
141 :2010/05/26(水) 00:17:18
すまんすまん。137で解決してたわ
見逃してました。
>>137 さんありがとうございます。
RemoveAllってAllって名前が悪いよな 要素全部消すみたいに思えるじゃん
会社じゃ未だにVS2005だから匿名メソッドが書きにくくて困る。
146 :
デフォルトの名無しさん :2010/05/26(水) 00:24:53
「Clearは参照をnullにして実体はGCにおまかせ、RemoveAllは実体も同時に消す」 みたいな機能があるのかな?と思った それにしてもなんで"All"なんだ
148 :
デフォルトの名無しさん :2010/05/26(水) 00:31:16
>>147 Clearはリスト全部切り離すはずだよw
Removeは指定した物をRemoveAllは該当するもの全部ってことじゃないの?
FindAllと並べたかったんじゃないかな
みんなも一度はRemoveRangeしかねーじゃないかといらついた経験があるのか
fortranのwhere文みたいのねえのかな
LINQのWhereじゃダメなん?
>>148 肝心の「該当するもの」って部分が欠けてるだろw
ほほう
RemoveAllは、あとから追加されたHashSetでは反省してか名前がRemoveWhereになってるね。
IList<T>&IDictionary<TKey, TValue> … RemoveAll ISet<T>(HashSet&SortedSet) … RemoveWhere リストと辞書がRemoveAllなのは過去のバージョンとの整合性もあって仕方ないか。
RemoveIf がよかった
追加してRemoveAllをobsoluteにすればよかったのにそうしなかったのには何か意図が、、、なさそうだな
そんなことしたらほとんどのプロジェクトで警告出まくってえらいことになる ほんとはList<T>のFind**/Exists/TrueForAllあたりも LINQが無かったころの遺物なので(実際Silverlightでは削除)軒並みObsoleteにするべき
TrueForAll を素直に LINQ で書くにはどうすればいいの
Enumerable.All
RemoveAll すべてわすれる
実際にコード中で使うときは引数込みで意味は通るだろ でもIndexOfと違ってRemoveAllだけでも意味が通っちゃうから インテリセンスやMSDNで名前だけ並ぶとわかりづらいな
Listviewについて質問させて下さい。 やりたい事は、 複数のListViewがあり、それぞれで複数の項目(item)を選択した状態を作りたいです。 4つほどのListViewを作り、それぞれで1,2項目、合わせて6ー8項目を選択して、ボタンを押したら、それに見合うデータを取得するというイメージです。 先程、作ってみた所、ListViewのフォーカスを別のListviewに移すと、それまで選択した項目が ”非選択" になってしまいます。 こうならない方法はないでしょうか? 場違いな質問という事であれば、他のスレッドを紹介していただけると助かります。 microsoft visual c# 2008 expressを使い始めて3日目で、 今までは 簡単なscript(ruby, javascript)を書いた経験があるくらいです。 ピントがずれてるのかもしれませんが、よろしくお願いします。
168 :
デフォルトの名無しさん :2010/05/27(木) 00:33:43
なにかあったな 保持する設定
169 :
167 :2010/05/27(木) 00:35:25
>>168 プロパティを探せばありそうですか?探してみます。
170 :
デフォルトの名無しさん :2010/05/27(木) 00:42:25
あった HideSelectionをtrueにすると強調表示なし falseにすると強調表示あり
171 :
167 :2010/05/27(木) 00:48:04
>>170 さん、ありがとうございます。
確かに HideSelection を falseにしたところ、選択した後が残ってました。
今から、listView2.SelectedItemsで選択したitemが取れるか確認します。
172 :
167 :2010/05/27(木) 00:52:13
ListView3.SelectedItemsで取れてました。 おかげで一歩前進しました。 ありがとうございました。
とあるファイルを監視して、そのファイルに変更があった場合、そのファイルを読み取って処理を行いたいと思っています。 しかし、イベントハンドラの中で変更されたファイルを読み取ろうとすると、TargetInvocationExceptionが発生します。 new StreamReader(e.FullPath)の部分で例外が出てしまうのですが、どうすれば読み取れるでしょうか? ■ソース private void watcher_Changed(System.Object source, System.IO.FileSystemEventArgs e){ using (StreamReader sr = new StreamReader(e.FullPath)){ } }
174 :
デフォルトの名無しさん :2010/05/27(木) 07:47:04
>>173 ファイルの監視とかなら、FileSystemWatcherじゃないの?
使ったことないけど
RemoveAll()ってCのcreat()に通じるものを感じるな
e.FullPathはちゃんと有効なパスになっているのか
>>173 TargetInvocationExceptionのInnerExceptionは?
ファイルを変更してるプログラムがまだロック中なんじゃない?
>>177 できましたありがとう。
using(FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using(StreamReader sr = new StreamReader(fs)){
string strLine = sr.ReadLine();
以下省略・・・
鱗から目です
JaneStyleなどの2ch専ブラの機能の、「
>>170 」などにマウスホバーすると、
>>170 の内容が出てきます。
これをlistviewでやりたいんですが、どのように実装すれば良いでしょうか?
VisualStudio2008を使っています。
■イメージ
名前 詳細1 詳細2 詳細3
test1 あ い う
test2 か き く ←この行でマウスホバーされたら名前と詳細1の内容から、表示する内容を決める
test3 さ し す
181 :
デフォルトの名無しさん :2010/05/28(金) 20:50:39
>>180 マウス関連のイベントでマウスが乗っかって停止したら~とかあったはず
それで任意のコントロールで表示すればいいだけちゃうの?
>>181 自分でマウスホバーと書いておいて申し訳ないんですが
MouseHoverのイベントを使用すると、かなり重いんです。
中で何も処理をしなくてもかなり重くなってしまいます。
183 :
デフォルトの名無しさん :2010/05/28(金) 21:49:35
>>182 そんなに重かったっけ?
まあ何もしないってのよりはそりゃ処理するので負荷は増えるだろうけどさ
普通にToolTip使えばええやん
>>183 ストレスを感じるくらいには重いです。
ボタン押下時に多少重くなるのはいいんですが、カーソルを移動させただけで重くなるのは避けたいです。
>>184 アドバイスありがとうございます。
わからない点があるので、わかるようでしたら教えてください。
■不明点
・マウスがListViewのどの行の上にあるのか取得できるか?(選択させるわけではないのでselectedではありません
・行ごとに説明文を変える事ができるのか?
186 :
デフォルトの名無しさん :2010/05/28(金) 23:33:11
>>185 はやくリリースビルドで速度を確認する作業に入るんだ。
解決したらしいが。。。
FreeTrain EX Avという、A列車で行こう4のクローンになりたいゲームを作ってるのですが。
http://sourceforge.jp/projects/freetrain-exav/ (最新βが2.1.1.5で、ソースは直下trunk/以下が該当します)
パラメータをリアルタイム表示するウィンドウを追加して行ってたら、データセーブ時に特定の
ウィンドウをあけっぱなしているとエラーが起こるようになってしまいました。
>アセンブリ 'FreeTrain.Core, Version=2.1.1.5, Culture=neutral, PublicKeyToken=null' の型
> 'freetrain.world.rail.StationInformationWindow' はシリアル化可能として設定されていません。
データのセーブロードはBinaryFormatterを使ったシリアライズでしています。
ウィンドウのFormをシリアライズしようとしてるわけではなく、パラメータの変化をイベント起こして
もらって表示をリフレッシュするために使ってるイベントハンドラが参照を呼んでこのウィンドウ
のシリアライズをしたがっているみたいなのです。
core/world/rail/Station.csが駅本体部分で、ここでイベントの宣言を
public delegate void StationCounterListener();
public StationCounterListener onStationChange;
とやってて、駅に乗降があったときにonStationChange();してます。
パラメータを表示してるウィンドウはcore/controllers/rail/StationInformationWindow.csで
public StationInformationWindow( Station st ) {
this.station = st;
InitializeComponent();
onUpdate();
station.onStationChange += new StationCounterListener(onUpdate);
}
ここでstation.onStationChange += の行をコメントアウトするとエラーがなくなります。
しかし他にもイベントハンドラでリアルタイム書き換えしてるウィンドウ多数あるのにエラーに
なってなくて、なぜこのウィンドウだけなるのかが分からないのです。
そのonUpdateがどうなってるかまず晒せ
ロギングにlog4net使おうかと思ってるんだけど、log4netて使いにくく無いですか? 今まで使ってた自作Loggerクラスはstaticなメソッドを一発呼ぶだけ、みたいな感じにしてたんだけど log4netだとGetLogger呼ぶ時の引数がやっかいで、簡単に自作クラスでラップできそうにないし・・・ 全クラスの先頭に private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); とかうめこんで loger.Error("えらー"); とかめんどくさいなぁ。 この辺どうやって解決してます? それともNLog使ってる人のが多い?
192 :
デフォルトの名無しさん :2010/05/29(土) 03:56:56
>>191 TraceListenerで十分だから、そんなもん使わん
参考までに教えて欲しいのですが、
>>186 でできるのはListViewだけで
checkedListboxではできないのでしょうか?
もしできるようならそっちもいろいろやってみたいのですが
MSDNを見てもそれらしいプロパティが存在しないみたいなんです。
194 :
デフォルトの名無しさん :2010/05/29(土) 08:36:30
Listbox系のアイテムの管理はstring[]だからなあ tooltip使ってみたけどcheckedListbox全体ででちゃうな 個別はできなかった
195 :
デフォルトの名無しさん :2010/05/29(土) 08:42:21
おっと自分の質問忘れるところだった 2chの通信をモニターするだけのソフトを作りたいんですが 参考になるような情報を扱ってるサイトをご存知ないでしょうか? もしくはヒントでもかまいません
>>193 >186の1.1以前と同じやり方でやればいいよ
GetItemAtの代わりにIndexFromPoint使って
197 :
デフォルトの名無しさん :2010/05/29(土) 08:58:15
C++でいう #include <shobjidl.h> #include <shlguid.h> はC#だと何になるのでしょうか?
199 :
197 :2010/05/29(土) 09:06:29
>>198 ショートカットのリンク先を取得するのにusingが分かりません
200 :
デフォルトの名無しさん :2010/05/29(土) 09:09:01
>>199 usingを知りたいのはわかるw
ヘッダーよりどの関数の代わりかで聞いたほうがいいよ
201 :
189 :2010/05/29(土) 09:29:35
>>190 こんなかんじです
private void onUpdate(){
// initialize the dialog
nameBox.Text = station.name;
label_loaded.Text = string.Format("{0} / {1}",station.LoadedToday,station.LoadedYesterday);
label_unloaded.Text = string.Format("{0} / {1}", station.UnloadedToday, station.UnloadedYesterday);
label_trains.Text = string.Format("{0} / {1}", station.TrainsToday, station.TrainsYesterday);
label_waiting.Text = string.Format("{0} / {1}",station.WaitingPassengers, station.population);
label_entering.Text = string.Format("{0} / {1}",station.WantEntering, station.entering);
label_LastUnloded.Text = station.lastUnloaded.ToString();
}
簡単なのはShell32.dllをCOMとして参照設定し、 using Shell32; で、Z:\Hoge.lnkのリンク先を得るコードはこんな感じ。 ShellFolderItemを直接得る方法があればいいんだけど、それは分からん。 Shell sh = new Shell(); Folder f = sh.NameSpace(@"Z:\"); foreach (ShellFolderItem i in f.Items()) { if (i.IsLink && i.Path == @"Z:\Hoge.lnk") { Console.WriteLine(((ShellLinkObject)i.GetLink).Target.Path); } }
203 :
202 :2010/05/29(土) 10:08:38
>>201 それに使ってるプロパティのどれかが内部的にシリアライズ使ってるか、
どっかでシリアライズしてるのがたまたま其処で発狂するかのどっちかだな
てか何処でエラー起こってんのよ?
newしてるとこじゃないんだろ
205 :
197 :2010/05/29(土) 12:12:10
>>202 ありがとうございます
試してみたところ
エラー 1 型または名前空間名 'Shell32' が見つかりませんでした。
とエラーがでてしまいます。
>>205 ちゃんと参照設定してないだろそれ
usingのことじゃないぞ>参照設定
.NET framework 4でoffice 2003のアドイン作れますか??
>>208 Dispatcher通せば別スレッドからアクセスできるよ。
>>208 System.Windows.Timerを使えばいい。
waitを掛けるって発想が大昔のBASICっぽいなw
UIでThreadを使うなって Invokeしろって意味じゃないのか?
正しくは「UIスレッドを止めるな」だな スレッドを止めたいときは別のスレッドを作る
208です BackgroundWorkerを使って別スレッドにしてみましたが結局UIを触るなってことらしく にっちもさっちも行きません Thread.Sleepで止めて、その間UIを触れないようにしました
タイマ使え ループはいらん
>>214 どこを参照してそのような知識を得たのか晒してみるといいよ
タイマーだと、タイプライターのような入力文字列によるインターバルの差や、
入力速度の揺らぎを再現しようとすると、綺麗に纏まらないな
勿論、それくらいやるよね
>>208
それでもそんなことにスレッド使うのはありえない 短い間隔で頻繁にコールバックかけて時間測るようにするだろ ゲームみたいに自分でメッセージループ回してもいい
>>214 だからDispatcher使えって。
別スレッドから、「UIスレッドでこの処理実行してくれ」ってお願いする機能。
いやそもそも普通そんなことにスレッド使わないから
>>219 普通DispatcherというとSystem.Windows.Threading.Dispatcherだが、
WinFormの話でそんなんだされても困る
>>221 あー、Control.Invoke (Delegate) のことね。
なんかって何? クリックするたびにTickのイベントハンドラが増えるとか、 TypeWriter()の引数を使っていないとか、 typewriterは1単語だからケースがおかしいとか?
C#でフォルダを作るときに変数をフォルダ名にすることはできますか?
変数を使わずにフォルダを作る方法がわかってるんだったら フォルダ名を文字列で直接指定する代わりに変数を与えればいいだけ
なぜそうしたいんですか?
>>228 すいません
それがうまくいかなくて…
>>229 例えば「5」と入力したらフォルダ1、フォルダ2、…、フォルダ5というようにフォルダを作りたいので
>>230 for (int i = 1; i <= 5; i++) {
string folder = string.Format("フォルダ{0}", i);
}
>>230 それは「変数をフォルダ名にする」じゃ言葉足らずもいいとこだろ。
var path = Path.Combine(basePath, string.Format("フォルダ{0}", i);
Dicretory.CreateDirectory(path);
とかでもダメ?
ゲ製から来た人かなあ ゲーム作るつもりなら最終的には自分でメッセージループ回すことになると思うぞ
C++の__DATE__みたいなコンパイル日付は どのように取得するのでしょうか?
無理 どうしてもやりたかったらビルド前のコマンドでコード生成
無いですか・・・残念 ありがとう
コード生成っていったって internal static class VersionInfo { public const string Date = "2010/05/31"; } こういうのを生成してcsファイルに保存する処理をスクリプトかなんかで書いてビルド前イベントで呼ぶだけ
svnのリビジョンを読み取ってソースに書き込む奴とかな。
わざわざ読み取らなくても勝手に変えてくれるよ
MSってコード生成とかメタプログラミングとか好きだから __DATE__みたいなオモチャ使わず各自で好きにやるのが普通だと思ってるんだろうな
どうしても必要ならリフレクション。
リフレクション使うにしてもコンパイル時に埋めこんどかないと無理
[assembly:CompileDate("2010/05/31")]みたいな
どっちみちコード生成が必要だから
>>238 の方が楽
244 :
239 :2010/06/01(火) 19:34:49
>>240 うわあ、今までPerlのスクリプトで処理してた・・・
>>244 まじかよw
これまでの作業量について考えるのだけはやめておくんだ!これからが大事!な!
245 のやさしさに泣いた
まぁ遠回りして勉強になることもあるし・・・ あまりにも調べが足りなさすぎるがこれも勉強だw
まあデフォルトのままだとかわらないからな
相談です。 .NET3.5でWindowsフォームアプリケーションを作成しています。 Webカメラやリモートカメラなどの映像を取り込み、その映像をリアルタイムにフォーム内に表示したいのですが、 可能でしょうか? 「webカメラ キャプチャ」等のワードで検索しても良い資料が見つからなかったので、 どなたか良い方法をご教授ください…
>>249 DirectShow辺りに答えがあるんじゃないかな?
あと、ヒントならGraphEditPlusというツールを使うのもありかも。
Directshow.NET使ってる。 普通に使える
252 :
251 :2010/06/02(水) 14:00:17
あーあとOpenCVの.NET版も試したけど使えたよ
どなたか教えてください。 機器との通信により得られた16進数の浮動小数点データ形式文字列を、 10進数にしてを表示するプログラムを作成したいのですが、よい方法はないでしょうか? <例>受信データ:42C80000 出力:100.0 といったものを作りたいのです。 なお、受信データを文字列に変換するところまでは、できています。
16進文字列をintに変換 int n = Convert.ToInt32("42C80000", 16); intを浮動小数点に変換 float f = BitConverter.ToSingle(BitConverter.GetBytes(n), 0); 100.0のような書式で出力するのはわかるよね?
255 :
デフォルトの名無しさん :2010/06/02(水) 15:00:18
その前にエンディアンとかの話は大丈夫なんだろうか・・・
受信データの例を見る限り問題無いでしょ
257 :
253 :2010/06/02(水) 15:29:16
>254さん できました。 ようやくConvert.ToInt32の意味がわかりました。 どうもありがとうございます。
フォーム内のフォーカスを初期表示時と同じにする、もしくは フォーム内のコントロールで TabIndex が一番若い番号のコントロールを 簡単に知る方法はないでしょうか? 現在複数のフォームを使うアプリを書いているのですが、 インスタンス化の処理が結構重い(DBから情報ひっぱってきてコントロールを沢山つくる)ので フォームのインスタンスを使いまわすことにしました。 Close() のかわりに Hide() を使ったまではいいのですが、 再度表示したときに当然のごとくフォーカスの位置が前回と同じなままになってしまいます。 ロードイベントあたりで先頭のコントロールに対して Select() を使って対処していますが、 コントロール名をハードコーディングしているのでデザイナでの TabIndex 変更に追従出来ていません。
>コントロール名をハードコーディングしているのでデザイナでの TabIndex 変更に追従出来ていません。 意味がわかりません
とてつもないドキュソ実装の香り。 動的なフォーム構築で追加したコントロールのTabIndex再設定ができません、と聞こえる。 手を抜かないでFormのControlsを回して設定し直せばいいんじゃね?
261 :
258 :2010/06/02(水) 21:04:19
>>259 TabIndex が一番若いコントロールを決めうちして
Load イベントで直接 Select() しちゃっています。
デザイナで順番かえたりした場合は一々 Select() を呼び出すコントローラーを変更しています。
>>260 全部を動的に追加しているわけじゃなく、いくつか固定で置いてあるものもあるんですが、
動的フォーム構築をする場合って全部の TabIndex をコードビハインド側でふりなおすのが普通なんでしょうか?
その場合ってデザイナ側での並び順がかわったら一々コードも修正しないといけないですよね?
LinQで検索でいけるじゃんと思ったけどPanelとか使ってると結構めんどくさいな
264 :
デフォルトの名無しさん :2010/06/02(水) 21:13:57
USBカメラを使って、動画を AVIファイル形式での作成の仕方はサンプルみつけたんだけど、 WMVもしくはMP4で作成できる人いる? AVI形式はサイズが大きすぎて、、、小さくしたいんだよね。
スレ違い そういうのはC#にこだわらずにC++のコードとか漁らないと
266 :
258 :2010/06/02(水) 21:22:48
自己解決しました。 フォームの VisibleChanged イベントハンドラで自分自身に対して SelectNextControl() を使うことで 希望の動作となりました。
フォームインスタンス使いまわしはクリアの処理が汚なくなりがちだからきらいだな
きちんと戦略を練られるならいいけど、タブ順の管理すらメンドクサなんていう 子のコードは信じられない。
>>268 タブ順はデザイナーで管理したい、って話じゃないの?
俺はそういうのはデザイナ側で完結してないと気持ちわるいけどな。
WPF万歳だよほんと。
コードビハインドはどっちかっつーとまだデザインの範疇じゃね? まータブ順変更しただけでコード書き換えなきゃいけないような実装はタコだと思うけど。
WPFありがたがってるのは総じてアホ
新しいものを受け付けなくなったら終わりだよ C#ユーザーってもっとミーハーが多いのかと思ってた
273 :
デフォルトの名無しさん :2010/06/02(水) 22:16:09
WPF単体だと見切る可能性大だったな SilverLightがなければやろうと思わなかった
>SilverLight ほんとにやってんの?
275 :
デフォルトの名無しさん :2010/06/02(水) 22:21:09
xamlという共通な部分があるからね 実装差違とかあるのもわかってるよ どっちかといえばsilverlightのついでにWPFやる感じ
276 :
デフォルトの名無しさん :2010/06/02(水) 22:21:36
test
xamlがわからない
xamlやるぐらいならHTML5とJavaScriptやる
たかが設定ファイルに何そんなに騒いでるの XAMLなんかDesigner.csをXMLにしただけのもの 触りたくなけりゃ触らなくてもデザイナ任せでWinForms程度のUIは作れる
なんでか、うちのWindows7じゃWPF動かんし。 動かすと「URLが正しくないため、読み込めませんでした」。 エクスプローラからダブルクリックしても全く動かない。
281 :
デフォルトの名無しさん :2010/06/02(水) 22:34:02
>>277 winformでも同じような仕組み作れるよ
Formにwebbrowser貼り付けてそこへ起動時にhtmlコード入れて
webbrowserのどれがクリックされたとかイベント処理すればOK
何を勘違いしてるのか知らんがプログラミングやるようなレベルじゃないな
283 :
280 :2010/06/02(水) 22:42:26
あ、すまん勘違い。なんかいじってた設定が悪かった。新規作成したら動いたわ。
ソフトウェアキーボードを作っています。 タブによって英数字と平仮名のキー分けてをそれぞれ実装しています ある文字ボタン(ここでは「か」と書かれたボタン)を押すとイベントが発生し、以下のような処理を行います。 private void buttonH_SA_Click(object sender, EventArgs e) { SendKeys.SendWait("ka"); //"平仮名の「か」を送りたい } このようにして、ソフト上でキーボードを実現したいのですが、 例えばメモ帳アプリケーションに対してこのような処理を実行すると、"か"ではなく"ka"としか表示されません。 なんとかして、メモ帳に"ka"ではなく"か"と表示させることはできないのでしょうか? 対象テキストボックスのImeModeプロパティが弄れたらいいのだけれどもそれは無理ですし… 何か良い方法があればご教授下さい。 よろしくお願いします。
SendKeys.Send("か"); でいかんのか?
>>285 それは試しましたが、確かに「か」と出力されます。
しかし未変換の状態で出力されてほしいのです。(文字に下線がついて出力されるように)
その方法では既に確定した状態で出力されてしまいます。
DLLのAPI呼び出しでもいい?
>>288 ならWin32 APIのSendInputを呼び出すんだな。
IMEがMS IMEなら下線付きで送信される。でも残念ながらATOKは確定済みで送信される
Imm~で何とかできそうな
291 :
デフォルトの名無しさん :2010/06/03(木) 15:43:17
多分「詳細なテキストサービス」の出番ではなかろうか Imm系がそれだったような気もするが詳しくは知らん てか情報なさ過ぎ
293 :
デフォルトの名無しさん :2010/06/03(木) 16:17:15
>>292 それより問題なのがOSがvista以降くらいになると
IME関連の制御が違うとかどうのって記述を見かけたたんだよな・・・
295 :
デフォルトの名無しさん :2010/06/03(木) 18:06:11
>>294 それそれ
MS関連でタッチパネル系デバイスが普及しないのは
そういうところなんだよね~
>>295 かんけーねーし、
そもそも携帯電話以外で巷にあふれているタッチパネルのデバイスの大半はMSのOS使っているだろ。
297 :
デフォルトの名無しさん :2010/06/03(木) 18:42:34
業務用で終わってる内は普及したとはいわねーよw
>>296 WindowsMobileを無視するとは。
301 :
デフォルトの名無しさん :2010/06/03(木) 19:18:38
普及したって定義は実際はどうなの?
302 :
デフォルトの名無しさん :2010/06/03(木) 19:47:37
なんか一気に雰囲気悪くなったな
まあネタに真面目に突っ込むのもアレだけど、
>>294 も
>>295 もどっちもどっちではある。
Windowsでサポートされてたタッチパネルってほとんどマウスエミュレーション系じゃない?
ああいうのを今日的な感覚でタッチパネルって言っていいのかどうか。
いきなりネガキャンされたらいい気しない人も結構いるってことじゃないの?
305 :
280 :2010/06/03(木) 22:06:50
かといって、タップ&ホールドを持ち込まれるとついていけない子がいっぱい。 でもないのか、iPhoneとかでも使われてるし。
306 :
294 :2010/06/03(木) 23:33:13
>>303 ちょwww俺もかよwwwwww
アンカーミスだよな?
MSILのリファレンスってどこで見れますか?
XmlSerializerでデシリアライズをやろうとしてるんですが、 一つの要素に配列の様に複数の値が入ってる場合にちょっと困ってます。 ↓こんな要素があって、colorをRGBAで読み込みたいんです。 <ambient> <color>0.50000 0.50000 0.50000 1</color> </ambient> とりあえず文字列としてはcolorがデシリアライズできましたが、 public class ambient { public string color; } 使い勝手が悪いのでfloat4つのR,G,B,Aを持ったcolorクラスとして、 もしくはfloat[4]として読み込みたいです。 public class color { public float r, g, b, a; // public float[] rgba; } 何かいい方法ないでしょうか?
<ambient> <color a="0" r="0" g="0" b="0"/> </ambient> とか <ambient> <color> <a>0</a> <r>0</r> <g>0</g> <b>0</b> </color> </ambient> とか
xmlの方は変えられないのならsplitでバラすとか
311 :
デフォルトの名無しさん :2010/06/04(金) 01:35:51
xmlの方は変更出来ません。 文字列で読み込んでから分割するしかないですかね。
無いんじゃないかな
313 :
デフォルトの名無しさん :2010/06/04(金) 01:40:04
XmlSerializerの都合もあるだろうしね・・・ というか何でできないの? 最悪の場合は変換前のxmlに正規表現の置換でもかけて XmlSerializer向けに直してやるとかは?
google earth用のモデルファイルなんで、モデルファイル自体には変更無しで読み込もうとしてました。
315 :
デフォルトの名無しさん :2010/06/04(金) 02:08:25
普通にxmlをreadさせて解析するのじゃだめなのかね?
Google はその辺りすごい evil だからなぁ。 他社との連携とかほんと無視。
単純にsoapの方を使ってシリアライズしたらいいじゃん フィルタ書けてそう言うのも簡単に読み書きできるし
>>307 最も完全なのはecmaのCLI
オペコードのリファレンスとしてわかりやすいのはMSDNのSystem.Reflection.Emit.OpCodes
XmlSerializer 便利だけど結構こまかい制約あるしなあ
邪悪なxxコンテストとか今時のヤツはやらんのか・・・
Soapってまだ使われてる??
全国どこにでもありますが
駅前のは本番ないから気をつけような
知らんかった(岐阜県民)
質問です。 VC2008 C#の、イミディエイトウィンドウ内で IEnumerable実装クラスなどを列挙させるのに いい方法はないでしょうか。
.ToArray()
その後、[0], [1] とか自力でやりますか?
イミディエイトウィンドウって使う? 全部ウォッチウィンドウで済ませちゃってるんだけど。
たまに使う。 副作用のあるメソッド呼び出しとか。
>>328 試せよ
配列なら自動的に中身が表示される
なるほど
>>329 結構使う
ブレイクさせて関数への引数変えて返り血みてみたいとか
変数の値直で変えたり、デバッグ用のテストコードにすりゃいいんだろうけど、その場限りの時はつかうかなぁ
334 :
デフォルトの名無しさん :2010/06/05(土) 07:40:06
痛そう
イミディエイトウィンドウでの実行の仕方がなかなかわからなくて 結構こまってた。 インテリセンスするためだけのウィンドウだと思ってたよ・・・
>>329 あそこでバグ修正用コードとか
半分コーディングしにかかるレベル
>>333 そのあたりはクイックウォッチからもできるから。
イミディエイトウィンドウじゃないとできないことって何だろう?
object o = null; (クイック)ウォッチでやるとこんなメッセージがでる > 宣言ステートメントは、イミディエイト ウィンドウでのみ許可されています
当たり前だっ
なにおいっているのら・・・・
プロパティでクラスを返す時読み取り専用に する方法はありますか? class a : ICloneable { int value = 0; //以下略 } class b { private a = new _a(); public a REF { get{ return _a; } set{ _a = value; } } public a CLONE { get{ return _a.Clone(); } set{ _a = value; } } } b = new obj(); b.REF = new a(); //更新をこれだけにしたい(CLONEも) b.REF.value = 5 //禁止したい b.CLONE.value = 5 //意図しない動作なので禁止したい
ない 中身を変更できないようにクラスを作る あとICloneableを重視してらっしゃるようだけど今は非推奨になってるから実装しなくていいよ
aクラスに読み取り専用のValueプロパティを作る
aを変更不可にしてしまえばいいんだが一般にはそれよりも bにpublic int AValue { get { return a.value; } }を付けた方がいい もちろん場合によるけどbを利用する側がaを知らなくて済む
>>342 , 343
ありがとう
簡単にはいかなそうですね・・。
場所によっては変更が必要なのでprivate protectedを
駆使して試して見ます
てか、ICloneableが非推奨というのは驚きました。
LabelのAutosizeをtrueにした時の伸びしろを最小限に抑えることってできないのかな? labelを密に横並びに配置しているのだけれど、どうも隣と被さって文字が見えなくなってしまう。 Autosizeをfalseにして文字を限界まで詰めると隣のラベルとかぶることはなくなるけどなぜか文字が途中までしか表示されなくなるし。
>>347 悪いけど全体的に何をいいたいのかよくわからん。
てか「なぜか」ってそれのどこが疑問なのか意味わからんし。
349 :
デフォルトの名無しさん :2010/06/05(土) 20:46:00
久しぶりに逆襲のシャアみてたのでニュータイプになったつもりで
回答してみるとだな・・・
>>347 適当なコンテナで制御するのが一番かもね
C井の質問もここでよろしいのでしょうか。
なにそのイニシャルトーク
352 :
デフォルトの名無しさん :2010/06/05(土) 23:21:37
逆シャアって最後のところでアムロとシャアって 死んだとされてるけどMSが弾き飛ばされてる はずなのに軌道がそれるのが確定したときに 二つ何かが飛び去るシーンがあるんだよね・・・ スレチ
二人が自由になるための作戦 死んだ事にして別人を名乗って気楽に生きていくために
嬉し恥ずかしボーイズラブですね
>>347 たぶんそこら辺面倒なくしたければテーブルを使うのが気楽でよいよ
Datagridviewの使い方が解りません。だからラベルをチマチマ貼ってます。 マウスで綺麗に配置した積りだけど、どうも隣と被さってる気がします。 とエスパーしてみる。
ほぼ正解
>>347 TableLayoutPanelコントロールを使えばOK
入力チェックについて相談させてください。 フォーム内に登録されているコントール全ての Validating イベントを発生させるには どうしたらよいのでしょうか? 現在、それぞれの項目の入力チェックは Validating イベントの中で処理し、 内容が正しくない場合は ErrorProvider を使用してアイコンを表示するようにしています。 このままですと一度もフォーカスを得ないままのコントロールは入力チェックがなされないままになってしまいます。 なので、登録ボタンを押下したタイミングでも全ての項目の入力チェックを行なおうと考えたのですが うまい方法が思いつきませんでした。 ContainerControl の Validate メソッドで子コントロール全てを Validate できるのかと思ってためしたのですが だめでした・・・
つValidateGroup
>>360 ValidatingGroup ですね。
ASP.NET 用ですか・・・ Windows Form では使えなさそうですね。
ContainerControl.ValidateChildrenは?
>>362 おおお! まさしくそれです
ありがとうございます
実装してみたところ期待通りの動作となりました
しかし・・・
なぜか自分ところの環境(VSEE2008)だと
ValidateChildren がインテリセンスにもオブジェクトブラウザにも出てこない・・・
ターゲットは .NET 2.0 にしてるしビルド自体は通るから問題なさそうなんだけどなんでなんだろう
Browsable(false)属性付きだから なんでそうしてるかは.NETの中の人に聞かないといけないが
なるほど。 Form の方では Browsable(true) になっていました。 メソッドの性質を考えるとなるべく上位で使って欲しいからとかそんなとこなんでしょうかね。 重ね重ねありがとうございます。
やるな
ADO.NETで質問なんですが、 DataRow一行だけを編集するような画面を作る場合でも TextBoxとかComboBoxにバインドするのが一般的な作り方なんでしょうか? それとも一々内容を移しかえるやり方が一般的なんでしょうか?
たった1行でも入力項目が多ければバインドする~
ADOは見通しが悪いよね
手書きのADO.NETはそう悪くないんだけど ウィザード生成の型付きデータセットが意外と解り辛くて不評。
WebRequestでのFTPPUTはたまにリモートサーバーに接続できないエラーになるけど、 やはり、ソケットで作らないとだめなのかしら?
んなことはない。
IEのHTTP/GETだってたまにリモートサーバーに接続できないエラーになるぜ
いやそれはルータが腐ってるw
ルーターも然り、相手の環境のせいも然りってことでしょ。 いろんな環境原因も含めてHTTPやFTP、その他の通信でも失敗することはある。
FFFTPとかのいい加減枯れてるツールでも結構なるしな そう言うモンだと思って回復手段作り込むしかあんめ
タイムアウト、リトライ、リジュームあたりを実装したら、 FTPはまともな動きになるだろう。
そこまで望む場合は自分で作ればいい。 FTPなんてチョー簡単だし。(PASV実装とかチョイ面倒くさい程度)
>>378 .net frameworkだけで手軽に実装できるだろ。
Windowsアプリケーションにて、画像の上に透過的な四角い枠線(色付き)を重ねたいのですが、 どのように実装したらよいでしょうか? 宜しくお願いします。
>>380 Panelでできないっけ。
今もPanelあるんだっけ。
>>380 現状ではコントロールは親コントロールに対してしか透過してくれないんだよね。
まぁ動かしたりするんなら糞重たくなるけど、その枠が乗る範囲が対象の画像のどこにあたるかを計算してその部分の画像データを枠を描画するコントロールの背景に描画とか。
まぁサクサク動いて透過もできてってなるといっそのことDirectXやOpenGLに2次元的な描画をするしかない。
PictureBoxの子に枠線のPictureBoxなり追加すりゃいんでね
384 :
デフォルトの名無しさん :2010/06/08(火) 08:05:10
>>383 WinFormだと透過を扱うのは面倒だよ
OnPaintの内部で好きなように描けばいい。
PictureBoxをはみ出す可能性があるなら厄介 OnPaintだったら一切コントロール使わずに重なる可能性のあるもの全部 自分で描かないといけない
どのレベルの運用なんだろう? 例えばユーザーがドラッグドロップした部分に枠を描画してそれを消したりすることが出来なければいけないなら 自分でレイヤーみたいなデータを順番に記憶してクリックされたら枠線描画して移動できるようにする とかいろいろ考えられるけど
透明なウィンドウを重ねるのが確実 そういうの多用するんだったら努力するだけ時間の無駄だからさっさとWPFへ
FtpWebRequestのAbort忘れかも。
枠引くくらいなら枠線用のPictureBoxなどを配置して上に置いて Regionで内側を切り出すのがほどほど楽だと思うよ。
コントロールの重ね合わせは数が増えると重くなるからスピードが必要ならDirectX
C#2.0 マルチスレッドで質問です short型の変数Aがあるとします。 メインスレッドはある変数Aを読み込むだけ サブスレッドはある変数Aを書き換えるだけ 上記のような状態で通常 書き込み時に適当なオブジェクト等を使用してロック・読み込み時もロック するような気はするんですが 仮に 両方ロックしない場合で サブスレッドで 変数Aが 0(16bit全てOFF)の値になっている時に 変数Aを65535(16bit全てON)に変更したとします。 この場合変数Aは限りなく瞬間的に全てのビットを順番にONしていくと思うのですが、 その途中にメインスレッドが読み取りを行った場合に例えば8bitだけONになったりしている状態を読み取る場合ってあるのでしょうか? ちょっと質問の仕方が微妙かもしれませんがお願いいたします。
CPU命令の最小単位考えたらわかるべ
>>392 > この場合変数Aは限りなく瞬間的に全てのビットを順番にONしていくと思うのですが、
> その途中にメインスレッドが読み取りを行った場合に例えば8bitだけONになったりしている状態を読み取る場合ってあるのでしょうか?
32bitプロセスでは32bitまでならアトミック
そんなの気にするよりvolatile
shortの変数がそれらをまたがる可能性があるということか
C#の場合はアライメント境界整列は保証されるとどっかで読んだ記憶が まあ将来に渡って保証されてる訳でもないだろうけどな
MSDNのInterlocked.Readとか読んでると保証されるとも取れるようなことが書いてあるよ
StructLayoutした構造体でも適用されるのだろうか・・・ マーシャリング機構が魔法を使ってくれてるかもしれないから否定しているわけじゃない。
>>392 それやると大抵は読み込むだけのスレッド側の処理は最適化で消えて読み込まなくなるから
中途半端に読み込む状態を仮定する以前の動作になるよ。
volatileぐらいわかるよバカやろう
>>392 なんでそういう事をわざわざ考えるのかよくわからないけど
ReaderWriterLockつかえば解決とか言う話でもないの?
アトミックな操作が本当にそうなのかについて疑問に思ったんじゃないの? いいことだと思うよ。
なんでそうなるのかとかは知っといた方がおもしろいよね。
GCが配置する時に8バイト境界にするってどこかで見た覚えがあるんだがどこだったかな
レジスタのビット書き換えフェーズ中に割り込みか同時読み込みできる そういうすごいCPUの話じゃないの?
>>392 short型ならすべてのビットが同時に書き換えられる。1ビットずつ順番ではない。
もちろんプログラムが1ビットずつ書き換えるように作ってあれば話は別だけど、単純に
A = 0;
A = 65535;
のように代入するだけならすべてのビットが同時に変更される。
もし中途半端な状態が発生したら、それはメモリの故障。
>>406 物理コアが複数だと、そう言い切れなかったりする
上でも何回か出ているアライメント境界の問題で、
複数回フェッチが起こる可能性があるからだ
ここらはキャッシュコヒーレンシとか色々関係しててややこしい
横レスなんだけど
>>407 いろいろ読む限り仮にこれが32bitOSでLongだったら書き換えは複数回に分割されてしまうということなんだろうか?
仕様としてはどうなっているんだ?
5.5 変数参照の分割不能性 bool、char、byte、sbyte、short、ushort、uint、int、float の 各データ型および参照型の読み取りと書き込みは分割不可能です。 また、上記の型を基になる型に持つ列挙型の読み取りと書き込みも 分割不可能です。long、ulong、double、decimal などのその他の データ型、およびユーザー定義型の読み取りと書き込みは、分割不可能 であることが保証されていません。この目的で設計されたライブラリ関数を 除いて、インクリメントやデクリメントの場合などでの分割不可能な 読み取り/変更/書き込みは保証されていません。
>>411 CPUレベルではともかく、CLRレベルでは保証されてるってことか。
32bit以上での実装を事実上想定しているわけだ。
16ビットCPUだったらintも16ビット長じゃね? .netが16ビットでも動くかは知らんけど
intは32bitと決められている。
intが可変な言語って数えるほどしかない
CLRは32ビットプロセスなら32ビット境界に、64ビットプロセスなら64ビット境界に整列することを保証してる。 もちろんライアウトを変えた場合は別。 だから、少なくとも32ビット以下のプリミティブ型の読み書きはアトミック保障。
そういう言語では組み込み型はそのまま使わずにtypedefしてサイズを固定するという アホらしいノウハウが定着してる事実
ああ書き方おかしかった。 ライアウト→レイアウト。 で、そういうことやってない限りは保障されてる。
つうわけで現実的には、32ビット以下ならvolatil変数、 32ビットを超えるものはlockするのが簡単。
ところでlongはvolatileにできないけど IntPtrや参照型のvolatileは64bitプロセスでどうなってるんだろう?
64bit環境なら普通に問題ないだろ。
64ビット環境では当然64ビットの読み書きは分割不可能。
x64とia64で違ったりしないのかな
分割「不可能」って表現はどうなんだろうねえ。
atomicの定訳がないからねえ。「不可分」で良さそうなもんだが。
相談室の方だしアトミックとだけ言っとけば通じるんじゃないか?
今更このスレでアトミックや分割不可能の意味がわからん奴もいないと思うんだが・・・ まぁMSDNにもそう書いてあるんだし、そのままでいいんじゃないか? というか、やっぱPGて細かく突き詰めると深いよなぁ と改めて思う
なぁ、紐づく・紐付ける・紐づいたXX って英語でなんていうんだ? てか、紐づくの語源はどっから?
そんなの 関係する とかに置き換えたらいかんの? 語源はググってくれ
そう言えば、英語と1対1な用語じゃないような気がするねえ。 link,bind,relationshipのいずれかを局面に応じて使うんじゃないかな。
associateとかもあるな
A (which is) tied together with B とか
assigned とかは? 命名スレ行きかな
wiredだな
weirdとな
確かに全くわからない new { trueValue = new BitVector32(-1), falseValue = new BitVector32(0) }と new { trueValue = new BitArray(1)[0] = true, falseValue = new BitArray(1)[0] = false } を比較したら処理速度以前に値型と参照型の違いで前者が速いに決まってる 何がしたいのかも意味不明
>new BitVector32(-1)[(int)BitFlag.TrueIndex] BitFlag.TrueIndexは0のことだから、 >new BitVector32(-1) -1じゃなくても何を渡してもたとえ0でもTrueになるしな。
>new { trueValue = new BitArray(1)[0] = true, falseValue = new BitArray(1)[0] = false } これに至ってはビットセットしてるつもりで実は取得しかしてない気がする。
Microsoft MVPかよw
>>441 逆
設定はしてるけど取得はしてない
trueValueに代入されるのはリテラルのtrue
(int16)trueが1になったり-1になったりする!大発見!スイーツ(笑) ってことか?
回数増やすと差が開くのはGCが動くからかな? なんにせよそんなBitArrayの使い方ありえない
本人も言ってるけど、本当に > プログラミング言語論やアルゴリズムに元々興味がなかった んだろうな。
そうだとしてもこれ普通に仕事に支障が出るレベルじゃね
Console.WriteLine("BitVector32の-1: {0}", .... そりゃ何やったって-1が出るよな。
>>440 BitVector32の仕様を理解してない? インデクサの引数をマスクじゃなく
インデックスだと思っているとか。
?
貼ったのは本人かよwwwwww
というか記事自体消えたw
流石はMVPだな
丸ごと消して逃げるってのは技術者の態度としては酷いなあ 別に誰だって間違いはあるんだから、素直に分かってませんでした、でいいのに。
…ほかの記事も全部巻き込んでコメント消えたな… どうなってんだ…真面目に聞いてたのに… あーあ、どうせ荒らされたからコメント停止したとか、そういうことにされてんだろうな
まあそれぐらいで許してやれよ。 打たれ強い人ばかりじゃないんだ
誰かコメントできっついことでも書いたか? 気づいたらもう消えてたから経過が分からん、まあおそらくはそうなんだろうけど。 しかしこれじゃ記事で気になることがあってもどうしようもないな。 techbank.jp って書籍とかも出してるからそれなりに影響力ありそうなんだが… ユーザ登録して掲示板に書けってことか…面倒な…
カエル女あわれ・・・
>>458 キツいことは書かれてたね。
言葉はキツかったけど正しい指摘ではあった。
確かに誰もが打たれ強いわけじゃないってのは分かるけど
書籍出したり、MVPだったりする人間が技術的な指摘に逃げ腰ってのはダメだよ。
そのとおり。
>>460 あれ書いたの俺なんだけど、まさか丸ごと消されるとは思わなかった。
MVPだし、本出してるし、コミュニティの運営にも積極的な人みたいだから、
反論するにせよ訂正するにせよ、少なくとも真摯な態度で答えてもらえるもんだと
思っていたんだよね。
まあ、確かに言葉はきつかったけど、まともな質問に上から目線で適当な回答をしてるのが
腹立たしかったもんでね。
残念だね。
RSSには BitVector32 vs BitArray を掲載しました ってのが残ってるけど、どんな中身だったのか分からない どっかに中身のっけてくれ
MVP事務局に、報告しといた方がいいと思う。
まゆみちゃーん
>>463 Googleのキャッシュで記事はまだ見れるね。
間違ってるというより何一つ意味を為してないんだな 書いてる本人が自分で何やってるのかわかってないからわざと曖昧に書いてるのが伝わってくる
469 :
462 :2010/06/13(日) 23:02:40
あんまり突っ込みどころが多いから、逐一指摘してたらコメントが長くなるし 変な人だと思われそうだから、1点に絞って突っ込んだんだけどね。 いっそ高木浩光ばりに突っ込みまくった方が良かったのだろうか?
>>469 あー、私知らなかったわー。って感じの文章なんだから、もっとソフトにやってあげてもいいんじゃない。
どんなコメントだったん?
GoogleもYahooもキャッシュにコメントがないなあ Bingはキャッシュすらないし
473 :
462 :2010/06/13(日) 23:17:13
細かい文章は覚えてないが、 BitVector32::ItemsとBitArray::Itemsの戻り値を整数として評価すると異なる値になると あなたは言っていますが、.NetのBoolean型は整数と可換なものではないので、整数として 評価することに意味はありません。また、内部的にも1ビットの整数として実装されていますので、 整数に変換した結果は毎回同じです。-1が出力されているのは、あなたがConsole.WriteLineの フォーマット文字列に“-1”と書いたからです。 基本的なデータ型について理解していないのはあなたの方です。正当な疑問に木で鼻をくくったような 返答をする態度は非常に不愉快です。 といったところ。最後に余計なことを言っているけど、これは以前にコメントをしていた人に、 ビット操作の概念を勉強しないとこの記事は理解できないよ、というような返答をしていたので、 それに対するもの。
.NETのboolは8ビットで0がfalseで0以外がtrueじゃなかったっけ 記事の間違いは別問題だが
記事ごと消すほどのコメントじゃないわな。
たまたま残ってたから一応書いておこう。 最初のコメント ---- > まとめると、 > BitVector32 BitArray > true -1 を表す 1 を表す > false 0 を表す 0 を表す > となります。 これはいったいどういう意味でしょうか? ---- その返答 ---- ビットフラグがONの場合がTrue、ビットフラグがOFFの場合はFalseです。 このON/OFFを数値で表した場合、BitArrayとBitVector32とではON/OFFの数値の意味が異なるという対比表になります。 そもそもビットの概念がわかっていないと、このBlogの説明に書いてある説明を理解しようとしても無理ですので、もし貴方がビットの考え方が良くわからないという場合は、 入門書籍やほかのWebサイトでその辺りを勉強してから、このBlogに書いてある意味を汲み取ってください。 ----
いきなり攻撃的な返答だな。あの日だったりしたのか?w
マルチスレッドで教えてください。 ソケットプログラミングで、受信スレッドがキューにデータを溜めて、 メインスレッドは順次データを読み出して処理するというプログラムを書いています。 メインスレッドはキューにデータが無ければ受信するまで待機したいのですが、 一般的にどう実装するものでしょうか? とりあえず作った受信スレッドは、 Monitor.Enter(obj); 受信ループ キューに格納 Monitor.Exit(obj); Monitor.Enter(obj); ループEnd Monitor.Exit(obj); 受信の都度Exitしてメインスレッドに所有権を明け渡しています。 動作には問題なさそう?なんですけど、なんかスマートじゃないというか。。。
AutoResetEventつかう
lock (q) ループ開始 }
ミスって書きこんじまった、なしなしな
BlockingQueue系統を使うのが定石だが、 .NET 4より前にはなかったな確か。 BlockingQueueとか実装はそこらに転がってそうだが。
MVPって最初の頃(2003年とかその頃)はいいなと思ってたんだが、わんくま同盟とか言い出した頃から 馴れ合い色が強くなってきて、なんていうか、このブログの主はMVPになる条件を満たしていないにも かかわらず、推薦制度を悪用してMVPになった感があるな。 こんなんがアドバイザとして高い金を取ってるかと思うとなんともいえない気持ちになる。 MVPを専属で引っ張ると100万/週ぐらい取らなかったか? 次回剥奪されると良いが。
>>485 > MVPを専属で引っ張ると100万/週ぐらい取らなかったか?
そんなに価値あるのか?
まあ、すごいのはいる。
nyaruruとかって本業何してんの?
そんなに取れません。n氏はGoogleに・・・。
GoogleだとWindows使えなくなるじゃん 大丈夫かな
CodeProjectでじゃんじゃん記事書きまくってる奴とか、凄いのがいる。 日本語サイトでMVPを名乗ってる奴の中には、こういうしょうもないのが時々いるから あんまり信用はしてないけど。 この人も結構メディアに露出しているけど、信用をなくすような行動取って大丈夫なのか? 「わかってませんでした。精進します」って言えば済んだことなのに。
>MVPを名乗ってる奴の中には MVPは別に実力に関係ないしな まぁ色々特典もらえるのは正直うらやましい
どこがじゃ
493 :
デフォルトの名無しさん :2010/06/14(月) 13:49:43
まあMVPに実力は関係ないな。 でも、一つのテーマでコミュニティ築く力は凄いと思わない。
うん。思わない。
思わないんかいw MVPって数結構多いよね。
一時期、ものすごい増えて、今は多少減ったみたい。
高い金取るのってエバンジェリストとかそういうのじゃないっけ? コンサル
>>480-484 レスサンクスです。
Producer-Consumerパターンでぐぐったらズバリ出てきました。
こんな一般的な話だったなんて・・・orz
シングルスレッドではproducerとconsumerの同期がとれないってのが、 プログラムをマルチスレッド化する大きな動機の一つだもんな。
うん。
マルチスレッドといえば.Net4使ってるのに生のthreadやらthreadpoolやらを使ってる奴は何がしたいのかわからん どれだけ俺様ライブラリを量産したいのかと小一時間(ry
Producer-Consumerパターンなら生だろうとBackgroundWorkerだろうと大して変わらんだろ
そういうことじゃないだろ。
ほう
>>502 はプロデューサーコンシューマーに限った話はしてないよね。
そんなMSの俺様クラス作られても、いつサポートされなくなるか分からないしな。
しかしまぁ大手のマルチスレッド関連の記事は古いものばかりだな 忙しくなけりゃ俺が寄稿してあげたいぐらいだわ
509 :
デフォルトの名無しさん :2010/06/15(火) 22:37:49
>>508 ブログにでも書け
キーワードさえうまく配置してればそのうち広まるよ
俺様ライブラリ(車輪の再発明)批判はいいとして、 それがどうして「生のthreadやらthreadpoolやらを使」うことがそれだって言うの? そっちの方が意味がわからんよ。
>>458 んーこのblogなんとなく見てたら気になるとこいっぱいあるな…
でももうコメントもできんし。
っていうかだれかすでにコメントしてて消えちまったのかもしれんが。
>>504 .NET4触ってないからよくわからないんだが、Threading.threadは使わずにBackgroundWorker使えって事?
それとも.NET4はもっと便利なのがあるってこと?
あるよ
>>512 Task クラスとか、Parallel クラスとかが増えた。
目的が異なるものを比較する意味がわからん
え?w
は?
あ?w
お?
並列用のパラレルAPIやParallel Linqで、GUIの非ブロック化処理を書いちゃうわけか。 それはそれでやばげだな。
誰かいないのか? それはそれでやばげだなって言ってんだろ!
ふざけんな! 俺がやばげだなつってるんだから反応しやがれ!
だあれもいない(´・ω・`)ショボーン
それはそれでやばげだが、それもありなんじゃないかなって、今はそう思えます。
.net4はキャンセルフレームワークが追加されたのがいいな これでマルチスレッドを使う人がちゃんとキャンセル実装をするようになればいいが…
耳毛、鼻毛を笑う。
しかし、そんなスレッドを酷使するような計算量のアプリって書いたことないなぁ。 あると欣喜雀躍する人がいるのは分かるがパンピーなプログラマでそんなもの要るの? ちゃんとプロファイリングしてれば、キャンセルなんて考える必要なんて無いのが経験則。 それとも皆、もしかして物理シミュレーションとか暗号鍵解読とかでもやってるのか?
スレッドを酷使するかどうかとキャンセルを考えるかどうかがなんで同列に並んでんの? 俺の経験からいけばそれらは関係がないんだけど。
いや、長時間じゃなくてもGUIアプリで計算しようとしたら別スレッドにするだろ。 しない?なら言う事は何も無いな。
C#でGUIアプリをつくったらそれを別スレッドで行わないことが困難だろう。
パラレルを活用するのはそれなりに限られてるけど、 タスク系統は普通に使うでしょ。
>>527 はどうしようもないバカ
スレッドのキャンセル書けないバカは一生マルチスレッドするな。
こうやってみるといかにマルチスレッドを使いこなしてないかわかるな まぁちゃんとわかって仕事で使ってる人間なんてほんの一握りなわけだが
むしろよくわからないなら使わない方が良いとは思う。 大抵のビジネスアプリは使わんでも何の問題もない。
俺はビジネスアプリ作ってるけどかなり多用してるな とはいえあまり見ないのもたしか UIがフリーズしたり複数のタスクが同時に出来ないアプリが多い事多い事…
仕事だと危険すぎてやらせる気にならんのだよね。 自分だけで作る部分ならいいんだが。
ぶっちゃけスレッドって難しいじゃん サンプル程度のものなら簡単に理解できるし実装も簡単だけど いざちゃんとやろうと思ったら同期、同調、排他、例外処理、キャンセル、etc...と糞難しい 設計力も数段上の力が求められるしさー 業務系とかそれが出来ないからモーダルウィンドウに逃げてる人多いじゃんよ
中級者御用達のクック本。 その中でも最も難易度の高い非同期項目みて”超初心者向けだな”とか思える人が集まらないと実務じゃ無理。
マルチスレッドは怖いです
はいはい
実際のところ、UI止めたくないから裏でスレッド、くらいにしか使ってない。
GUIの裏で計算だとか通信だとかするならbackgroundworkerでよくね? MSもこういう用途のために作ったんじゃないのかね 普通の受託開発屋なら通信部分って自前で書かない場合多いし
低能だからね。
>>542 だってそれ使うと同調しにくいじゃん…
スレッドも一本しか使わないし…
それ以上にUIにベッタリな仕様だからビジネスロジック部分には不向き
複数のスレッドで別々の処理をやってある時点で非同期に集計してその後にまた別の処理を…
なーんてことやると一気に難易度がググーーーンと上がっちゃいます!><
出来るならやりゃいいと思うけど 適当に人あつめると出来ない人の方が多いからなあ。 低い方に合わせて作らんと死ぬよね
UI止めないのは操作感の改良だから、多重の並列処理はできないようにしてるが、 特に客から文句言われた事ないな。 計算が遅けりゃ十中八九はデータの持ち方とかに問題があって遅いから、遅いと 文句言われたら改良する。 文句言われなけい限り、保守とかが楽な方に意図的に流してる。 でもスレッドとか(あと信じられないことにコレクション)をヘルプのサンプル引き写し レベルで使ってるだけで、マニアックだとか難しくて他の人が保守出来ないから チーム作業ではやめてくれないかとか罵倒されて (´・ω・`)。。。(いくらなんでもあんたらが時代遅れだろ) とか思うが相手が大多数なので言えない。 これは俺の勤め先がブラックなんだよな、な?一般的じゃないよな?(マ板行け自分)
>>544 勝手に上がればーーーーか(´・ω・`)
>>544 そういう時はほかの方法でやるだろうよ。
外資の俺が言うのも何だが未だに国内で組んでるエンジニアはレベルが低いな… スレッドぐらい使いこなせよ…
>>549 >スレッドぐらい使いこなせよ
レベルの低い会社に勤めてるのですねw
まあ自称分かってるやつが一番地雷なんだけどな。
使いこなせてる俺はいつの間にやら上級PGだったようだ おまえ等、俺に挨拶は?
>>553 説明もなにも二つのスレッドが協調すべきなのにその操作をいれてないからだろ
そのブログじゃ同時に実行される云々いってるがスケジューラの指定が無い以上どっちが優先されるのかはプロセッサ任せ
つーかロックすらかけてない互いの状態弄って何がしたいのかわけわからん
volatileは全く関係ねぇよ
ふー、やっぱ俺って天才だわ
上級PGなめんなよ!
volatileには順序保障の役割がある。
・volatile読み込みより前の書き込みは必ず先に実行される
・volatile書き込みより後の読み込みは必ず後に実行される
にも関わらず
>>553 ではすべての読み書きがvolatileなのに順序問題が起こる。
これはなぜか説明してみろという話。
いや、 ・volatile書き込みより前の書き込みは必ず先に実行される ・volatile読み込みより後の読み込みは必ず後に実行される かな
だからレジスタ依存=プロセッサに依存するつってんだろー それを阻止する為に~やりましょうとかずれてるわけで ちゃんとやるならロックや適切なスケジューラを指定するのが常なんだよ! 上級PGなめんなよ!
上級な土方
まったく何でかが知りたいならO-o-Oでググれや 上級PGなめんな!
え、volatileに同期処理なんてあるの?初耳だわ。
同期じゃねぇよ
ただのコンパイラ最適化防止の為じゃ
そして
>>553 の記事は最適化は防げてもプロセッサの最適化(OoOのね)は防げないから任意でThread.MemoryBarrier()挟んでメモリバリアしろよタコ助共つーこと
上級PGなめんなよ!
つーかスレッド使う予備知識の基礎中の基礎だろ!
>>546 俺もいい言葉を言われたことがあるので伝えておくよ。
「ジェネリクスは信用してないから禁止」
>>561 C++のvolatileと混同してない?C#のにはあるよ。
ただOoOに対しては有効じゃないのかなぁ。
初鼻だわ。
あのな、スレッド関係で、順序保障の機能ってのはOoOの順序問題とかの解決に使う。
当然、C#のvolatileは順序を保証するために使える。
ではなんで
>>553 では全部volatileなのに順序問題が発生するのか。
いつからvolatileがOoOの順序保障が行われるようになったのやら ほんとレベル低いな
/ufcpp.net/study/csharp/sp_thread.html volatileって何だろうと思って凄腕の人の解釈見たらコンパイラの最適化防止ってかいてあるお ゆとりPGをなめんなおっおっ( ^ω^)
>>573 最適化でその変数がなかったことにされるのを防ぐだけ
何のために?
グローバル変数的に使うために用意した変数が、同ファイル中で手をくわえられてないから最適化で削除されちゃう とかを防ぐためじゃなかったっけ。
コンパイラが不要だと思っても、実は他のスレッドが 必要としているかもしれないから。
volatileは順序保障するとか言ってた奴出てこいw
あぁ、スレッドであれこれするときに読むんだけど、おまえそのスレッドでその変数変更してねえのになんで読むんだよ それいらねえだろってコンパイラが言ったら、それは別のスレッドが書き変えてるかもしれないの!って注意してやるんだったか
C言語のvolatileが想定してたのはSignalなどのCPU割り込み処理で、
スレッドのことは考えてなかった。
よくvolatileをスレッドで使うなというのはこのため。
C#やJavaのようなはじめからスレッドを想定してる言語では意味を拡張していて、
スレッドに対して使えるようになっている。
>>553 の他の記事を見たが他のはエラーが起きたときのダイアログやメッセージを
イメージでアップしているが、この記事にはない。
おそらく手元の環境でエラーが起きなくて脳内で書いてるんじゃないのかな。
誰かこのプログラムでAssertが起きた人いる?
並列化で思い出したが、SIMD対応ってもうやる気無いのかね? 昔はJITの利点の一つとして喧伝してたもんだったが
環境に応じてスカラでXMMレジスタを使ってるらしい。 ベクトル化はMono.Simdのようなやり方しかないのだろうか。
Matrixとか折角あるのに対応してないのかね つーかアレDirectX由来だっけ?
もともとMatrixはJpegやMpegの展開のために用意されたんじゃなかったっけ? これからはマルチメディアの時代だとか言って。 今はビデオの展開はGPUの仕事になっちゃってるからCPUのMatrixはあんまり使ってないような。
Matrixの主な用途はTransformだと思ってた俺
var hoge = new hogehoge() 「新人がわかんないだろ、意地悪すんなよ」って言われた
新人いじめかよ 最低だな
volatileはメモリの読み書きを最適化して消さないだけ それ以外は特に何も保証しない
ぜんぜん前の書き込みを読まない奴だな。それはCの話だ。
>>589 そろそろ痛いから言語仕様でも読んでみな。
>>590 の最初のリンクだけでも十分だ。
>>580 >>553 のソースでしっかりAsser起こる。
一瞬なんで?って思ったが、まあよく考えてみれば確かに起こってもおかしくはないのかな…って感じ。
なんかごっちゃになっている奴がいるようだけど、volatile保証するが読み書きの順序と、 複数のスレッドが変数にアクセスする順序は別の問題だから。
いや、微妙だな、わかっていっているようにも読める。
C#の話だったのか
スレタイ読んでなかったのか
>>590 遠まわしな説明でよく解らんな。
メモリバリアの機能を含んでいるどうかだけ書けば1行ですむのに。
というか、
>>553 の例はコンパイラが無意味に見える命令を削除しているだけじゃないのか?
はい?
volatileは最適化をなくし削除しなくなるんじゃなかったのかよw
こんな風に分かってるつもりのやつがでたらめなことばっかり言うから、 危なくて使えないんだよ。
>>598 >メモリバリアの機能を含んでいるどうかだけ書けば1行ですむのに。
メモリバリアの機能を含んでるならなんで
>>553 はAssert起こって、
明示的にメモリバリア命令入れたら起こらなくなるの?
って思うわな普通。
メモリバリアって言っても一言で言えるほど単純な話じゃない。
volatile は確かに最適化を抑止するんだが、それは一つのスレッド内で変数の参照順を 変更するようなものに限られるんだよ。
10.4.3 Volatile フィールド 他のスレッドによる volatile 書き込みは、それらが実行された順にすべてのスレッドで行われます。
趣味でしかプログラミングをしない俺にはサッパリだ。
まあ、そこの原文の
These restrictions ensure that all threads will observe volatile writes performed by any other thread in the order in which they were performed.
A conforming implementation is not required to provide a single total ordering of volatile writes as seen from all threads of execution.
2行目の全順序は要求されないってのが結局
>>533 の理由なのかな。
>全順序は要求されない 「単一」の全順序は要求されない が重要か。
特定のスレッドを特定のCPUコアで動かすのってどうやるんだっけ?
そんなこと考えてる前にlockしちゃうなぁ。 var obj = new Object(); としといて lock (obj) { s_x = 1; s_ya = s_y; } と lock (obj) { s_y = 1; s_xa = s_x; } で、俺的には万事解決。 色々深遠な問題もあるだろうけど、そんなこと知ったこっちゃねー♪
まあそもそもこんな処理は普通は出てこないからなー。 これはあくまで予想と異なる結果になることがあるのを示しているだけで。 ただ、こういうコードを、無意識のうちに、動作を無意識に期待して書いてしまう可能性はあるかもしれない。 まあ普通はマルチスレッドで何かを書く場合は常に同期のタイミングは考慮しながら書くから、 多分めったなことはないとは思うけどね。
でもいるんだよ。 既存の処理をなんにも考えずにマルチスレッドにしちゃうのが・・・
>>604 参照順は変更されるんじゃないの?
volatile読み込みは他の読み込みよりも早く行われるんでしょ?
>>614 変更されないよ。
>volatile読み込みは他の読み込みよりも早く行われるんでしょ?
そうじゃない。
volatile読み取りよりも後ろにある読み取りが、
volatile読み取りよりも前に移動されるような最適化は行われない
ってこと。
>>616 あぁー、そう読むのかぁ。
もっと精進します。
そもそもvolatileの順序保障をどういう風に使うかというと、 例えば int data1; int data2; volatile bool completed; みたいな変数定義を行って、 スレッドAで、 data1 = 1 data2 = 2 completed = true; みたいなことをして、 スレッドBで、 if (completed) { //data1とdata2を読み取り } みたいにしたとき、data1とdata2の読み取りで、 確実にスレッドAで更新された結果にアクセスできる。 これは、 volatile書き込みより前の書き込みは必ずvolatile書き込みより前に行われ、 volatile読み取りより後の読み取りは、必ずvolatile読み取りより後に行われることが保証されてるから。
もしこの保証がないと、スレッドBでの読み取りで、 data1とdata2が、スレッドAが書き込んだ結果であることを保証できない。
>>618 > volatile書き込みより前の書き込みは必ずvolatile書き込みより前に行われ、
> volatile読み取りより後の読み取りは、必ずvolatile読み取りより後に行われる
リンク先にも確かにかいてあるけれど、これに当てはまらないものはすべて保障されていないと考えるべきなのかな。
volatile書き込みより後ろの書き込みが、volatile書き込みより前に行われる可能性とかそういうの。
おっと、そこのリンクの 4.書き込みは、同一スレッドからの別の書き込みを超えて移動することができない。 があるので、書き込み順序はたとえvolatileでなくとも、変更されることはないな。
順序がどうとか、なんでそういう話になるのか意味がわからんよ。 volatileの意味は文字通りその変数を非同期的に変更されうるものとして 扱うという意味以上でも以下でもないはずだと思うんだけど....
>>623 俺もそれだけの意味だと思っていたんだけど、C#では違うということを恥ずかしながら今日知りました。
なんだよ、結局またわかってないヤツが暴れてただけかよw
俺は暴れてはいないつもりなので、他にも分かってない人がいたのでしょう。
俺のようなヘボプログラマにとっての結論は、 マルチスレッドではvolatileに頼るなということだな。
そんな、高速だけど分かってる奴でもとっちらかって間違いかねない仕掛けで書くより、 遅くても排他処理でガチガチ泥臭く書いたほうがメンテナンスとか考えると現実的じゃね? 忘れた頃に見直す度に一々頭の中で再検証すんのかよ、って話。
だね。メモリバリアメソッドも用がなさそうだし、当面lockステートメントでいいやって思った。 ちゃんと理解できたら正しく速く動作するライブラリを書きたいものです。
>>627 なんだ、暴れたのがいまさら恥ずかしくなったか?
>>630 基本的には正しい判断だと思うよ。
lockだって別にそんなに重いわけじゃない(状況によるが)。
>>623 言語仕様からMSDNマガジンの詳細な記事から
何から何まで何度も示されてるのに意味が分からないなら
お前は本当に頭が悪いんだろう。
>>553 のって
s_x = 1;
s_ya = s_y;
の部分について、s_yの読み取りが先に行われて、
s_xの書き込み、s_yaの書き込みが行われたってことになるの?
どうなの?
C#の言語仕様のダウンロードURI教えてください。
VS2010のフォルダ内にありましたorz
object[] a = string[]{"a"}; string[] b = a as string[]; この処理は純粋にaへの代入とbへのキャストが行われているだけで、 List<object>とList<string>を型変換するときのようなインスタンス の新規作成はされないと考えてよいのでしょうか?
ちょっとした疑問 class A { object lockobj = new object; string _a; public a { get { lock(lockobj){ return _a; } } set { lock(lockobj){ _a = value; } } } これって、ちゃんとロック掛かるんだろうか?
642 :
デフォルトの名無しさん :2010/06/18(金) 13:54:34
て
>>635 ってどうなの?
なんで頭いい人たちみんなスルーなの
OoOについてggrks
>>644 型がないからってか?
質問の意図はそうじゃないだろ・・・
>>641 質問のポイントはLockのスコープからのreturnだろ?
ロックはreturnステートメントの実行直後にはずれるから普通に使える。
>>635 >>553 の件少し判った気がする。
環境依存があるようだからここにいる人たちも確認してもらえると助かる。
Releaseモードでも確認できるように修正。コンソールに出力させるようにする。
>Debug.Assert(s_xa == 1 || s_ya == 1);
if (!(s_xa == 1 || s_ya == 1)) Console.WriteLine("* {0}, {1}", s_xa, s_ya);
こちらの環境で確認できたこと。
マルチCPU、マルチコア、ハイパースレッディングでも起きる。
シングルCPU環境では起きない。
Relaseビルド、Debugビルドはどちらでも良い。
Debug実行時に起きる。Debugなしで実行では起きない。
結論
予想が当たってればOoOとか高尚な問題でなく、IDEのデバッガのバグの可能性がある。
>>649 俺の環境では、デバッグなし実行でも起こってる。
>>641 ちゃんとロックかかるってのはどういう意味で言ってる?
ロック自体はもちろん期待通り普通にかかるが、
objA.A =
objA.A + "hoge";
なんてのをアトミックに実行することは当然ながらできない。
改行入った… objA.A = objA.A + "hoge"; な。
>>618 なんか違わないか?
その例だと、スレッドBでdata1,data2が「正しく」読める保証は何もないのでは?
でなきゃ、そもそもvolatileって何だって話になる。
>>654 >でなきゃ、そもそもvolatileって何だって話になる。
どういう意味??
何言ってるのかわからない。
そりゃまあ
>>618 には実際にはいろいろ前提があるのは確かだが、
文脈で言いたい事柄の意図は通じると思うが。
>>654 の指摘が何を言おうとしてるのかわからないので、そうだな、
>その例だと、スレッドBでdata1,data2が「正しく」読める保証は何もないのでは?
なぜ保証がないのかを具体的に書けばそちらの意図はわかるかもしれん。
無意味な実装検証してもしょうがないような
>>656 そもそもその保証がない(コンパイラの最適化によって変数そのものには
アクセスしない可能性がある)から、そういう可能性を排除するためのvolatileの
はずなんだけど....
どうもこのスレ、分かってるのか分かってないのかよく分からん人が多いよな
volatileの使い方?を勘違いしてる
ひょっとして
>>590 の後半に書いてるような、よくある誤解をしてるクチかな?
よくある誤解、ねえ....
volatileの意味を誤読してるとか
>>658 メモリモデルの意味を全く理解してないな。
だったら、例えばもしlockで排他制御してた場合に、
他スレッドで更新した変数をlock内できちんと読めるのはなぜか考えてみな。
最適化で削除されるならそれすら保証されなくなる。
lock内では削除したらダメってコンパイラにはわかってるだろとか考えなしなこと言うなよ。
lock内から呼び出される普通のメソッドだってあるんだからな。
コンパイル時にそこがlock内かどうかなんて判断は無意味なこと。
>>662 だからvolatileの話じゃないし。
その参照先のどこにも「C#ではキャッシュを読む最適化は行われない」
とは書いてないように思うが。
メモリモデルのルールをよく読め。 ------ 読み取りが、同一スレッドから同一ロケーションに対する別の読み取りに隣接している場合、その読み取りは削除のみ可能。 書き込みが、同一スレッドから同一ロケーションに対する別の書き込みに隣接している場合、その書き込みは削除のみ可能。 規則 5 により、複数の読み取りまたは書き込みを隣接させてから、本規則を適用することが可能です。 ------
>その参照先のどこにも「C#ではキャッシュを読む最適化は行われない」
>とは書いてないように思うが。
あのな、volatile読み取りより後の読み取りは必ずvolatile読み取りより後で実行されるってのは、
CPUのキャッシュ制御を含んだ話だよ。
>>618 ではvolatile読み取りの後に変数にアクセスしてるだろうが。
だから必ずキャッシュではなく(別スレッドで更新された)最新の値が読み取られる。
っていうかそのためのvolatileだって話。
どれとも
>その参照先のどこにも「C#ではキャッシュを読む最適化は行われない」
>とは書いてないように思うが。
これはCPUキャッシュじゃなくて、レジスタにキャッシュするとか、そういう意味で書いてるのか?
それなら、それこそ
>>666 の話だ。
隣接する同一ロケーションからの読み取り以外で、読み取りが最適化によって削除されることはない。
>>666 「ケースAの場合、readのみが削除可能」という文章は、
「readが削除されるのはケースAの場合のみである」という意味ではない。
大丈夫?
>>667 どう読んでも君が思ってるような意味には解釈できないと思うが...
「処理Aと処理Bはシーケンシャルに実行されます」の意味は、
処理Aに続いて行われる処理Bに対して最適化が行われない、などということを意味しない。
ふえ?
>「ケースAの場合、readのみが削除可能」という文章は、 >「readが削除されるのはケースAの場合のみである」という意味ではない。 >大丈夫? あほくさいこと言う前にそのページ全体をよく読んでみろよ。 メモリモデルをどのように定義してるか書いてあるから。 「メモリ モデルは、順次一貫性モデル (最も制限的かつ厳密なモデル) をベースとし、」ってとこらへんな。 だいたいそんなこと言ったら書いてないことだらけなんだから、そういう読み方じゃおかしいことくらいわかろうに。 >「処理Aと処理Bはシーケンシャルに実行されます」の意味は、 >処理Aに続いて行われる処理Bに対して最適化が行われない、などということを意味しない。 どこの記述のことを言ってるのかわからんがな、処理Bの最適かって具体的に何のことを言ってる? 読み取りの最適化なら、前に読んだ値をキャッシュしておくくらいしかないだろ。 メモリモデルでは、そういうのを読み取りを前に移動するという風に定義してるんだよ、上のページにちゃんと書いてある。 そして読み取りはvolatile読み取りより前に移動できない、 つまり、volatile読み取りより前に読み取りをキャッシュしておくという最適化は許されない。 全部書いてある。
もういちいち説明するのめんどくさい、勝手に自分流解釈しとけ。 メモリモデルのこととかある程度わかってる人間ならすぐに理解できる話だ。 volatile絡みのルールの話も、マルチスレッドでのメモリモデルの一般的な話を理解してるなら はっきり言って常識レベルの話(ごくごく一般的なルール、javaのメモリモデルも同じようなルール)。 一回マルチスレッドのメモリモデルや順序について詳しく調べてみ。
>>658 お前が分かってないことははっきりしてる。
>>658 >そもそもその保証がない(コンパイラの最適化によって変数そのものには
>アクセスしない可能性がある)から、そういう可能性を排除するためのvolatileの
>はずなんだけど....
ttp://msdn.microsoft.com/ja-jp/library/aa691105.aspx Cとかの感覚で言ってるのかもしれないが、今どきのマルチスレッドを前提とした
havaやC#のような言語では、そう簡単にアクセスそのものが消されることはないよ。
マルチスレッドで正常な動作を保証するために(保証するようなコーディングができるようにするために)、
メモリモデルというものを定義して、そのルール内で最適化を行うようになってる。
だからlockやvolatileなどをルールに従って使用して、正常に動作することが保証できるコーディングを行える。
Wordドキュメントになってるc#言語仕様の、10.5.3 Volatile フィールドの説明でも、
>>618 のような動作を正常に行えるようにvolatileを使う例が書いてあるな。
まあ日本語がおかしくて意味不明な感じに読めてしまうけどな。
言ってることはまさに
>>618 と同じ。
using System; using System.Threading; class Test { public static int result; public static volatile bool finished; static void Thread2() { result = 143; finished = true; } static void Main() { finished = false; // Run Thread2() in a new thread new Thread(new ThreadStart(Thread2)).Start(); // Wait for Thread2 to signal that it has a result by setting // finished to true. for (;;) { if (finished) { Console.WriteLine("result = {0}", result); return; } } } } この例では、次のように出力されます。 result = 143 この例では、Main メソッドが Thread2 メソッドを実行する新しいスレッドを開始します。このメソッドは、値を result という非 volatile フィールドに格納し、 次に volatile フィールド finished に true を格納します。メイン スレッドは、フィールド finished が true に設定された時点で、フィールド result を読み込みます。 finished は volatile として宣言されているため、メイン スレッドはフィールド result から値 143 を読み込む必要があります。 フィールド finished が volatile として宣言されていない場合は、finished への格納後に result への格納がメイン スレッドから参照可能になります。 その結果、メイン スレッドがフィールド result から読み込む値は 0 になります。finished を volatile フィールドとして宣言すると、このような矛盾を回避できます。
あっそ
>>658 かたくなにそう信じてるやつがいるんだな…
元々意味のない参照ならそうなる場合はあるが、
普通ほとんどの場合は違うのに。
>>669 キリッ
ついていけないならくだらんケチつけなきゃいいのに
また同じヤツが暴れてるのかw お前はもうマルチスレッドとか無理だからあきらめろw
クラスアセンブリ(dll)を許可するプロジェクトだけに読み込ませるにはどうすればいいのん?
>>681 コールしているアセンブリの署名を調べる。
>>682 kwsk!
ちなみにクラスアセンブリは自前のソース月の物でありまする><
署名は改ざん検知出来るだけ DLLのアクセス制限云々の機能ではない
やっぱりそうなんですね がっくし・・・・ ProjectA ---{OK}--- A.dll 第三者のProject ---{NG}--- A.dll みたいな事をやりたい時はみんなどうしてるのん?
そんなことをやりたいと思ったことがない。
えー社内ライブラリとかどう管理してるのー? 不正リンクされて盗まれても「でへへっ!」とか言うだけ? うそーん><
>>685 DLLのファイルかフォルダにNTFSのアクセス権つければよくね?
制限出来れば リフレクション使ってクラス調査→不正リンク→(゚∀゚ )アヒャヒャ という.net固有の糞みたいな問題が解決するけど 未だに対策は難読化しかない。
別になぁ。そもそもアセンブリじゃないDLLなら呼び放題だし。 売り物ならライセンス処理つけるだろうし。 お買い上げありがとうございました。だろ?
オープンソース時代だから別にいいじゃんw 盗まれたら裁判すればいいし(キリッ
>>691 盗んだほうはC++で書きましたってオチだ
.NETでなくても、製品の実行ファイルや図版を勝手に使われたらどうするんだよ。 そういうときは法務部門や顧問弁護士の出番。
まっ、やり放題な業種だからどうしようもないってこった 裁判なんざ普通は起こせないしそもそも把握すること事態が不可能
ヤリ放題な業種だと自分に言い聞かせてるのか?こっちまで巻き込むなよ。
巻き込むも何も対策方法が何もない現状 自作パッカー作ったところで焼け石に水 理想は寝て言え
>>683 どのアセンブリからコールされているかはわかるだろ。
そして、そのアセンブリがどのような署名されているかを調べる。
逆コンパイル防止はそれ以前の問題。
毎回、毎回、クラス毎に調べるのか? 手間かかりすぎだろ
いたるところで StrongNameIdentityPermission でDemandでもしとけ。 まあ改ざんされたらもうだめだけどな。
単純に public class MyLicence : License { public override void Dispose() {} public override string LicenseKey { get { return ""; } } } public class MyLicenceProvider : LicenseProvider { public override License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions) { if (allowExceptions) { string exename = Path.GetFileName(Assembly.GetEntryAssembly().Location); if (! exename.Equals("MyLicenceTest.exe")) { throw new LicenseException(type, instance, "do't licenced"); } } return new MyLicence(); } } [LicenseProvider(typeof(MyLicenceProvider))] public class TestClass { License license; public TestClass() { license = LicenseManager.Validate(typeof(TestClass), this); } } とかでもいいんじゃね?呼び出し元exe名縛り。
こんな抽象クラスあったのか。 中々面白いアプローチだと思う。
ほぉ、これはなかなか…
Licenseは破棄が必要だぜ…
と思ったけど必要なければ別に実害はないのか…
リソース持ってないし、いいかな?と省略したけど、実装する際は通常通り Dispose()しといたほうがいいだろね。
リソースというか取得したライセンスを開放する処理を好きに定義するだけでしょ 同時利用数をデクリメントするとか 空でも全く問題ない
ってことみたいね。
というか、キモはexeのファイル名を確認するところなんだから、実装の仕方は人それぞれでしょう。
ってことみたいね。
>>700 をoverrideとか使わずにもっと分かり易く書いてくれ
webアプリで FileSecurity filesecurity = File.GetAccessControl(path); (pathはstring型でファイルの絶対パスが代入されています) としました。 このファイルを他のアカウントで作成して、 アクセス権限も拒否にしたら、デバッグ環境でですが、 '/'アプリケーションサーバーエラーが発生しました。 と出て、実行できませんでした。 とりあえず、try catchを使い、アクセス禁止として 処理すれば、実行エラーは回避できました。 DACLとかいまいちわかっていないのですが、 なにか他の回避方法はあるでしょうか? よろしくお願いします。
そんなレベルだったら余計なこと気にするな どうせその他の部分で穴だらけ
>>711 public class Hoge
{
private Hoge() {}
public static Hoge()
{
string exename = Path.GetFileName(Assembly.GetEntryAssembly().Location);
if (exename != "hoge.exe")
throw new Exception();
return new Hoge();
}
}
でも、リフレクションやLCGを使われたらどうなるの?
LicenseProviderって使ったことなかったからそのサンプルコードとしては 参考になったけど、正直実用的な意味があるとは思えんなあ… アセンブリがロードされた時に何らかのスタティックメソッドの実行を強制できれば いろいろ面白いことが出来そうな気がするんだけど
そうそう、今回の話とは別に、それ前からほしかったんだよね。
実用的には例えばSIDとかMACとかUSBメディアのPNPDeviceIDとか ※ SID : GetComputerName、LookupAccountName API参照 ※ MAC : NetworkInterface.GetPhysicalAddress 参照 ※ PNPDeviceID : WMI で Win32_DiskDrive, Win32_DiskDriveToDiskPartition, Win32_LogicalDiskToPartition, Win32_LogicalDisk 参照 そういった利用者を一意に特定出来る情報をプロダクトキーと一緒に公開鍵で 暗号化してライセンス認証サーバに送って、サーバで認証後に秘密鍵で 特定情報を暗号化して送り返してもらったものを記録。 その情報を公開鍵で復号して動作環境での取得値と一致していなかったら ライセンス違反と判断・・・とかメンドクサい実装は必要に応じて。
うんまあ改ざんされたら意味ないんだけどね。
それを言ったらどんなアプリ、ExcelだろうとWindowsOSだろうと、リエンジニアリング されてライセンス処理部を改ざんされたら無理。 それを言うことに意味はあるのかな?
簡単さが違うって話。
確かにDllMain的なのは欲しいよな。
static イニシャライザでチェックしちゃいかんの?
staticコンストラクタはいつ呼ばれるかわからない
アセンブリに属性をつけておいて その属性にstaticコンストラクタを仕込んでおけば dllを読みこんだタイミングで実行されたりしないかなあ
ふーん
>>724 されない
カスタム属性っていうのはあくまでメターデータのラッパークラスなので
インスタンスが作られるのはその属性を参照しようとしたとき
お前ら釣り耐性低すぎだろ
何十個もクラスをライセンス管理しないなら
>>714 で充分だね。
>>700 でも充分簡単じゃねぇか。
あんなのすら分からなかったらそもそもコードかけねぇだろ。
まあ確実に言えることは、
>>700 程度のコードが複雑に見えるんじゃライセンス保護
なんて当分は無縁だということ。
うほ
先生! thread.spinwaitとthread.sleepってどう違うんですかっ? MSDN読んでも引数の違いぐらいしかわからないです! 高度な技術を持ってる人、おすえて!
解説読めよ。
Windowsフォームアプリを作るとメインウィンドウのクラスがめっちゃ大きくなっちゃうんですが、仕方ないんでしょうか? それともpartialで分割するべきですか?(あまり意味ないと思いますが)
partialの分割は意味ない。 ユーザーコントロールにするとか、ビジネスロジックを別クラスにするとか、 そんな感じ。
ApplicationContext使って、MainFormにはインタフェースレベルのプログラムしか書かないとかかな。
それでもコントロールの量が多いとイベントメソッドだけでもめっちゃ多くなっちゃうんですよね。 そこそこ普通のフリーツールくらいの規模でもメインウィンドウのクラスだけで何千行にもなっちゃう。
だから、そーゆーのはユーザーコントロールにまとめるんだってば。
で、デザイナがバグって正常に表示されない、とw あれたぶん2010でも放置なんだろうな
ユーザーコントロールが正常に動かないのは作り方が悪い
なんでそんなでかくなるんだろ。 イベントが盛りだくさんなの?
ボタンが百個あるので、イベントハンドラが百個なんでしょ。
ボタン1個にいくつのイベントがあると思ってんだ
はなし が かみあって ない
やっぱへったくそだな
>>746-747 素人臭い意見だな。
そんなわけないでしょw
実際ある程度やってみれば俺の言ってる意味がわかるよ。
自称玄人△
>>754 ユーザーコントロール使ったこともない自称玄人乙
IDEに表示されないという理由だけでユーザコントロールを避けるってどうなの? #define BEGIN { と同じくらいひどいと思うんだけど、素人だからですかね
それは言いすぎ。 IDEのコード生成は信用できないので禁止、くらいだろ。
・・・IDEに出ない?ツールボックスに出てきているコレはなんだろう?
>>757 「だから」避けろとか使うべきでない、などとは一言も言ってない。
揚げ足取り玄人ですね。かっこいいです!
>>760 デザイナがバグって正常に表示されないというのは素人がよくハマる部分だから
気をつけろって言う意味?
ガキ臭い揚げ足取りしてるのはどっちだよ。 ネトウヨみたいなよくわからん被害妄想だなおい。 こっちは単にVSのデザイナはユーザーコントロールを使うとバグって 正常に表示されなくなる場合がある、という事実を言ってるだけ。 っていうか、この程度の経験もない奴が偉そうに「ユーザーコントロール使え」 とか人に講釈垂れてるっていい根性してるよな。
>>762 VS自体のバグだから使う側が玄人か素人か関係ないし、
気をつけようもないんだけどさだから。
該当バグのURL晒したらすぐ済むことなのに
VS2008でデザイナがしょっちゅう腐ることがあるやつを VS2010に持ってきたが、いまのとこ一度も腐ってない
2002や2003に比べたら2008の安定ぷりったらないんだけど、2010はさらに調子良いのか これは楽しみ
コントロール多くてもほとんどユーザーコントロールだから、フォーム側に実装する事ほとんど無いなぁ。 そんなにフォーム固有の処理って多いもん?
>>768 ユーザコントロール作ったらバグるって言われるよ
ボタンにクリックイベント一個付けるだけでもわざわざ一個のユーザーコントロール作るの?
そうすべきだと思ったらそうするな
772 :
デフォルトの名無しさん :2010/06/22(火) 04:29:59
>>770 ボタンコントロールにだけ関連する処理ならユーザーコントロールか
継承したクラス作ってそこへ入れてしまえばいいんじゃね?
Formにだらだら書くよりすっきりするよ
継承したらそりゃコードは分割出来るけど デザイナの意味を成さなくなってくるな
Visual Studioの登場で、内部はどんどん複雑に、表面は簡単になったおかげで 基本や構造を理解せずに何となくソフトを作るプログラマーが増えた マシンパワーが有り余ってるから、いいかげんな作りのソフトでもそれなりに動いてしまうのも善し悪し
>>773 もう少し詳しく。
適当に予想してレスすると怒られる流れっぽいので。
776 :
デフォルトの名無しさん :2010/06/22(火) 05:11:51
>>775 イベント追加する時に+=を書かなくちゃいけなくなるとか
778 :
デフォルトの名無しさん :2010/06/22(火) 05:35:24
>>777 hoge.Click +=
とか書いてTAB2回押せば勝手につくってくれるじゃん
780 :
デフォルトの名無しさん :2010/06/22(火) 05:54:13
>>779 だからその辺は
>>776 読めって
一旦デバックすれば継承したクラスも同じように操作できるから
それができないとFormを継承したForm1の設定はどうやって実現するんだよ
普段コードをごりごり書いてるのはFormを継承したクラスだぞ
>>780 MainFormのデザイナから継承させたコントロールのイベントを
プロパティウィンドウからメソッド生成させると
結局MainFormのクラス内にメソッドが追加されないか?
これじゃ分割出来てないんだが
ボタン100個あって、100個クリックイベントを書くのは愚の骨頂だろ。 インタフェースの仕事としては、どのボタンがクリックされたかを伝えるだけで良いんだからさ。 それ以上に、動かす用途によって書き方は変わると思うんだが。
100個あるボタンそれぞれが全く別の処理を行うというのは考えづらい ツールボタン的なものや、データ行それぞれに対するコマンドあたりだろうけど そういうのは共通の入り口から振り分けられる
だね
private void button1_clickClick(object sender, EventArgs e) { MessageBox.Show("1"); } private void button2_clickClick(object sender, EventArgs e) { MessageBox.Show("2"); } ... private void button100_clickClick(object sender, EventArgs e) { MessageBox.Show("100"); } なんてコードがあったら継承して、一つに纏めろと言いたくなるわな。
さすがにそれは・・・w 使う方も大変だな、ボタン100個
ソフトウェア和文タイプキーボードとか
788 :
デフォルトの名無しさん :2010/06/22(火) 14:03:54
>>787 TagでもNameでもいいので識別に使う情報も足せておけば
イベントハンドラで余裕で処理できるよ
789 :
デフォルトの名無しさん :2010/06/22(火) 14:10:08
>TagでもNameでもいいので識別に使う情報も足せておけば >イベントハンドラで余裕で処理できるよ TagでもNameでもいいので識別に使う情報持たせておけば 一つのイベントハンドラで余裕で処理できるよ
>>785 継承も何も、一つだけ作って後は全部同じの指定しろって感じ?w
IDEからもできるしな!
>>777 部品化したにもかかわらず、何処かのフォームの勝手な理由で部品を変更しようとするの?
>>790 MessageTextみたいなプロパティをつくり、IDEからも操作できるようにしておき、
クリックされた時にMessageBox.Show(MessageText)を行うようなボタンを作成すれば
IDEで配置→MessageTextを設定
という作業になるよ
わざわざつくるのめんどくさくてこうしてしそう。 private void Form1_Load(object sender, eventargs e) { Foreach (Control c in Panel1.Controls) { if(typeof(c)==typeof(Button)) ((Button)c).Click += new EventHandler(softkeys_button_click); } } private void softkeys_button_click(object sender, eventargs e) { Textbox1.Text = String.concat(Textbox1.Text, ((Button)sender).Text); }
デザイナで出来ない云々
>>785 この例だと継承なんていらないでしょ。
button_clickに全てまとめて自分自身を判別すればいいんじゃまいか。
>>794 自分自身を判断する際に適当なプロパティがあるかどうかってところだな。
796 :
デフォルトの名無しさん :2010/06/22(火) 18:15:47
>>795 Tagになんでも設定できるので識別情報を入れるか
Nameにbuttonxxxと言った感じでxxxの部分に識別情報を入れておけばOK
>>795 Tagってそういうのに使っちゃダメなの?
ボタン10個あってそれぞれに10個のイベントがあったら100イベント。 その他のコントロールもあったら数百個のイベントがあってもおかしくない。 そしてそれらが共通しない機能なのも普通にあり得る。 そういう状況の時にユーザコントロールを使えって話じゃないの? でもそれだとイベントを関連付けるときにプロパティウィンドウは使えませんよーって話。
>>798 >イベントを関連付けるときにプロパティウィンドウは使えませんよ
・・・お前は何を言ってるんだ・・・?
継承したのもカスタムのも、普通にプロパティ窓からイベント付けられるぞ?
流れ仏多義理でちょい質問 Firefoxみたいにタブに閉じるしいたけ付けたいんだけど オーナードローするしかない?
>>798 ユーザーコントロールにするのなら、
メソッドやプロパティ同様に、イベントもコントロール内で定義したらプロパティウィンドウで使えるっしょ。
802 :
デフォルトの名無しさん :2010/06/22(火) 18:49:40
>>800 タブ部分に閉じるボタンってこと?
labelなんかだと配下にbuttonとか置けるんだけど
タブコントロールのタブ部分にできたっけかな?
>>799 >>801 あれ?
プロパティウィンドウからイベントを自動生成+関連付けしたら、結局メインクラスに生成されない?
メインクラスに生成されたらわざわざユーザコントロール作った意味がない気が…。
ああごめん。何いってんだ。 ユーザコントロールの方のプロパティウィンドウ使えばいいんだよね。
>>802 どうもタブそのものを取得するのが難しいみたい
だから結局
>>803 って結論しかないか
WPFなら簡単なのかねー?
807 :
デフォルトの名無しさん :2010/06/22(火) 19:21:55
>>806 あとはタブぽい動きをするユーザーコントロールを自分で作るかだねえ
質問です。 RichTextBoxで行間をピクセル単位で指定する方法はありますか?
コントロールを継承した時のデザイナってなんで表示されないんだっけ?
>>806 WPFなら簡単だね、タブに何でも入れられる。TabControl in タブなんて意味不明なUIさえ可能だ。
>>808 WinFormのRichTextBoxだと、EM_SETPARAFORMATで設定できないこともない
WPFなんて使ってるアホまだいるのか
WPFはこれから
WPFとかXNAとかしょっぱいもん使って作るくらいなら DirectXをちゃんと使えるようにしろと
軽さが本分のIDEを、良いグラボ必須にした戦犯と聞き及んでおりますが、反論は?
IDEの本分が軽さであった時などない。はいろんぱー
つまりは作るアプリ皆高性能グラボ高性能CPU必須にする素晴らしい技術ですな。 いやはや、NVIDIAにAMD、インテルから感謝状が期待できますのう。
じゃあいつまでもWin9x基準で作ってろよ Win7がちゃんと動く環境ならWPFは普通に動く
糞ボロいPCで開発、糞ボロいPCで使用っていうなら.netの使用自体を考え直した方がいいんじゃ 煽りじゃなく C#(.net)が出た当時なんてもっとボロカスに叩かれて「誰が使うんだよw」とか言われてたが ハードの進化で今は軽い方だと思うけどなー
WindowマネージャがGPU使ってる時代に中身のツールキットだけレガシーに拘ってもねぇ
Windows7ったら、未だにVista以下のシェアだぜwwwww ちなみに、XP 62.55%、Vista 15.25%、7 12.68% (NetApplications May, 2010)。 いつになったらメジャーになるんだろうかな?
新しいハードの性能を活かさないともったいないから見た目をちょっと豪華にしようっていうだけだろ 見た目がどうでもいいんだったらWindows95時代の格好悪いUIで作ってればいい 今のWinFormsの見た目だって数年後には古臭くて格好悪いと認識されるようになってるよ
64bitつかうで無い限りやっぱりXPだよな。 ワクチンソフトの対応さえあればXP64bit使いたいんだが。
まだサポート期間残ってるし、しばらくはXPが優勢でしょ。 まーでも、ここ1~2年で大分変わると思うけど。
あの7のGUIの出来は拷問だよマジで。
でも、自分も 12.68% の一員なんだけど・・・やっぱ使いづらいわコレ。 一年近く使っててもイライラする。
>>823 よくわからんが64bit7でワクチンソフト?ウィルス対策ソフト?なら使ってるよ
>>821 歴史に学べ
どのOSもメジャーになるのに数年かかってる
SPが2になる頃にはシェア一位になってる
>>828 では、Vistaもそろそろメジャーに!
長年XPを使っていたので7で慣れが必要なのは確かに煩わしい が、ある程度のスペックならばXPより快適だぞ XP厨だったのに素直に降参した
どの辺が使いづらいの? 普通に便利に使ってるけどなぁ。
初心者ならともかくプログラマでしょ? 一般人から見たらPCウィザードでしょ?w カスタマイズしたりショートカットキー使ったり補助ツール使ったりしてたら使い勝手なんか全然変わらないよ
>>827 7の64bit版はワクチンソフトの対応有るけど、XPの64bit版の対応が無いんだよ。
で、泣く泣く7の64bit版使ってる。
ここはドザ板かw
いくらでもあるだろよ・・・。
これが情弱ってやつか・・・。
ツールバーにスタートメニュー作ってるが元々のスタートが邪魔。 ライブラリが幅きかせすぎ。 おまけにクリックすると「アクセスが拒否されました」なフォルダ大杉。 エクスプローラでフォルダ開くとフォルダのツリーで現在のフォルダがなぜか一番下にスクロール。投げ飛ばしたくなる。 時々、デスクトップにdesktop.iniが居座って削除出来ない。 ホームグループアイコン、レジストリ弄ってデスクトップから消しても消してもいつのまにか復活。 USBメディア抜き差ししてるとUSBアイコンが消える。まだもう一本刺さってるだろがぁ! これは相性の問題かもしれないが休止から戻るとNICがだんまりする確率高し。 セキュリティの問題なのか知らないが、旧型のTeraStationと繋ぐときにはグループポリシーでNTLM応答のみ送信にしないとならない。 はぁはぁ・・・他にも色々ありすぎて・・・思い返すと段々腹が立ってきた。
お前は死ぬまでXP使っとけよw
ふあ…ふ
7上のものならいいけど、XPEとかEmbedded用XPの開発も結構あるのよね。 まだ5年以上MSのサポートもあるわけだし。 ここら辺はうまく使い分けないとな。
VPCって微妙にめんどくさいから結局は隣に古いPCを置いてXP入れてテスト専用にしてるわ
VPCって微妙にめんどくさいから結局は隣に古いPCを置いてXP入れてテスト専用にしてるわ!!!!!
>>832 エクスプローラのAlt>F>WがAlt>F>Xに変更されてたりしててだな。
すぐ慣れるんだけどさ。
>>837 まあ、UIの操作性は確かに難が多い。
単なる慣れの問題と言い切れない改悪点がいろいろあるとは俺も思う。
最悪なのがファイル検索の改悪。
だが、
>おまけにクリックすると「アクセスが拒否されました」なフォルダ大杉。
こんな文句垂れる人はシステムフォルダを隠さない設定にしちゃダメだろw
7はXPよりも安定してるからいれてるな ファイラー使うから7特有のUIとか関係なし OSは安定さえしてればいいよ
なら2000でいいじゃん。
ファイラーなんて死語だと思ってたw っていうか、使えるファイラある? Avestaとか使いにくいし、UltraExplorerは期待してたが結局放置状態のようだし
>>846 マルチCPUに対応してない
サポート切れてセキュリティ死んでる
.Net4が入らない
スリープが終わってる
パフォーマンス悪い
安定云々以前に論外です
>>847 UltraExplorer風のものをdelphiで作ったからそれ使ってる
ここドザ板かと思ったw
>>847 x-finder使ってる。極稀に落ちるけど気にならないレベル。Win7pro64bit
>>844 例えば SendTo。
実際は SendTo は C:\Users\{ユーザ}\AppData\Roaming\Microsoft\Windows\SendTo
なんだけど、何故か C:\Users\{ユーザ}\SendTo が意味もなく存在してアクセス不能。
こんな変なものがあっても、隠れていたら良いとか言えるのか?
>>851 >何故か C:\Users\{ユーザ}\SendTo が意味もなく存在してアクセス不能。
うちのセブンちゃんにはありません
>>851 実際は(管理者権限なら)アクセス権をちゃんと設定すればアクセスできるんだけどさ。
まあ、アクセスを制限されるのに「管理者」って名ばかりなのは何なの、
って突っ込みたい気持ちは俺も分かるけどw
信用できる管理者に対する制限は少ないんだよ。w
7で嬉しかったのは存在しないネットワークのパスのファイルにアクセスしようとして固まってもプロセスは殺せるようになった。 Vistaまではタイムアウトするまでプロセスを殺すことすらできなかった。 VistaからAPI追加されて対応したと思ってたのにVistaでも追加したAPIを使ってないのか殺せなかったなぁ…
数百個のファイルやフォルダを選択しただけでエクスプローラが落ちる仕様はvista以降解消されたの? この仕様のせいで数百個のファイルの入ってるフォルダを別フォルダに移動する時に手動で50個くらいずつ移動しなくちゃいけなくて不便。
>>856 落ちるとなるとむしろ変なシェル拡張とかが入ってる環境じゃないかと疑いたくなるなぁ。
XPでも数百くらいのファイル数というかただファイルが多いという状況で落ちたことなんて全然ない。
それでもVista以降のエクスプローラの安定感はXPとは比べものにならないと思うよ。
でも、Vistaのエクスプローラは7を触ったあとでは操作性がいろいろクソすぎてもう触る気が起きないので7がお勧めだなぁ。
Vista以降で解消されたのか?ってことは、Vistaよりも前のOSでおちるってことだよね。 Meは知らんが、2000、XPでは当たり前のように1000ファイルぐらい選択していたよ。 ファイルの種類にもよるんだろか。
XPだとファイルを1000個コピーしようとしてプチフリして「残り 192839分」とかしょっちゅう見るけどなあ
それは > ファイルやフォルダを選択しただけでエクスプローラが落ちる と何か関係が?
結局ユーザーコントロールに文句言ってる奴は使い方知らないだけなんじゃねぇか、と疑いたくなるなー。 普通にFormを継承したMyFormとかTextBoxを継承したMyTextBoxみたいなの使うよな? デザイナ上で普通に動くし・・・
まあなw
ユーザコントロールつかってバインド 内部でDI使った更新処理とか超楽ちんだった 過去形なのは今はWPFやってるから! なんせもっと超楽ちんぽんなのだ!
>>810 808です。ありがとうございます。ちょっと検索してみます。
>>851 それらはXP以前のバックアップ系アプリの互換性のために設けられたジャンクション。
Vistaや2008の時に騒ぐなら許せるが、今更過ぎるので許さない。
この情弱開発者が!
>>861 まあそういうのはドトネトの用語では「カスタムコントロール」なんだけどねw
誰も「ユーザーコントロールに文句」言ってる奴なんていないと思うが、
「俺はデザイナのバグなんか遭遇してことねえよ」って言いたいなら、
だからそりゃ超シンプルなコントロールしか作ってないからだよ
再現性のあるパターンを提示すれば終わる話なのに。
バグレポートしていないのか、したけれどバグとして認識されなかったのか。
if (DesignMode)を適切に使えば回避できる(というより自分でエラーを作っている)とか
>>866 バグる話はよく聞くから本当にあるんだろうね。
俺はなったことないからどうでもいいけど。
で、論点ずらして何がいいたい?
もっとたくさん使ったらあなたにも分かるよ、ということを言いたいんだろうよ。
ある意味鼓舞してくれてるんじゃね? もっと使い込めよ!と。 無い物をゴールに置くとかやり手だわぁ
ビット演算を表したインターフェースはありますか?
ない
んで、Vistaはいつメジャーになる・・・じゃなくて、WPFが重たいPCがいつごろまで
居座るかが問題だ。
どのPCでも動かそうっていうアプリを組むなら、あと数年はFormsかなぁ。
まあ、いずれにしろ時間の問題だろうけど。
>>873 System.Collections.BitArray なんかはどーだろう?
今のPCで問題なく動くアプリしかないなら買い換えなくて済むからね。 重たいアプリを作るべき。無駄に重たいのではなくてね。
ありませんでしたか フラグ扱いのenumを管理するジェネリッククラスを 作りたかったんですが、何か良い方法はありませんか? 二つをまとめた値をチェック出来るならhashsetでも いいのですか。
ビット演算を表したインターフェースってどういう意味なんだろうw
interface IBitwise<T> { T BitwiseAnd(T other); } こんなん?
>>857-859 あれ?2,300個くらいで落ちるのは普通だと思ってた。
てかvistaでも落ちた。
確認したのは98,XP,Vista。あと2000もだったかも。
それぞれ全く違う環境だから特殊なわけじゃないと思うけど。
vistaは比較的新しいノートPCでOS入れ立てで確認。
ファイルはそれぞれのPCで違うけど、同一種類のファイルでも別々の種類のファイルでも確認。
>>880 けど、それに意味があるとしたら、ある型Tの「論理和」なら「論理和」に
複数の定義がありうる場合だけじゃないのかな。
やっぱ変だと思うけどなw
>>869 まさしくユーザーコントロールでうまく動かない例じゃないか。
VS2008以前のデザイナのバグうんぬんの話って 開いた直後は特に問題なくてしばらくなにかしてると重くなってくる 段々コンテキストメニューが選択できなくなったり固まったり パーツが消えたり中身が表示されなくなっていく でもデザイナ閉じて開きなおすとしばらくはまた普通に使える コードが悪いとかいう以前の変な動作のことだろ?
ある2つのフォルダ間で同じファイル名かつ更新日時が新しいものをLINQで取得したいです。
IEqualityComparer<FileInfo>を継承したMyCompareを使ってExceptしたのですがうまくいきません。
GetHashCode()で return 1;など定まった値を返せばうまくいくので、GetHashCode()の実装が悪いのかと思います。
しかし、オブジェクトを一意に特定するためのメソッドなのだからそういった実装は間違っていると思います。
もしかしたら全然勘違いをしているかもしれませんが、どなたか助け舟をいただけませんか?
よろしくお願いします。
ソース:
http://ideone.com/Ttea4
Equals(a, b)がtrueのとき、GetHashCode(a)とGetHashCode(b)は同じ値を返さないといけない。 ハッシュの計算にフルパス使ってちゃ、 ファイル名と更新日が同じなのにフォルダが違ったら違う値になる。 それ以前に差集合じゃダメじゃないか?
887 :
デフォルトの名無しさん :2010/06/24(木) 10:32:57
GetHashCodeでreturn 1は間違いじゃないよ 一意である必要はない
>>885 とりあえず答えるが、間違いの指摘以外の質問は受け付けない
// 'a : new { string DirectoryName, string FileName, DateTime ModifiedTime }
// files1 : IEnumerable<'a>
// files2 : IEnumerable<'a>
from f1 in files1
join f2 in files2 on f1.FileName equals f2.FileName
select (f1.ModifiedTime >= f2.ModifiedTime) ? f1 : f2
>>888 LINQつかうとスゲー短くかれるんだな。
こりゃ覚えたほうが仕事がらくになるな。
だれか、僕にVisualStudio2008StandardEditionを買ってください(><;)
しかし型推論がついてまわるから、読んでるうちにわけわかめ。 コードを自己レビューする際に混乱してきて「もーいいや、大丈夫、正しい」にならんかと心配。 すでに机上でのレビューは遺物で、IDE必須なのか・・・
短くて、可読性も高いなら、それでいいんだろうけどね
>>891 型を明示してもいいのよ?
>>888 だって匿名型a'にしてるけどFileInfoでいいし
from FileInfo f1 in ... とか join FileInfo f2 in ... とか書けるし
不要な情報を除去して意図を明確にするのも大切
少なくとも
>>888 をLINQ使わずに書いても分かりやすくはならないと思うよ
>>894 それはダメじゃないかな。
その形での型の明示はキャストだから。
>>886-887 ありがとうございます。
GetHashCodeの動きを全く勘違いしていました。
マルチ質問なのに親切にお答え頂いてありがとうございました。
FullNameをNameにすると期待通りの動きになりました。
>>888 後出しで申し訳ありませんが、Whereを使用した解決方法にはたどりついていました。
ともかくありがとうございました。
LINQの弱点はブレイクポイント置いてデバッガで追えない事
本質的には状態を持たないはずだからステップ実行できるのは本来おかしい
LINQって継承とか出来るの?
902 :
デフォルトの名無しさん :2010/06/24(木) 22:43:37
全てのコントロールは、Controls配列に自動的に格納されますよね。 それで、 あるコントロールが、全体の、と言うか、 そのプログラム内のControls配列の中の 何番目になっているのかを判別する方法ってありますでしょうか? プログラムから。
> そのプログラム内のControls配列の中の 親コンテナのControlsに入ってるだけで、アプリケーション全体の一つのコレクションなんて物は無いはずだが
904 :
762 :2010/06/24(木) 22:54:40
>>901 拡張メソッドでなくても構わないよ。インスタンスメソッドでもいい。
from x in hoge where x < 10 select x は単に形式的に
hoge.Where(x => x < 10).Select(x => x);
と解釈される。HogeにWhereという名前のインスタンスメソッドがあればそれが呼び出されるし、
拡張メソッドが呼び出されることもある。ルールはそれだけ。
すまん名前は忘れてくれ
>>904 おお、そうなのか。
クラスとLINQがインターフェースできなくって使ってなかった。使ってみる気になったぜ。
>>902 Form上ならthis.Controls<TextBox>().Select(c=>c)でTextBoxだけとれる。
何で順番付けるかは好きにすればいい。
>>907 え、そんなことできるのか?知らんかった。ごそごそ
private void InitializeMe() {
var c = this.Controls<TextBox>().Select(c => c);
}
ん?
エラー 1 プロパティ 'System.Windows.Forms.Control.Controls' は型引数と一緒には使用できません。 C:\User\VS2010\Projects\test\ControlsTest\Form1.cs 18 17 ControlsTest
えーと、どーやるの?
Controls.OfType<TextBox>()のことかしらー?
おー、それそれ。なるほど。
しかし、 var con = this.Controls.OfType<TextBox>().Select(c => c); foreach (Control ctr in con) { textBox1.Text += ctr.Name + "\n"; } と foreach (Control ctr in this.Controls) { if (ctr is TextBox) { textBox1.Text += ctr.Name + "\n"; } } の、どちらが分かりやすくて保守しやすいかが問題だな。 こんなサンプルじゃLINQには役不足なのかな。
foreach (TextBox t in this.Controls.OfType<TextBox>()) { textBox1.Text += t.Name + "\n"; }
>>911 絶対OfTypeだねえ。
ネストが減るのは良いことです。
将来的に中がどれだけ膨らんでいくかわからないし。
textBox1.Text += string.Concat(from c in Controls.OfType<TextBox>() select c.Name + "\n");
>>914 Concat より Join のほうがよくないか?
Joinなら末尾に\nを足さなくていいから、よりすっきり書けるね。
うん
ちなみに拡張メソッドの.Select(c => c)は無くても可だよね
そこはワンライナーにこだわるのやめて、 var texts = Controls.OfType<TextBox>().Select(x => x.Name); var joined = string.Concat(texts); textBox1.Text = joined; くらいにはしたい。 区切りごとに多少意味のある変数名付けて。
というか、この例の場合だと、WPF 使ってデータバインディングと MVVM パターン使って解決したいところ。
うんそうだね
>>919 あまり重要でない部分で、余計な一時変数がぽんぽん出てくるほうが嫌だなあ。
そりゃ、var x とか var temp だらけだと嫌だけど、 意味のある名前が付くってのが区切りを作る1つの指針だと思うのよね。
んじゃ ListBox と Label と UserControl の派生コントロールもよろしく。 ああ、ListBox と UserControl は Tag に String が入っている奴だけ、Label は 逆に Text が ":" で終わっている奴と Image が null でない奴はいらないから 除いておいてね。 とか簡単でかつ分かりやすく修正できるなら、今すぐ乗換も考えてみよう。 非LINQの例 foreach (Control ctr in this.Controls) { bool hit = false; if (ctr is TextBox) { hit = true; } else if ((ctr is ListBox) || (ctr is UserControl)) { if (ctr.Tag is String) { hit = true; } } else if (ctr is Label) { if ((ctr.Text.EndsWith(":") || ((ctr as Label).Image!=null))) { } else { hit = true; } } if (hit) { listBox1.Items.Add(ctr.Name); } }
それはLINQとか以前の問題だろうw やってることが整理できてないから汚いだけ
やるまえからギブアップか?とか無駄に煽ってみる。
クリアボタンとか実装したときそんなコード書かされたのを思いだした。
928 :
デフォルトの名無しさん :2010/06/25(金) 21:42:11
すみません。
http://dobon.net/vb/dotnet/system/sessionending.htmlを参考に システムシャットダウン時のアプリ終了処理を書くことができました。
(タスクトレイ常駐型アプリです。)
ですが、上記のページは、Formがあると前提のプログラムで
SystemEvents.SessionEnding -= new SessionEndingEventHandler(SystemEvents_SessionEnding);
という一文をForm1_Closedメソッドの中で書いています。
私のプログラムはタスクトレイ常駐アプリでほとんどフォームを表示しないので
どの部分で書けばいいのかわかりません。
知っている人がいましたら、教えてください。
ファイルを読み込むメソッドで、 フォーマットが多少変でも最後まで読みこむけど 途中で発生したエラーは全部記録して呼び出し元に返したいなんて時って どんな風に実装するのがスマートなんでしょかね。 戻り値は読み込んだ値を返したいから out あたりでリストで返すのがいいのかなぁ。 それともイベントで逐一返す方がいいんでしょか。
LINQ 以前の問題だなぁ。 百歩譲ってその処理が必要だとして、 非 LINQ で回すにしても、それは条件を一度メソッド化して、 foreach (var ctr in this.Controls) if (cond(ctr)) listBox1.Items.Add(ctr.Name); とすべきだと思うし、これの LINQ 化は、 foreach (var item in this.Controls.Where(x => cond(x)).Select(x => x.Name)) listBox1.Items.Adde(item);
煽ってはみたものの、そういう場合にフィルタとか結合とかどうやるのか分からなくて 参考例が欲しいだけだったりする。 エレガントに書けるならば、それに越したことないから教えてくれ。 おおっと思ったら真似するから。
>>929 デリゲートかインターフェイスを引数に渡して、エラーが起きるたびにコールバックする
イベントでも同じだけどコンポーネント作るのでもなければ大袈裟すぎるし分かりづらい
おお、 bool cond(Control ctr) { bool hit = false; if (ctr is TextBox) { hit = true; } else if ((ctr is ListBox) || (ctr is UserControl)) { if (ctr.Tag is String) { hit = true; } } else if (ctr is Label) { if (!((ctr.Text.EndsWith(":") || ((ctr as Label).Image!=null)))) { hit = true; } } return hit; } と出して、 var col = this.Controls.OfType<Control>() .Where(x => cond(x)).Select(x => x.Name); foreach (var item in col) { listBox1.Items.Add(item); } と書くわけか。でも、それって foreach (Control ctr in this.Controls) { if (cond(ctr)) { listBox1.Items.Add(ctr.Name); } } よりワケ分かんないからフーン。
>>933 お前みたいなアホが書いてもカオスを生むだけだからifの羅列に埋もれてたほうがいいよ。
>>928 起動時に一回+=してアプリ終了までそのまんまなら別に-=する必要はないよ
936 :
928 :2010/06/25(金) 22:17:01
デストラクタに書いてもいいですか(´・ω・`)
937 :
928 :2010/06/25(金) 22:19:05
>>935 おお、どうもありがとうございます!!
-=は必要ないんですね!すみませんでした。初心者スレで聞いたほうがよかったみたいです。
ありがとう。
他のところで実際にやっちゃってそうだから言っとくけど、デストラクタで-=してはいけない。 イベントで繋がってる間、イベントの登録先がGCされない限りは絶対にイベントハンドラ側はGCされないから 何の意味もないどころか、デストラクタで他のオブジェクトにアクセスしてしまうとそのオブジェクトが復活してGCタイミングが遅れる。
>>934 933見れば分かるが、言われた書き方書いたら、非LINQより字数多くなってたでござるの巻。
if に埋もれる以前に複雑にしてどーするよ?
>>939 アホだと行ったのは、お前の出したLinq版と非Linq版は挙動が違うからだよ。
お前みたいなアホが書いてもカオスを生むだけだからLINQの羅列に埋もれてたほうがいいよ。
>>940 ふむ、試して挙動は同じだったんだが、試し方が足りなかったのかな?
具体的には?
943 :
928 :2010/06/25(金) 22:38:17
>>938 確かに、やっちゃいそうでした・・
自分にはまだかなり難しそうですが、やらないということは
しっかり覚えておきます。どうもありがとうございました。
>>939 文字数 = 複雑度じゃないけどね。
意図を記述するってのが大事。
この例くらいなら、各要素なめて(foreach)、もし条件満たすなら(if)なんで、
LINQ でなくても大体意図表せてるし、別に元のままでもいいと思うけど。
もちろん、cond の部分を関数化してない
>>924 はそれ以前の問題で論外。
>>942 ああ、ごめん、挙動というのは言い方が悪かった。
OfTypeは完全不要だし、下と合わせるならSelectも微妙なところだから
字数が多くなって複雑とかいうような比較なら
foreach (var item in this.Controls.Where(x => cond(x))) {
listBox1.Items.Add(item.Name);
}
じゃないのかな、と。
結局、ifを中に置くか外に置く(Where)か、という
textBox1.Textの例と同じ話になってる。
まあ、比較部分をcond関数に分けたから、そうなるのは当然だけど。
Linqの良し悪しを語れる例ではない(これならどっちでも好みでいい)
>>945 >>908 'System.Windows.Forms.Control.ControlCollection' に 'Where' の定義が含まれておらず、型 'System.Windows.Forms.Control.ControlCollection' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
それとも、何か参照を追加したらコンパイル通るのか?
試してみたコードのusingを貼ってくれ。
>>946 あー、試してないで言ってたよ、完全に俺が悪い、
偉そうなこと言ったくせに、ほんとすまん。
IEnumerableにはCast<T>もしくはOfType<T>が必要。
LinqはIEnumerable<T>が基本なので、
isやasで分岐させるといった、複数の型を扱うのには向いてない。
今回は基底型にアップキャストしたうえで、
別関数に分けたとはいえ型判定でダウンキャストして分岐させるという
二度手間三度手間状態になってるので、Linqには向いてない例ということになりそう。
GetType()の戻り値でGroupBy()できるだろ。
>>向いていない例
向いている例として、IQueryableとかExpressionとか、なんとなく換えのなさげな
新(?)機能は色々あるのに、いまいち使い方がピンとこないんだよなぁ。
>>948 コード書いてよ。
LINQ が向いてる向いてないじゃなくて、
>>924 のプログラマーに向いてなさが絶望的なレベル。
>>948 デザパタ覚えたてのアホプログラマが
if文を何でもかんでもストラテジに置き換えてたのを思い出したわ。
中途半端な派遣にこういうのが多い。
職業SEだからね。 簡潔さなんて自己満足じゃなく、目で追いやすさ確認しやすさが第一なんよ坊ちゃん。
おっと、プロの職業SEの出す例が924というなら問題アリアリだな。
かなりねぇ。 見やすさとかいう以前に設計やばそう。
955 :
デフォルトの名無しさん :2010/06/26(土) 00:35:16
>>924 は上から目線ぐあいから見て上流のSIerか?
日本に置けるIT業界の癌
サンプルとして適当に作った仕様に文句言われてもなwwwwwww
そんなアホな仕様だろうと、ちゃんと実装して実現可能と示したんだから、
文句言われる筋合いはないな。
文句を言えるのは対抗してコード出してきた
>>930 とかだけ。
反論もコードでお願いしますね、プログラマーに向いているお方。
必死ww
むしろ、小さなサンプルにこそセンスや実力が問われるんだが。
959 :
デフォルトの名無しさん :2010/06/26(土) 00:42:34
こんなスレでどうでもいいよ
ちっとは口動かさないで手を動かしなさいよ。あ、レスも手かwwww
>>924 listBox1.Items.AddRange(
from c in this.Controls
where
i is TextBox ||
((i is ListBox || i is UserControl) && i.Tag is string) ||
(i is Label && !(i.Text.EndsWith(":") || ((Label)i).Image != null))
select i.Name);
>>961 x from c in this.Controls
o from i in this.Controls
要 .OfType<Control>()
なるほど、 var ctrls = from ctr in Controls.OfType<Control>() where ( ( ctr is TextBox ) || ( ((ctr is ListBox) || (ctr is UserControl)) && (ctr.Tag is String) ) || ( (ctr is Label) && (!((ctr.Text.EndsWith(":") || ((ctr as Label).Image!=null)))) ) ) select ctr.Name; listBox2.Items.AddRange(ctrls.ToArray()); ※ OfType追加と、AddRangeはIEnumrable<String>許容しないんでToArray噛ませた と書けばいいんですね。言われてみたら当たり前だった・・・。 これなら(個人主観で)納得。簡潔に書きたい場所で使ってみます、ありがとうございました。
あ、こう書けばよかった。 listBox2.Items.AddRange(( from ctr in Controls.OfType<Control>() (where 句省略) select ctr.Name ).ToArray());
家に帰ったら参戦
Func<Control, bool> lambda_cond = ctr => ( ( ctr is TextBox ) || ( ((ctr is ListBox) || (ctr is UserControl)) && (ctr.Tag is String) ) || ( (ctr is Label) && (!((ctr.Text.EndsWith(":") || ((ctr as Label).Image!=null)))) ) ); と delegate で条件書いて、 foreach (Control ctr in this.Controls) { if (lambda_cond(ctr)) { listBox3.Items.Add(ctr.Name); } } と差し替え可能にしてみたんだけど、LINQ 版の書き方がわかんないです。 listBox2.Items.AddRange((from ctr in Controls.OfType<Control>() where lambda_cond select ctr.Name).ToArray()); と書くと「型 'System.Func<System.Windows.Forms.Control,bool>' を型 'bool' に暗黙的に変換できません。」。 どう書いたらいい?単に書き方の問題だと思ってる。
天啓キター listBox2.Items.AddRange((from ctr in Controls.OfType<Control>() where lambda_cond(ctr) select ctr.Name).ToArray()); で自己解決。当たり前だw
じゃあ俺はこれで Func<Control, bool?>[] filter = { c => (c is TextBox) ? true : default(bool?), c => ((c is ListBox || c is UserControl) && c.Tag is string) ? true : default(bool?), c => (c is Label && !c.Text.EndsWith(":") && (((Label)c).Image == null)) ? true : default(bool?), }; var q = from Control c in Controls let qq = from f in filter select f(c) into r where r != null select (bool)r where qq.FirstOrDefault() select c.Name; listBox1.Items.AddRange(q.ToArray());
判定をor別に配列化してサブクエリでマッチング。 マッチはtrue,アンマッチはnullで結果にnullしかなければfalseとしてtrueを集める。 判定を分割して追加削除をやりやすくしようと言うんですね。 むずかしす・・・でも更新箇所は配列要素になっていて扱いやすそう。 filter をパラメータにして関数化してしまえば隠蔽できるし。
ところで、WMIにLINQを適用してみて、こりゃ便利と理解。 Func<string, IEnumerable<ManagementObject>> GetManagementObject = type => new ManagementClass(type).GetInstances().OfType<ManagementObject>(); foreach (var d in from ldisk in GetManagementObject("Win32_LogicalDisk") from l2p in GetManagementObject("Win32_LogicalDiskToPartition") from d2p in GetManagementObject("Win32_DiskDriveToDiskPartition") from disk in GetManagementObject("Win32_DiskDrive") where ldisk.ToString()==l2p["Dependent"].ToString() && l2p["Antecedent"].ToString()==d2p["Dependent"].ToString() && d2p["Antecedent"].ToString()==disk.ToString() select new {Name=ldisk["DeviceID"], PNPDeviceID=disk["PNPDeviceID"] , ldisk, l2p, d2p, disk }) { Console.Out.WriteLine("{0} : {1}", d.Name, d.PNPDeviceID); } とか。いや本当に便利だわ、これなら。 これで、DiskDrive と結びつかない LogicalDisk もリストアップしたいと挑戦中。 outer join とかどう表現したらいいんでしょう?
クエリキーワードにはjoinもあるが
すみません。正確には、こういう場合での DefaultIfEmpty の使い方です。
あ、Win32_LogicalDiskToPartition と関連づかない Win32_LogicalDisk を集めて Union で混入させてしまえば、というアイデアが浮かんだ。 でも、左外部結合を繰り返すパターンの書き方が知りたいです。 関連づかない場合は l2p, d2p, disk のそれぞれに null が入って返ってくる方法。 今は foreach (var d in from ldisk in GetManagementObject("Win32_LogicalDisk") join l2p in GetManagementObject("Win32_LogicalDiskToPartition") on ldisk.ToString() equals l2p["Dependent"].ToString() into ld_l2p from ld_l2p_outer in ld_l2p.DefaultIfEmpty() join d2p in GetManagementObject("Win32_DiskDriveToDiskPartition") on l2p["Antecedent"].ToString() equals d2p["Dependent"].ToString() join disk in GetManagementObject("Win32_DiskDrive") on d2p["Antecedent"].ToString() equals disk.ToString() select new { Name=ldisk["DeviceID"], PNPDeviceID=disk["PNPDeviceID"] , ldisk, l2p, d2p, disk }) という感じで on l2p["Antecedent"].ToString() equals d2p["Dependent"].ToString() が 「名前 'l2p' は 'equals' の左辺のスコープにありません。'equals' の両辺の式を交換してみてください。」 となり、両辺の式を交換しても同じ、という処で詰まっています。
どうでもいいけど見づらいなぁ。
初心者スレには長いコードはideoneに貼れ というテンプレがあるけど、こっちにはないのね。 そして、964は、なんでわざわざ気持ち悪い改行に改悪するのだか…… これが職業SEの目で追いやすいコード?
>>976 >>964 とかは
foreach
from ... (で元の集合)
join ... (で結合する集合)
on ... (で結合条件)
into ... (で一次的な結合結果集合)
join ... (で結合する集合)
on ... (で結合条件)
into ... (で一次的な結合結果集合)
というように条件を追加削除しやすい単位でまず分けて、かつ横幅がA4印刷に
耐えられる程度で分けてインデントという意図。
何か疑問でも?疑問あるなら改良してくれ。
がーーーーーん、974と間違いた!! けど、考え方は同じ。 縦に伸びすぎない限りは条件の深さ別にインデントしつつ行分けしておいてる。 実際のコードだと更にコメントが入る。
>>964 の元々のインデントを全角空白で見え易くすると
var ctrls
= from ctr in Controls.OfType<Control>()
where (
(
ctr is TextBox
) || (
((ctr is ListBox) || (ctr is UserControl))
&& (ctr.Tag is String)
) || (
(ctr is Label)
&& (!((ctr.Text.EndsWith(":") || ((ctr as Label).Image!=null))))
)
)
select ctr.Name;
listBox2.Items.AddRange(ctrls.ToArray());
って感じで書いてる。
仕事振りにアヤつけられたらなんか、だんだん腹が立ってきた。 仕事でコメントも付けて書くとしたら、こんな感じかな。 #region 条件に合ったコントロールの名前をコントロール一覧に表示 var ctrls = from ctr in Controls.OfType<Control>() // 選択条件 where ( ( // TextBox の場合、無条件 ctr is TextBox ) || ( // ListBox, UserControl の場合 ((ctr is ListBox) || (ctr is UserControl)) // Tag が文字列 && (ctr.Tag is String) ) || ( // Label の場合 (ctr is Label) // ":" で終わっているか、Image が null でないものは除く && (!((ctr.Text.EndsWith(":") || ((ctr as Label).Image!=null)))) ) ) select ctr.Name; listBox2.Items.AddRange(ctrls.ToArray()); #endregion IDEじゃなく印刷ベースでレビューとかするなら、コメントに●とか目立つ文字を 先頭に入れておくとか別インデントとかすることもある。印刷だとコメントも見づらいから。気分。 ムシャクシャしてやった。今は後悔している。
ideoneでやれ
ソースのフォーマットとかLINQ使うか否かとか以前にやり方が汚い
修正のしやすさとかいうんだったら、LINQやラムダを使うかどうかはどうでもいいけど
考え方は
>>969 スタイルにするべき
981は for(){ } // for終わり とか string hoge = hage; // hogeにhageを代入 とかかきそうだね。 コメントだらだら入れれば見やすいってもんじゃねーぞ。 そんな小さい部分にregionもいらねえし。
>>981 メソッド内でregionで閉じられたソースがあったら
どれだけ長大なソースが展開されるのかと思って怖くて仕方が無いです。
まともな行数のメソッドならregionが必要になることもないわけだし、
メソッド内でregionを使う習慣がある人のソースはどれだけ長大な最長不倒メソッドを日頃から作ってるんだよという感じで怖すぎます。
>>987 もしかしたら作業用の画面解像度が低いだけかもしれないぞ
ちなみに100行近くなったら関数分割考えるし、それ以前でも共通処理多けりゃ
共通化するよ。ご心配なく。
サンプルってんだろ・・・ほんと
>>960
ちょい開いてみた。
http://ideone.com/9bOXe ネストの気持ち悪さは減ったけど共通的な部分多いのが気になってる。
こんなことしなくても join のうまい書き方ってありそうなんだけどなぁ・・・なんとなくの感触だけど。
どうせならLINQ to WMI作ってCodeplexで公開しようぜ
>>969 さん、貴重なご示唆ありがとうございました。
まだ勉強しないと使いこなせないようですが。
ところで、次スレ建ててくるね。特にテンプレはつけないからよろしく。
>>989 100行をある程度の目安にするところは同意だが、メソッド内でregionはないな。
fold機能を覚えたての初心者がよく乱発する
#region プライベートフィールド #endregion #region コンストラクタ #endregion みたいな見りゃわかるよ系はどうよ
別にコメントの代わりに使ってるわけじゃないだろ コンストラクタやプロパティは畳んでおきたくなるのはわかる
オーバーロード単位で畳む人もいたな
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。