ふらっとC#,C♯,C#(初心者用) Part24
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
ふらっとC#,C♯,C#(初心者用) Part23
http://pc11.2ch.net/test/read.cgi/tech/1200033660/
WPFのRichTextBoxの行間がデフォルトで二行分空いているようなんですが 一行にするにはどうしたらいいんでしょうか
これたてなおす?
contravariantって何に使うんですか? MSの説明を見たのですが、基底クラスを引数に取れる利点がよくわかりません
>>5 イベントハンドラを一つにまとめられる、じゃ不満か
一般的な反変性の話なのか デリゲートの話なのか
>>6-7 そうですデリゲートの話です
一般的な説明じゃ何使うのかさっぱりで
デリゲートっていっぱい関数登録できるものって解釈だとヤバイ? 複数の関数入れて例外が起きたら残りは実行されないのかな 今サンプル動かそうとしてるけど俺あほすぎて時間がかかってる orz
>>8 似たようなデリゲート型をたくさん宣言しなくならなくちゃ
ならないような状況になれば分かるかと
>>9 MethodInvoker mi = M1;
mi += M2;
mi += M3;
mi.Invoke();
void M1()
{
MessageBox.Show( "Test1" );
}
void M2()
{
throw new Exception();
}
void M3()
{
MessageBox.Show( "Test3" );
}
>>10 covarianceなら、登録できるメソッドが増えるから分かるんですが、
contravarianceは減ってしまいますよね?
だからわからないんです
>>10 ありがと!やってみた
例外出たら止まるんか、超わかったw
感謝します
>>13 基底クラスのほうを渡せてもあんまり意味ないと思うのでよく分からないんです
よろしければ具体的な例を教えてください
event EventHandler Click; event MouseEventHandler MouseDown; void Hoge1(object sender, EventArgs e) { } void Hoge2(object sender, MouseEventArgs e) { } Click += Hoge1;//もちろんOK MouseDown += Hoge1;//MouseEventArgsはEventArgsを継承してるからこれもOK //Click += Hoge2; これはコンパイルエラー MouseDown += Hoge2;//もちろんOK
>>15 あ、よくわからずイベントハンドラの追加とか書いてましたがなんとなくぴんときた
buttonクラス内にはevent EventHandler Click;みたいにきっとあるんだなあ
>>15 Click += Hoge2; これはコンパイルエラー
これなんでまずいんですか?
文法的に許しちゃいけない理由が見あたらないんですが・・・
ヘタレな漏れにはメソッドが複数呼び出されるからって何がいいのかわかんね。
>>10 の例だと
M1();
M2();
M3();
って書くのがそんなにめんどくさいの?
って言いたくなるんだが
もっと、こう、デリゲードじゃないとそれは無理だね
みたいに納得できる例はないだろうか?
同じくよくわからんなぁ
俺も分からん 識者の人はやくきてくれー><
ちょうど今複数呼んでくれて嬉しいのに気づいたのはApplication.Idle あちこちのフォームで好き勝手に登録できる
>>17 引数eにMouseEventArgs型のオブジェクトが渡される保証がない
(EventArgs以下ならなんでも入れられる可能性がある)
>>18 イベントにイベントハンドラを複数登録できるようにするため
>>21 それきちんと後片付けしないとメモリリークするよ
>>22 >イベントにイベントハンドラを複数登録できるようにするため
順番って登録した順番に依存するんじゃないの?
アーキテクチャ的にまずくね?
マルチキャストデリゲートで一番使われるのはイベントじゃないかな。。 メインのオブジェクトがあって、 サブのオブジェクトたちがそれぞれイベント付けたりできるじゃん 親アプリにプラグインがたくさんある場面とか。 親は一発ですべての登録されたイベントを発行できる ちなみに dlg -= M1; みたいにそれぞれ取り外しもできるし dlg = null; でクリアもできる
>>23 そうね。むしろ順番に依存するようなのをデリゲートで書くべきじゃない
前から思ってたんだけど、デリゲートって高階関数と違うの?
>>27 関数を引数にとって、関数内で任意の処理ができるんだから同じじゃないの?
>>23 、
>>25 何がまずいの?w
いやもちろんまずい場面もありうるだろうが、そんなのむしろ例外的じゃないの?
っていうかC#ってVBのカスタムイベントみたいなことって出来ないんだっけ?
高階関数に相当するのはデリゲートじゃなくてデリゲートを引数に取るメソッドの方だろ
>>31 addとremoveは定義できるよ
raiseはない
>>34 ならハンドラを呼び出す順番もその気になれば一応制御できるんだよね?
どうのこうの言いつつ、
結果的に
>>1 が投げた質問で盛り上がってる俺ら
>>35 デリゲートオブジェクトは呼び出し対象の情報しか持ってないのに何を基準に並べ替えるの?
>>37 俺も具体的な用途があまりあるとは思ってないんだけど、抽象的な可能性の話だよ。
例えば標準のFIFO動作をLIFOに変更するとかさ。
詳しい人ktkr!! 誰かcontravarianceの使い方を教えてくだしぁ><
お前は使わなくていい
object型って変数宣言した瞬間にインスタンスが作られるんですか? くだ質スマンセン
作られないと思う 作られるのはintとかプリミティブ型だけ
C#にはプリミティブ型なんてないお
プリミティブ型(と呼ばれるもの)はあるよ 値型の中でも言語に組み込みのものをいう
ボクシングって知ってる?
本当かよw
intはプリミティブ型で、Int32がオブジェクト型じゃないの?
49 :
42 :2008/02/04(月) 20:40:33
値型の場合・・・・・変数宣言した瞬間にスタック上にインスタンスが生成される。 参照型の場合・・・変数宣言した瞬間にスタック上に参照情報が生成され、初期値としてnullが入る。 ということですよね? 実は手元の入門書で↓のような例文で、 int hoge hoge = 123; object obj; obj = (object)hoge; 「object obj; で、変数objのインスタンスをヒープ上に生成し、参照情報をスタック上に格納」 とあって混乱したのですが、間違いってことでしょうか?
>>49 >変数objのインスタンスをヒープ上に生成
うんここはまちがいだな
参考までになんて本?
>>48 全く同じ
言語仕様でも同じと明記されてる
>参照型の場合・・・変数宣言した瞬間にスタック上に参照情報が生成され、初期値としてnullが入る。 ちがうよ。
違うってんなら詳しく書け、書かないならレスつけんな
先生ども コンソールアプリケーションでデフォルトプリンタを取る方法って 普通のc#上には無いんでしょうか? 調べてみると、APIで取る方法とWSHで取る方法がありそうだけど WSHはデフォルトプリンタを取得するサンプルが見当たらないし、 APIだとどうも負け組みかなって思っちまいます。
55 :
42 :2008/02/04(月) 21:10:22
俺は
>>50 の言ってる事の方が間違ってると思うなw
っていうかヒープだのスタックだのなんてフレームワーク内部の低水準の話は とりあえずうっちゃっておいても問題ない、というよりそんなの後回しに すべきだと思うよ。
>>49 C++とごっちゃになってるようにも読み取れるな
>>49 そのライター結構いっぱい本書いてるけどやばい記述多いのかな
>初期値としてnullが入る。 入らないよ。
62 :
42 :2008/02/04(月) 22:34:56
そうですか。色々勘違いしてるのかもしれません とりあえず今は置いといて、本を読み進めようと思います。
値型も宣言しただけでは初期化されないよ。
64 :
42 :2008/02/04(月) 22:58:38
結局、宣伝はメモリ確保するだけで、(0やnullなども含めて)何かで初期化されるわけではない、ってことですかね? というか、当たり前か・・・
if(myPS->isString("+")){ if(debug){cout<<"24回"<<endl; } return true; 上の分の->これっていったいなにをしているんでしょう また、if文カッコ内debugの中の変数は0か1かではなく、True Falseでも判定かのうなのでしょうか? よろしくお願いします
猫でもわかるC#のフォーム編ってまだ発売決まってないのかな? 知ってる人います?
著者か出版社に聞けばいいじゃんw っていうか俺あの著者の本を好む人が理解できん。 あの人低水準のこと = 基本だと思ってないか?w っていうかどうでもいい無駄話が多すぎ。
>>67 そうなの?
かなり分かりやすく書いてあるから、重宝してるんだが
ありがとう、著者にメール送ってみる!
人によるんじゃねえかなぁ、独習シリーズも人によっては結構わかりづらいみたいだし 文体がお堅いっていうのはあるけどお浚いする為にはああゆうのが便利だと思ってる 入門は柔らかい文体の本一冊+Webで、くらいで
>>64 俺は宣言するだけじゃメモリ確保すらされないと理解してるんだが。
だって、一度も代入してないのをいきなり使おうとすると
>未割り当てのローカル変数 'name' が使用されました。
って出るじゃん
独習シリーズって教科書には向かないけど、 自分でコツコツ読むには何でも書いてあるいい本だよね
72 :
65 :2008/02/04(月) 23:51:02
分かる人いたらお願いします・・・
このスレはC#のスレ。それC++じゃないの?
アロー演算子って呼び方が一般的じゃないかな
そだね
>>未割り当てのローカル変数 'name' が使用されました。 >って出るじゃん 英語のメッセージは Use of unassigned local variable 'name' なんだぜ? allocateじゃなくてasign
紛らわしいw
デリゲートとかクロージャみたいな難しい概念を 実際のコードに使ってる人なんているの?
難しい(笑)
82 :
デフォルトの名無しさん :2008/02/05(火) 00:45:00
難しくないから普通に使ってるだろ。 Cでポインタが難しいと言ってるのと変わらない。
言語マニアしか分からなくないですか? デリゲートとかクロージャがなくて困るケースってあります?
.NET Fxはほとんど使えなくなるだろ。
85 :
デフォルトの名無しさん :2008/02/05(火) 00:49:33
イベントドリブンな処理
クロージャはともかく、デリゲートはVSでWindows.Formsをポトペタすると使いまくってるだろ。
そうなんか(´・ω・`) ポインタと違って無くても困らない程度のもんだと思ってたんだが
関数ポインタの代わりがdelegateなわけで…
MDIのアプリを作ろうとしていますが、 親のMDIフォームにToolStripContainerをDockStyle.Fillで張り付けた場合、 MDIの子ウィンドウが表示されなくなりますが、 これを表示させるようにするための解決法はございますでしょうか? Excel2003のようなアプリを目指しています。
クロージャはまぁ無くなっても困らんなw
ArrayListで作る配列って、多次元配列に出来るの?
ArrayList<ArrayList<string>>
ArrayListにArrayList突っ込めば
できるよ
そうか、出来るのか! 何か難しそうだけどやってみるよ!!ありがと!
コスト的に死ねると思うのは俺だけでいい
4次元配列とか案の?
お前は何を言っているんだ
任意のN次元配列を動的に定義できるの?
おまいの本当にやりたいことは配列の定義とかそんなちっぽけなことじゃなかったはずだ
任意のN次元配列を動的に宣言できるの?
動的にIL作ればいいんじゃね
C#で書いてみれ
つうか動的と宣言って相反するんじゃね
Array.CreateInstance
動的に作成じゃなくて動的に宣言らしいんだけど
静的に宣言するか動的に作成するかしか出来んな
108 :
デフォルトの名無しさん :2008/02/05(火) 09:51:18
>>79 遅くなってすません。
もう見てたんですが
もう一度見直したらしっかり使えるじゃまいですかw
ということでおかげさまで解決しました。
任意のN次元配列を動的に宣言できるの?
くどいよ
俺もn次元配列興味あるなぁ 以前作ったときは、n次元を1次元に無理矢理マッピングして コーディングしたんだけど、 エレガントさに賭けていたので
(´・ω・`)しらんがな
賭けていたのか コードを見てみたいところだ
確かに、int[][][][]・・[]とか書くのは美しくないなwww
N次元配列にアクセスする時はArray.GetValue
C#にクロージャってあるんですか? 匿名メソッドはクロージャではないと聞いたのですが どこが違うのでしょうか?
匿名メソッドはクロージャ
>>116 クロージャで正解。
クロージャの考え方はいろいろあってとくに手続き型の言語ではバリエーションが広い。
自分の使ってる言語と動作が違うからC#のは真のクロージャではないという議論が、
しばらくなされたことがあって、そのときに
>匿名メソッドはクロージャではない
という話が出回ったことがある。
>>117 >>118 ありがとうございます
メソッド内で匿名メソッドを宣言したときに、
親メソッドの変数を参照できないとクロージャではないみたいな話を聞いたもので
クロージャ自体方言みたいなもので
明確な定義がないんですかね?
逆にレキシカルクロージャ以外クロージャではないと言ってる過激派もいるけどね。
レキシカルクロージャってのも議論が混乱してて分からない俺涙目 どっかに分かりやすい解説ない?
匿名メソッドは親メソッドのローカル変数を参照できる
123 :
デフォルトの名無しさん :2008/02/05(火) 17:08:47
静的スコープってのは、クロージャの中身がローカル変数になることをいうの? 動的スコープて何?
C#についてるのってレキシカルクロージャだっけ?
>>124 動的スコープのクロージャはマクロみたいなものでC#ではありえない。
コードにするとこんな感じ。
var f = DFUNC(a) { return a + b; } // この時点で b は存在しない。
void A() {
var b = 2;
f(3); // 6が戻る。
}
void B() {
f(3); // b がないので実行時エラー
}
スクリプト言語でありそうなコードだね
java屋の質問なんだけど、名前空間とディレクトリ階層が一致しなくてもいいみたいなんだが みんなルール決めて変な事にならないようにしてるの? javaみたいに言語仕様で縛らないのは何か意味があるのかな。
むしろJavaが変
なんで言語仕様でディレクトリの構成が縛られないといけないんだ
言語なんて複数やってるもんなのにjava屋とかいっておきながら井の中の蛙とは一体
133 :
129 :2008/02/05(火) 21:12:36
>>130 んー、C#が変だとは思ってないんだが、クラス名の衝突を防いだりするためなんだから、ファイルもディレクトリ作ってぶつからないようにするんでないの?
>>129 今まで違和感無かったか?俺はあったぞ。
>>133 論理的な構成と物理的な構成が同じじゃなきゃいけないってのは原始的な感じがする
136 :
129 :2008/02/05(火) 21:40:50
チームで開発するときとかは、○○系はこのディレクトリに入れてって会社や個人でルールを決めてるってことか。 javaだとパッケージのルールだけ決めるだけだったから、C#には暗黙のルールでもあるのかな?って思ったんだ。 C#を悪く言ってるつもりはないんだけど、そう聞こえてたらごめん。
いやいや別に無問題
ArrayListって2.0ではListにとってかわられたんじゃないの?
悪く言ってるようには聞こえてないよ
たしかにもうListばかり使ってるな
>>138 非ジェネリックのクラスを使う事ってある?
俺にはあんまり目的が思いつかんなー
Silverlightでは非ジェネリックコレクションは削除されるって噂だよ
Silverlightみたいな環境だとジェネリックって重いような木がするんだけどどうなんだろ
ジェネリックって重いってどこから出てきた都市伝説だよ
重いっつかコードが肥大化するでしょ? Webにはどうなんかなーと
ArrayList使うくらいならList<object>使った方がなんぼかマシだ
ジェネリックが特殊化されるのは値型の場合のみでしかも実行時だよ
テンプレートじゃあるまいに
だいたいランタイムライブラリはクライアントにあるのに、 Webだからどうこうって意味不明だろ。
ArrayList使いまくってて しかもジェネリックが搭載されたのを知らないやつは まだ余裕で使ってるぜ? 1.1縛りな開発とかだと知っててもジェネリック使えないしな List<T>に慣れるとArrayListには戻れんな
そもそもジェネリックって何の事かわかってない C#はじめたばっかりの俺 ぐぐってみる
WPFはGDI+にとってかわるのかな?
WPFはノウハウが全く違うから普及するのに10年ぐらいかかりそうだな
Hashtableはよく使う。
>>152 WPFのソフトウェアレンダリングコードはGDI+からだいぶ流用したらしい。
社内的にはとってかわってるのかもね。
画像とハッシュテーブルがどうからむのかよくわからん(´・ω・`)
Hashtableは名前がダサい HashTableならいいのに
C#で作ったプログラムは必ず使う側に.NETが入っている必要があるんでしょうか?
いいえ
.NETがいらないC#プログラムを作るにはどうしたらいいんでしょうか? using System;とかありますがああゆうの全部.NETのクラスライブラリだとかなんですか? そこら辺のことが書いてあるサイトとかないでしょうか
>>161 無理
自分で1からコンパイラ作れば可能だけどさ
>>156 マルチスレッド絡み、やや微妙な制約はあるけどね。
ほんとはjavaのConcurrentHashMapだったかみたいな
専用のがあるといいんだけど。
>>162 コンパイラ作るだけじゃダメ
CLIを実装しないと
Silverlightは.NETじゃないといえば.NETじゃないかも
>>165 C#をネイティブコードにするコンパイラがあればいいんだろ。
別にILしなければならない理由はない。
ライブラリどうすんのよ…
ネイティブにして、移植したライブラリを使用したとして、 その環境は .NET ではないと言えるのだろうか。
すまんCLIはいらないみたい でも言語仕様に記載されてるBCL(標準クラスライブラリ)は全部実装する必要がある
c#暦1ヶ月です。 MSDNのページがさっぱり理解できないんですが、ある程度使えるようになったら読めてくるもんなのでしょうか?
日本語版は理解できなくても無理はない 英語版読め
つーかどこが分からんの?
>>170 カンでさがしてサンプルコード張って動かしてみるのが正しい使いかた
理解するんじゃない感じるんだ
クラスの解説を読めるようになるのは初心者脱出の第一歩だな C#の言語仕様についての説明のページはVB.NETと違って初心者向けに書かれてないから結構難しい
なんでC#ってネイティブコード吐けないんだろ
176 :
161 :2008/02/05(火) 23:00:46
monoはうにx版.NETみたいな感覚でした、それは置いておいて無理ですか、把握しましたありがとう
無理じゃないと言っているのだが。
>>175 .NETを使うために作られた言語だから
一応マルチプラットフォームを考えてるんだろうが、 だったら MS が色んなプラットフォームで処理系作りやがれと。
吐けないんじゃない。吐かないだけ。
馬鹿でかいBCLが障害
>>175 フレームワーク使う言語としては正しいけどね・・・
ネイティブコード吐ければもっと普及すると思う
何でネイティブコードにこだわってるんだ?馬鹿なの?
そもそも.NETを普及させるための言語なわけだから ネイティブコードを吐けるようにして普及を図ったところで意味がない
CPU ごとに別のマシン語はかないといけないとなると 処理系作るの面倒だし・・・。
もう.NETとかいう思想自体が古いけどな
>>175 いきなりネイティブコード吐くとリフレクションやLCGと相性悪そうだがその辺考えてみた?
192 :
170 :2008/02/05(火) 23:08:26
MSDNの読み方というか、歩き方みたいなのがいまいち分からんのです。 ググる時も、大抵先頭にくるMSDNはなるべく避けて、@ITとかのサイトに逃げてます・・・ 機械翻訳ぽいのがどうにも
新しいのが出てないのに古いとはなかなか言い辛いでしょう
>>192 俺がMSDN渡り歩けるようになったのはプログラミング歴5年目くらいです
非常に遅いな
というかネイティブコードじゃないこととフレームワークは関係ないだろ。
>>192 基本的にMSDNはリファレンス。辞書。
分からないときに引くものであって、教科書じゃない。
MSDN2になって翻訳は随分まともになったと思うが。
まあ変なVB系Tipsサイトよりは
そしてブーデー川俣の記事読むのか
.NET Tipsで十分場合が多い
緑のバイク
C#、でぐぐってでた1ページ目が日本語C#情報の9割だと思う俺
むしろ9割9分くらいだろ
何件表示するかの設定によるんじゃ
多次元配列の初期化で、配列初期化子は変数かフィールド初期化子の中でのみ使用できます。新しい式を使用してください。 というエラーが取れなくて困っています。 int[ , ] hoge = new int[ , ] { { 1, 2 }, { 1, 2 } }; は問題ないのに、 int[][ , ] hoge = new int[][ , ] { { new int[]{ 1, 2 }, new int[]{ 1, 2 } }, // ★ { new int[]{ 1, 2 }, new int[]{ 1, 2 } }, // ★ }; とすると、★の行を指して上記のエラーがでます。 intからint[]に型を変えただけだと思っているのですが、何が違うのでしょうか。
>>205 int[]の[,]なんだから逆
int[,][]
基本やり直し。 配列初期化子ってわかる?
>>207 お前は分かってるのかよ。わかってるなら書け。
>>179 いろんなプラットフォームありますよ。
x86, x64, IA-64
.NET Compact Framewrok
.NET Micro Framework
どれもWindows上というのはご愛敬w。
後は申し訳程度にSSCLIがFreeBSD対応だった気がする。
Linuxはmonoがあるしなぁ MSも支援してるし
質問した当人ですがあらゆるWindows上で使えたらなぁとか思ってました
フィールドって言葉がイマイチなじめない メンバ変数って言いたくなる
>>213 「あらゆるWindows」ってなにがあるの?
Windows1.0
ごめんなさい凡そ今いるWindowsユーザーです だから.NETなくて良いって条件さえあればVistaは知らないけどいけるかな
最後にとが抜けたorz
.net入れればいいじゃん。
今時.NETくらい誰でも入れてるだろ、とかいう認識の俺はだめなんだろうな
.NET程度が使えない環境は切り捨てられるべき
private void foo(string hoge, string piyo) { いろいろ処理 foo(fuga, hogehoge); } と private void foo(ref string hoge, ref string piyo) { string hoge0 = hoge; string piyo0 = piyo; いろいろ処理 foo(ref fuga, ref hogehoge); } どっちが良いんでしょうか? 渡す文字列は100文字程度で再帰による関数の呼び出しは100~5000回くらいです 後者が良い気がするのですが、文字列100文字程度なら前者のがいいのかなぁと考えてます
やっとまともな質問だなw 後者でいいよ、むしろなんで前者選ぼうと思ったの?
___ ━┓ / ―\ ┏┛ /ノ (●)\ ・ . | (●) ⌒)\ . | (__ノ ̄ | \ / \ _ノ /´ `\ | | | |
225 :
222 :2008/02/06(水) 01:28:48
5000plyも呼べたっけ?
227 :
222 :2008/02/06(水) 01:31:12
実際はあんな形ではないんですが、想定してるのは5000回くらいまでです
ああ末尾ね
229 :
222 :2008/02/06(水) 01:36:42
すみません、fugaとhogehogeはいろいろ処理、と書かれてる部分で引数を元に 値を設定されたstring型です
>>225 なんかやばいかどうかは使いどころ
たとえば,参照渡しだと副作用完了点が関数内部まで拡大する可能性がある.
2*n*val_func(n) ≠2*n*ref_func(n)
かもしれない
とりあえず自宅のC#3.0で下記を試したら,一つだけ結果違った static void Main(string[] args) { int n; n = 5; Console.WriteLine(2 * n * valfunc(n)); n = 5; Console.WriteLine(2 * n * reffunc(ref n)); n = 5; Console.WriteLine((2 * valfunc(n)) * n); n = 5; Console.WriteLine((2 * reffunc(ref n)) * n); Console.ReadLine(); } private static int valfunc(int n) { n = -n; return n; } private static int reffunc(ref int n) { n = -n; return n; } あと再帰に関してはrefもvalも計算コストはそんなに変わらないと思っている. とある言語の実装だと「refは,呼び出し元でコピーした変数を値渡しして,戻ってきたら本物に上書き」みたいなことやってたみたい.
232 :
222 :2008/02/06(水) 01:53:51
参照渡しじゃなくてポインタ使えればなぁ、と思うんだけどそうもいかないんですよね
>>230 それだと非常にやばいです、それとあまり差がないんですか、ありがとうございます
どの道わからなければ安全そうな値渡しにしようと思ってたのでこれでいってみます
ありがとうございました
C#ってオブジェクト渡しは全部参照渡しみたいなもんじゃないの?
参照型は参照渡し 値型は値渡し
FileInfoとか渡したらどうなるんだろうね
参照だろ
stringは参照渡しだからrefなんざつけんでいい stringの代入はコピーではなくポインタを代入してるだけ
>>232 stringを渡すときrefつけるのとつけないので結果が変わる場合があるのはわかってる?
>>234 参照型を値で渡すのと参照渡しは違うよ。
揚げ足取りじゃなくて全然違う。
なぜ説明を書かないのだろう。
揚げ足取りだから
MSDNでrefで検索して最初に出て来るページにすっかり書いてあるだろJK
メソッド内で生成された参照型のインスタンスへの参照を、呼び出し元で受け取るには、refなりoutなりを使って参照の参照を渡す必要がある。(returnは別として) 呼び出し元で作成したインスタンスを操作するなら、インスタンスの参照を渡せばいいから、refはいらない。 引数をメソッド内で変更したい場合、Stringみたいに操作する度に新しいインスタンスが生成されるタイプのクラスは前者。StringBuilderみたいに新たなインスタンスを生成せずに操作できるタイプのは後者。
読み返してみるとくどくて意味不明だな。すまん。 徹夜明けだからもう寝るわ。
using System; using System.Text; namespace ConsoleApplication1{ class Program { static void Main(string[] args) { StringBuilder strbld = new StringBuilder("Start"); EditValue(strbld); Console.WriteLine(strbld.ToString()); //出力:Start+Edit ChangeValue(ref strbld); Console.WriteLine(strbld.ToString()); //出力:Changed NotChangeValue(strbld); Console.WriteLine(strbld.ToString()); //出力:Changed Console.ReadKey(true); } static void EditValue(StringBuilder value) { value.Append("+Edit"); } static void ChangeValue(ref StringBuilder value) { value = new StringBuilder("Changed"); } static void NotChangeValue(StringBuilder value) { value = new StringBuilder("NotChanged"); } }} こういうことか。勉強になった。Thx
違うだろ
参照型の参照渡しはポインタtoポインタ(**object)だな まぁ,C風に覚えてもかまわないと思われ
>>246 どう違うの?
出力結果を見ると違わないんだけど。
アホにも分かるように教えてくれ。
ん?stringもref stringも 関数内で引数を書き換えなきゃ変わらんだろ
あーそうか、ChangeValueとかNotChangeValueとかいう関数名が分かってないようにとられた原因か。 ChangePtrとNotChangePtrに名前を変更して読んでちょうだい。 上記二つのメソッドは参照の参照を変更しようとしているから、 参照渡しをしないNotChangePtrの方は当然参照が変更されない EditValueというメソッドは、参照型を値渡しで受け取り、それのインスタンスメソッドによって インスタンス自身が変化する。 こういう認識でいいんだよね?
>>250 意味分からん。
コードで書くとどういうこと?
253 :
デフォルトの名無しさん :2008/02/06(水) 15:52:24
他Formから値を参照したいのだがわからないww 初心者過ぎて笑われそうだが… Form1,2で 1に設置しているRadiobuttonをCheckすることで 2に値の変化を与えたい。 わかりにくい説明ではあるが誰か教えてくださいな^ω^
>>249 コンパイルして走らせてみた?
出力結果は間違いないよ?
>>253 C#の基礎というかプログラミングの基礎のページ見て来い
>>250 static void Main( string[] args )
{
string str = "250 は";
Manuke( str );
Console.WriteLine( str );
Teinou( ref str );
Console.WriteLine( str );
Console.ReadKey();
}
static void Manuke( string s )
{
s = "間抜け";
}
static void Teinou( ref string s )
{
s = "低能";
}
259 :
坊 :2008/02/06(水) 16:03:50
ありがとっす^ω^
260 :
坊 :2008/02/06(水) 16:05:29
あっ
>>253 ですww
困ったらまたきますんでw
261 :
254 :2008/02/06(水) 16:05:47
>>258 禿同。
参照渡しと値渡しの違いって中級者でも分かってない人が多いって記事をどっかで見たことある。
263 :
262 :2008/02/06(水) 16:07:05
あ、値渡しはともかく参照渡しってCのアドレス(ポインタ)渡しと結局同じだと思ってたけど違うの?って意味な
>>258 だからそうやって引数を書き換えなきゃ同じだろ
>>264 彼らは参照渡しは知ってても使い方を知らないんだろう
>>258 が話の流れと日本語を読めないってことだけは分かった
で、話の大元の
>>222 に立ち返ったとして何を議論してたんだっけ?
>>222 は前者でいいってことじゃね
余計な副作用を与えないために
>>247 というか、むしろそのほうが分かりやすいような気が
「参照情報」なんて回りくどい言い方せずに、「アドレス」って言ったほうがイメージが伝わりやすいような
>>271 根本に返って冷静に考えてみ。
アドレスの方が本来間接的な表現な上に間違ってるでしょ。
参照をもし言い換えるのなら、俺なら「位置情報」と言うな。
いやそりゃアドレスじゃん、英語のアドレスが住所としか略されないとでも思ってるのか?
位置情報を英語に置き換えりゃアドレスになんだろ 機械翻訳で訳される2単語が実用される英語だとでも思ってんのかね
>>272 厳密な意味ではいろいろあるだろうけど、初心者にとっては直感的にはアドレスが一番しっくりくると思うが
最近はスレタイも読めないバカが増えたな
278 :
275 :2008/02/06(水) 18:44:59
×初心者 ○日本人の初心者 まぁ瑣末事だけどw
>>274 言葉にはそれぞれ意味上のふり幅ってものがあるんだよ。
特に英語のような多義的な言葉を文脈によって使い分ける傾向が高い言語ではね。
"address"は多義的過ぎる上に、コンピュータの世界では別の抽象レベルで
既に別の意味で使われているから望ましくない。
もっと意味のふり幅が少ない言い方を工夫すべき。
……ここまで補足しないとわからないかねえしかし。。
エイリアスでええやん
281 :
デフォルトの名無しさん :2008/02/06(水) 19:00:55
アプリケーション設定を暗号化して保存したいんですが、いまいち system.comnfigurationクラスの使い方がよくわかりません。 どっか良いサンプルないですか? MSDN読んでもいまいちよくわかりません。
暗号化は変なサンプルも多いから気をつけろよ
ポインタの参照渡し
最近のスレの内容・・・予想以上に.NET普及は早そうだな
>>281 BinaryFormatterとかでは駄目なの?
285 :
デフォルトの名無しさん :2008/02/06(水) 22:37:14
メソッドに渡す引数の属性で[in]や[out]があるんですが、 これはC#のrefやoutとは違うものなんでしょうか
そいつはマーシャラに対する指令
[Out]はoutと同じ。 refは[In][Out]相当。 [In]単独は、アンマネージとの相互運用で使うことがある。
C#の中だけで完結する限りは[in]や[out]は無意味
C/C++で作ったコードをC#で使えるようなラッパーを作りたいんですが 参考になるようなHPとか本あったら教えてください
俺も知りたい
C++/CLIでいいじゃないか。
>>289 本は知らんが、このあたりのキーワードでMSDNとか
探してみればなんかヒントあるんじゃね。
* COM Interop
* P/Invoke
* C++/CLI
VC#2008対応の解説本早く出せよ。
誰に言ってるのw 君統合失調の初期症状じゃないのマジで
確かにアンマネージドとの連携について詳しい本があったら欲しいな Win32API叩く度に検索して調べるの面倒になってきた
つMSDN
>>295 Win32API使うだけなら、P/Invoke.netとかでいいだろ。
>C#の中だけで完結する限りは[in]や[out]は無意味 そうでもない。
300 :
デフォルトの名無しさん :2008/02/06(水) 23:18:40
WebBrowserコントロールでブラウザ作ってるんですが、yahoo.co.jpを開いて閉じるとフリーズしてしまいます。 Googleとかだと大丈夫なのですが。 なんででしょうか? バグってるんでしょうか?
説明にもなってない それで解決できるはずも無い まあ確かにWebBrowserは色々胡散臭いが
あなたのコードがバグってるんでしょうね
WebBrowserはJavaScript周りがバグりまくっている。 JavaScript以外にもFlashを使っているサイトを表示した直後も半フリーズ状態になる。 で、結論は「使うな」。 IEコンポーネントで全て置き換えろ
304 :
デフォルトの名無しさん :2008/02/06(水) 23:46:28
新規プロジェクト作ってWebBrowser貼り付けて、下記の1行を追加しただけで終了時に固まる。
public Form1()
{
InitializeComponent();
webBrowser1.Url = new Uri("
http://www.yahoo.co.jp ");
}
で、原因はWebBrowserは開いたページの内容によっては内部で立ち上がった謎のスレッドが終わらなくなる
直る見込みはない
諦めろ
>直る見込みはない 何故ですかね?MSにやる気がないから?
306 :
デフォルトの名無しさん :2008/02/06(水) 23:55:02
308 :
デフォルトの名無しさん :2008/02/07(木) 00:29:46
>>304 VS2005
Win2003R2x64
固まる
309 :
デフォルトの名無しさん :2008/02/07(木) 00:34:05
>>304 固まるというか、ウィンドウは閉じてるのにVS2005がデバッグ実行中のままになった
>>304 XP
VS2008
.NET Framework3.5
固まらない
WebBrowser使ったこと無いからよく分からんが スレッドがバックグラウンドになってないんじゃないか?
WebBrowserと名前のつくコントロールは、 大昔のVBやDelphiからあったが、 どれもこれもまともに使える代物じゃなかったな。
313 :
307 :2008/02/07(木) 00:44:20
VS2005Pro XPx64SP2 IE:7.0.5730.11 Flash:9.0.115.0 プラットフォーム:x86 固まらない
コンストラクタ内で実行しなけりゃいいんじゃね?
>固まる環境の人 Navigateメソッドでもなる?
316 :
デフォルトの名無しさん :2008/02/07(木) 00:58:16
>>315 なった
コンソール用のテストコード書いてみたが、こちらも見事に固まる
ちなみに終了シグナルは飛んできて一見終わった様に見えるが、
残骸が残っていて悪さしているようだ
class test {
ManualResetEvent _mre = new ManualResetEvent(false);
public void run() {
Thread thread = null;
try {
_mre.Reset();
thread = new Thread(new ThreadStart(entry));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
} finally { _mre.WaitOne(); }
}
void entry() {
WebBrowser bra = new WebBrowser();
browser.Navigate("
http://www.yahoo.co.jp/ ");
while (_browser.ReadyState != WebBrowserReadyState.Complete) { // 省略 }
_mre.Reset();
}
}
318 :
デフォルトの名無しさん :2008/02/07(木) 01:29:08
>>318 は www.google.co.jp になっているから、www.yahoo.co.jp に変更して試して見るべし
321 :
デフォルトの名無しさん :2008/02/07(木) 01:43:14
>>320 Windows Server 2003R2 x64
IE 6.0.3790.1830 SP1
.NET3.0は入れてない
家のパソコンにIE6が入ってるから試そうと思ったけど繋がらないや 帰るか
323 :
デフォルトの名無しさん :2008/02/07(木) 02:15:42
324 :
デフォルトの名無しさん :2008/02/07(木) 08:25:57
>>284 binaryformatterは暗号化していないので解析しようと思えば
すぐできてしまうから、パスワードなんかは保存したくないわけです。
system.security.cryptographyのクラス群で暗号化してから保存すれば
同じことなんですが…。
アプリケーション設定が.net2.0以降すごく使いやすくなっているみたいなので、
そちらで暗号化できるならそっちを使いたいなあと思った次第です。
設定クラスの定義、設定ファイルの読み出し、保存を毎回毎回アプリ作るたびに
実装するのって、エラー処理なんかまで含めて考えると意外と面倒くさいもんで。。
325 :
デフォルトの名無しさん :2008/02/07(木) 12:58:22
またWebBrowser被害者か
326 :
デフォルトの名無しさん :2008/02/07(木) 14:16:27
loaderLock マネージ デバッグ アシスタント (MDA: Managed Debugging Assistant) は、Microsoft Windows オペレーティング システムのローダー ロックを保持するスレッドでマネージ コードを実行しようとする試みを 検出します。 このような実行は不正であり、デッドロックの発生につながり、DLL がオペレーティング システムのローダーに よって初期化される前に使用される可能性があります。
>>323 IEのアドイン全部停止して試してみるとかどう?
質問です。 インターネット上にあるpng形式のファイルを取得して保存したいと考えています。 そこで、 Stream objStream; objStream = wrGETURL.GetResponse().GetResponseStream(); StreamReader objReader = new StreamReader(objStream); string filepath; filepath = "C:\\hoge\\hoge.png"; if (File.Exists(filepath)) { File.Delete(filepath); } StreamWriter w = new StreamWriter(filepath); w.Write(objReader.ReadToEnd()); w.Close(); objStream.Close(); とやりましたが、保存できないようです。 StreamReaderのどのメソッドを使えば、インターネット上の画像ファイルの読み込みを一括でおこなえるのでしょうか?
どこでおかしくなってるのかちゃんと調べろよ。
StreamReader/StreamWriterはストリームを文字列で扱うクラス。 画像みたいなバイナリファイルに使っちゃ駄目。
File.Copy()でファイルをコピーする場合、 途中で止めるにはどうすればいいですか? プログラムを強制終了しても、止まらないようなのですが・・・
File.Copyだと止められないんじゃない SHFileOperation使えば
>>332 ダイアログがうざいから
SHFileOperation使いたくなくてFile.Copy()にしたんですが
やっぱり止める方法はないんですかね・・・
FileStreamでnバイトずつ読み込み→書き込み→停止信号監視
とやれば止められそうですが遅くなりそうで
334 :
デフォルトの名無しさん :2008/02/07(木) 16:19:46
>>331 Windows APIのCopyFileExだと
コールバック付きで途中中断もできる。
こっちはだめ?
>>335 ありがとうございます
そんなのがあるんですか
Win32APIだとVISTAへの対応が心配ですが試してみます
CopyFileExだとファイル単位でコールバックだね
>>337 >ファイル単位
そうですかぁ・・・
ファイルコピー/移動中にスキップしたりしたいので
>>333 の方法しかないですかね
オーバーヘッド食いそうだなぁ('A`)
339 :
337 :2008/02/07(木) 17:27:08
そして属性やNTFSサブストリームが消える罠
うん、338へのレスだったんだ
>>318 WebBrowserConstorlは基本的にメッセージポンプが必要。
だたメッセージポンプなしでも特定の条件が重なったときは動作する。
そのコードだと動くほうが例外的。
344 :
デフォルトの名無しさん :2008/02/07(木) 21:17:54
>>318 を下記のように修正
thread = new Thread(new ThreadStart(entry2));
void entry2(){
bool once = false;
EventHandler apidle = delegate(object sender, EventArgs e){
if (once) return; else once = true;
entry(); // 元のentry()をcall
Application.ExitThread();
};
Application.Idle += apidle;
Application.Run();
Application.Idle -= apidle;
}
>>324 クライアントにパスワード残して「解析しようと思えば」っておかしいだろ・・・
本気でやるなら認証鯖立てるしかないんじゃね?
347 :
デフォルトの名無しさん :2008/02/07(木) 22:20:22
>>343 ナイス!
ただ、
>>WebBrowserConstorl
これタイプミスしてなければ...
コメントにtodoとか入れておいたものがタスク一覧に現れるのは開いているファイルだけのようですが ソリューションかプロジェクトの全てのファイルを一括で確認する方法はありませんか?
スレッドモデル指定なしのCOMを使ってるのか COMのスレッドモデルは死ぬほどややこしいからな〜
ありません。
352 :
デフォルトの名無しさん :2008/02/08(金) 09:04:24
>>346 確かに暗号化してあってもクライアントにパスワードを残すのはよろしくないですが、
ログイン名だけは記憶できるようにしたいとか、接続先URLも攻撃を避けるために
隠蔽したいとか、どうしてもクライアントに暗号化して残したい情報はあると思ってます。
windows認証(DPAPI)で暗号化して, windowsのパスワードが安全なポリシーに従って
設定されていれば、それなりの安全性は保てると思うんですが、やっぱまずいっすかね。
誰から守りたいわけ?
普通の配列 int[] array から List<int> list に中身をコピーするメソッドって無いですか? foreach(int i in array){ list.Add(i); } ってしないと駄目ですか?
new List<int>(array); // たぶん中身は(ry
357 :
デフォルトの名無しさん :2008/02/08(金) 11:54:26
>>355 ,356
ありがとうございます。
10分も悩んでしまいました;;;
ToList()だとインスタンスが書き換わらない? AddRangeって手もあるよ
359 :
デフォルトの名無しさん :2008/02/08(金) 14:55:57
360 :
デフォルトの名無しさん :2008/02/08(金) 15:03:37
>>345 、
>>360 は
>>345 の指示で
>>318 を修正したもの
で、Windows XP Pro SP2だと普通に動いた。
が、Windows Server 2003 R2 x64、Windows XP x64だと動かない。
腐ってやがる・・・
早すぎたんだ
つまり
>>304 と
>>316 は別の問題だったわけか。
64bit環境はないからテストできんなぁ。
64bit環境で32bit指定したexeの場合はどうなの?
うちはXPx64だけど32bit指定でも64bit指定でも問題なかった
これ、どうなればいいの? TEST押したらdoneが出るだけ?
>>365 doneダイアログが出た後にフリーズしなければok
問題がある場合はdoneダイアログが出てスレッドは終了しているはずなのに直後にフリーズするはず
あと、俺の環境でも32bitだと問題なし
レスをざっと見た感じNT5.2x64以外は大丈夫なんじゃね? NT5.2x64なんて使ってる奴いるの?
なるほど、Vista64でAny x86 x64 すべて動作。 ってVS2008ですが。2005でやったほうがいいかな
いやー、訳分からんPG起動させるオマイラほんと関心するわww
>>369 訳分からんやつはそも参加しない話
そしてPGなんて略し方(笑)
すいません質問です。 PointFの引数になぜPointを代入できるのは仕様でしょうか?
修正してたら日本語がおかしくなってしまいました、すいません。
374 :
デフォルトの名無しさん :2008/02/08(金) 23:14:32
VC#2005で、プログラムを組んでいるのですが、 C言語で書いた関数(メソッド)を使いたいと思っています。 ですが、.Cファイルをコンパイル、リンクする方法がわかりません。 プロジェクトに.cファイルをぶち込むと、テキストファイル?として 認識され、うまくリンクされていません。 VC++だと.Cファイルも使えたのですが、C#ではできないのでしょうか? .Cファイルをincludeする方法がありましたら、教えてください。 スレ違いでしたら誘導お願いします。
VC#では_
まずCOMとIDLを用意してください
>>372 暗黙の型変換が出来るように演算子がオーバーロードされている。
public static implicit operator PointF(Point p)
>>374 VC++でC向けのDLLとしてコンパイルしてC#からDllImport
またはC++/CLI
Cのソースがそのまま使えるかもなんて発想はどこから来るんだ
そんなに量が多くないんだったら手書きでC#に移植したら
>>370 ほぼOKじゃね
メッセージキューに割り込むってか
WndProcを直接呼ぶ
>>377 式で検索したら出てきました、ありがとうございました。
ということは内部で構造体を作り直してるのでやりすぎると遅くなりますね。
383 :
374 :2008/02/09(土) 01:33:43
レスくれた方、ありがとうございます。 簡単には、C#でCのファイルは使えないんですね。 DllImportでの使用か、C#で書き直すか(限りなく大量ですが。) 検討してみます。 VC++でプログラム組んだほうが早い気もするし、困ったもんです。 ありがとうございました。
C++/CLIおすすめ DLLコピーし忘れ事故を一番防止できると思う プロジェクトに加えておけば勝手にコピーしてくれるし
>>383 普通にDLL作ってC#から読ませるだけやがね
386 :
370 :2008/02/09(土) 03:35:09
>>381 "直接呼ぶ"というのはどういう意味ですか?
WndProcは「.NETの外から来るWindowsメッセージを.NETのイベントに置き換えるメソッド」なので
Updateメソッド→Windowsメッセージ(WM_PAINT?)→WndProcメソッド→Paintイベント
という流れなんでしょうか?
あと、Paintイベントを発行するOnPaintメソッドがありますが、これは上記には絡まないんですか??
Paintイベントが発行されるまでの流れが分からなくて混乱しています。。(まだこの辺理解するには早いのかも
質問ばかりですみません。
>>386 何が流れているの?
データ?処理?他?
public class A { 何か処理 class AData { } } みたいに、自クラス内のみ、もしくはそのファイル内でのみ使えて、 外部からは見えないクラスを使いたいのですが、 アクセスレベルはどのように書けば良いのでしょうか。
private。 ちなみに、A、ADataとも、互いのprivateフィールドやメソッドにアクセス可。 ソースファイル単位のアクセスレベルはない。
public class A { private void hoge() { AData data = new AData(); data.ANum = 1; } private class AData { private int ANum; private AData(){} } } のように書いてみたんですが、 AData data = new AData(); data.ANum = 1; この部分で両方ともアクセスできない保護レベルになってると怒られるんですが…。
>>390 AData は Aから見て別クラスなんだから、メンバまで private にしたら当然見えない。
ADataはAのprivateクラスだから、Aの外からは見えないがADataそのものはAからは
見える。
ので、ANumをAから見たければ、こうする。
public class A {
private void hoge() {
AData data = new AData();
data.ANum = 1;
}
private class AData {
public ANum;
public AData(){}
}
}
>>386 WndProcとPaintイベントの間にOnPaintが挟まる。
メッセージキューは、位置としてはWndProcより前にあるのだが、
(Updateのように)これを介さずWndProcへ送られる場合もあって、
それを381は直接呼ぶと表現しているんだろう。
>>391 それをやると、アクセシビリティに一貫性がありません、ADataのアクセシビリティは
フィールド○○よりも低く設定されています。
と怒られてしまいます。
>>393 今適当にやったけど、普通にできるぞ。本当にそのエラーなのか?
public class A { public AData data;//ここでエラー private void hoge() { data = new AData(); data.ANum = 1; } private class AData { public int ANum; public AData(){} } } たぶんこうなってると推測 クラス外から見えない型のオブジェクトを公開しても外から触れないだろ
オブジェクト思考じゃないかもしれないですけど、階層型の構造になったプログラムで、兄弟(同階層)のオブジェクトの状態を知りたいときはどうするべきでしょうか? 親から回すしかないですかね?
子に親への参照を持たせるかな
漠然としすぎててワカンネ 兄弟だろうと姉妹だろうと参照もてばいいんじゃねーの
オブジェクト思考がなんだか解らないから、 参照持たせた所で、それは「オブジェクト思考」じゃ無いって叩かれるのを避けたかったんじゃない? オブジェクト思考がなんだか解らないの、声だけ大きいキチガイが身近に居るとか。
Parent プロパティ でMSDN引いてみれば
>>352 もう少し隠蔽すべきデータかどうか考えてみたら?
他の鯖認証してるツールのアクセスログとか見てみな。
オブジェクト思考ではなくオブジェクト指向な。
>>390 これじゃだめなん?
private class AData {
private int aNum;
protected internal int ANum { get { return aNum; } set { aNum = value; } }
protected internal AData() { }
}
}
本末転倒だな
つーかC#の話題じゃなくてオブジェクト指向スレ行けよ
なんで馬鹿ってのはすぐに「〜スレ行けよ」って言いたがるんだろうねw
そりゃ自分に理解できないことは全部すれちがい
何で直線バカって目先のことしか考えられないんだ どうでもいい話は直ぐ飛びつくしキモいんだよな
412 :
370 :2008/02/09(土) 16:30:52
>>392 >WndProcとPaintイベントの間にOnPaintが挟まる。
Paintイベントは直接的にはOnPaintによって発行される、ということでしょうか
ということはもしかして「イベントHogeは常にOnHogeメソッドによって発行される」のですか?
もしそうならスッキリしますね。
そうすると、例えばpictureBoxインスタンスのPaintイベント処理は、
「pictureBox_Paintイベントハンドラを設定」と「overrideしたOnHogeの作成」
のどちらでも機能的に同じことができる、ということでしょうか?
(そういえば誰かが「同じことをするにも何通りものアプローチがあるから、1つに拘るな」と言ってたのを見た記憶が)
>>387 他のウィンドウに隠れて無効化されたコントロールを再描画する、という単純なものです。。。
こんばんは C#でメモリ確保の方法ってありますか? 指定したメモリ数を確保するツールを作りたいのです。 教えてください。
確保してどうしようってんだ
それで思い出したけどスタックアロケートみたいのあったよね、あれってなんだったんだか
クラスのフィールドを取得するとき、フィールドをpublicにするかプロパティを用意するかは、どうやって決めたらいいんですか? チェックなどを設けずに単にset{ this.hoge=hoge; } get{ return hoge; }とするのでも、プロパティ使う意味あるんでしょうか?
>>413 一昔前にあったメモリを強制的に確保して開放するメモリ掃除ツールの模倣?
Console.ReadLine();
byte[] buffer = new byte[1024 * 1024 * 256];
buffer[1234567] = 5; //最適化防止用
Console.ReadLine()を抜けるとタスクマネージャにおけるPF使用量が増える。
ただNT系でメモリ掃除効果があるかは知らん。用途勘違いしてたら無視してくれ。
>>419 > 構造体なコレクション
これ,できるのか・・・継承とか委譲とかはクラスにしかできないとおもてた
>>419 フィールドやセッターならエラー吐いてくれるからまだいいけど、
破壊的なメソッド呼び出しはエラーにならずに
コピーに対して無意味な操作をしてしまうって方が厄介なんだよね。
これのせいで値型のメソッドはimmutableであるべきだとか
そもそもフィールド操作と区別がつかないプロパティのシンタクスが
問題なんだとか主張もあったりなかったり。
あと値型でジェネリック系のコレクションを使う場合は IEquatable<T>.Equals(T o)やIComparable<T>.CompareTo(T o)を 実装しないとパフォーマンスが非常に悪いことになる。
初心者は構造体を使うな。
>>415 unsafe { byte* buf = stackalloc byte[10]; }
構造体なんて自作するもんじゃないやね
426 :
sage :2008/02/10(日) 13:11:27
データグリッドに以下の様な利用期間を表示しています 表示しているデータは、DBに対してSELECT文で SELECT data1,"〜",data2...で取得しています(data1,2はstring型 "〜"は表示上仕方なく) 開始日付 終了日付 20000101 〜 20000131 20010101 〜 20010131 20020101 〜 20020131 20030101 〜 20030131 20040101 〜 20040131 必要だと思うことが以下の3項目です 1、更新ボタンを押された際に開始、終了のどちらかがNULL場合はエラー 2、入力された値が日付で無い場合はエラー 3、開始日付<終了日付で無い場合はエラー 処理としては更新ボタンが押された際"DBのデータを削除後、画面情報をDBにINSERT"しようと考えています。 その際に"昇順、かつ終了日付<次の行の開始日付の様にZの様な並び"にソートする方法を調べていますが今一よく分かりません。 多次元配列で[0,2]と[1,0]を比較して逆なら行を入れ替えて・・・の様な作りになるのでしょうか・・・。 IComparableとArrayListを調べてるのですが基礎が無さ過ぎる為にかなりパニクってます; C#が初めての言語で経験2週間の度素人です・・・よければ教えてください。 開発環境はVisualStudio2003になります。
>>426 20020101 〜 20040131
20030101 〜 20030131
20020201 〜 20030115
こういうケースはどう並ぶの?
>>426 「表示」だけじゃ無いんだよな?日付入力して更新ということであれば
1.チェックの1〜3でOKならTMPテーブルに書き込む
2.TMPに書き込めたらcommitして元データ削除
3.TMPから元テーブルにコピー
4.元テーブルからSQLで読み込み(ここでソート)
どうしても配列でソートなら「配列、ソート」でぐぐるか本嫁、基本だから
排他が気になるけど全デリート全インサートなん?
429 :
419 :2008/02/10(日) 14:01:16
レスありがとうございます。せいぜい気をつけるしかないってことですね。 そういえば、C#のjavaより良い点の一つが、値渡しができる構造体って教わりましたよ。 なんとか使いこなせるよう頑張ろう。
構造体を使うときに気をつけないといけないのはボクシング こんなこというと,そんなもん大したコストじゃないだろとか言われそうだから先に言っとくけど, 構造体はそんなもんが問題になるような状況で使うもの
読解力がないだけ
>>430 なんか言ってること変じゃないか?w
よくわかってないのなら無理しない方がいいと思うよ
438 :
430 :2008/02/10(日) 14:19:21
構造体はそんなもんが→構造体はその程度のコストが これでいいか?
よくないでしょw ボクシングは構造体にまつわる問題だ、と自分で言ってるのに、 どうして「ボクシングが問題になるような状況で」構造体を使うんだよw
そうじゃなくて構造体の一番の意義は、 たとえば配列の要素にアクセスするような場面における参照型のオーバーヘッドを 回避することでしょ。
>>439 GC負荷を減らしたいときに構造体が活用できることがある。
でも構造体を使うときはボクシングに気をつけないとかえってGC負荷を増やしてしまう。
だからGC負荷を減らしたいときは、ボクシングに気をつけながら構造体の活用を考えよう。
というような話を
>>430 はしたいのだろう。
構造体でボクシング利用するような事例ってどんなのだ?
ボクシングってなーに?
>>430 はボクシングしないように構造体を使わないと早くならんぞといっているだけだろ
俺はほぼ全てのケースで構造体使っても早くならんと思ってるけどな
構造体のアップキャスト
>>442 例えば構造体のToStringをオーバーライドしてないとき。
public struct Hoge
{
public int Fuga;
}
Hoge hoge = new Hoge();
string str = hoge.ToString(); // ←ここでボクシングがおきる
他にもIEquatable<T>を実装させずにDictionaryのキーにしたときとかボクシング起きまくり
>>444 構造体は速くするためというよりは遅くならないための仕組みな気がするね。
>>446 >他にもIEquatable<T>を実装させずにDictionaryのキーにしたときとかボクシング起きまくり
GetHashCodeのオーバーライドも忘れずに。
>>446 みたいなのって単なる設計のミスだと思うんだけど。
static string ToString(ValueType this);//ValueTypeは参照型 こんなメソッドを呼び出してることに相当するわけだから
>>448 >>449 C#コンパイラが出力したIL見てみれば分かるけど
.NET 2.0以降ではconstrainedプレフィックスが使えるようになったので
ValueType.ToStringの呼び出しそのもののボクシングは回避できるようになった。
その意味では設計で対処されてる。
ただ、ValueType.ToStringが中でbase.GetType().ToString()を呼んでいるので
そこでボクシングとかGCヒープアロケーションは起きる可能性が高い。
GetTypeって実際は何をやってるんだろうなあ
試してみたけどGetTypeにもToStringにもヒープアロケーションはあるみたいだね static void Main(string[] args) { for (int i = 0; i < 10000000; ++i) { Type t = i.GetType(); } Console.WriteLine(GC.CollectionCount(0)); Console.WriteLine(GC.CollectionCount(1)); Console.WriteLine(GC.CollectionCount(2)); } 458 2 1 GetType→ToString 1206 2 1 ToStringはstringを作るわけだから当たり前だけど
ToStringは使用頻度が低いから特に問題にはならないと思うが、 ハッシュや比較はコレクションで大量に使うからきちんと実装しといたほうがいい。 IEquatable<T>やIComparable<T>などを実装しないならジェネリックでないコレクションを使ったほうが、 ボクシングの回数は少なくて済むから逆にパフォーマンスもいいんだよね。
今さらながら プログラミング.NET Framework第2版 を買いました。 もう4月までずっと春休みなので 休み中に読破しようかな〜
大学生は暇でいいですなー
あの本は勉強になるな
>>454 この業界来ないように他業種の勉強しておいた方がいいと思うよ
コレクションで使う場合はハッシュと比較が影響を与えやすい。 ほかに、領域確保の効率が悪くなることで参照型より負荷が高くなることもある。
459 :
デフォルトの名無しさん :2008/02/10(日) 19:28:52
第3版はいつ出るんだろ?
まああれだ、不幸な奴ってのは不幸な理由を自分の置かれた環境に求めたがる、 という例の恥ずかしい法則でしょ たとえば職業とかさw お前が不幸なのはそれはお前だからだ、というのが真実なのにねw
タブページをSelectedIndexの変更で切り替えると、切り替え先のチェックボックスが何故か押されてしまいます。(しかも2番目) クリックで切り替えたときは何も起こらないのですが、何か原因があるのでしょうか?
自己解決しました
質問はするが、解決結果をフィードバックする気はないと
なんかのイベントでChecked = true;って自分で書いたんだろ
とあるネイティブWin32アプリの拡張dllをC#で書くことって可能ですか? つまりC#(.NET)でアンマネージなDLLの開発が出来るかということだと思うんですが・・。 因みにWin32アプリの方をCOM対応にするとかはなしで。
C#でアンマネージドなDLLは作れないけど、CLRの機能としてマネージド関数をアンマネージドの世界に公開することは出来る。 ただ、多くの場合まともに動かないから、素直にC++/CLIでラッパDLLを書いたほうがいい。 ここで気をつけなければならないのが、一つのプロセスには一つのCLRしかロードできないということ。 つまり、そのプロセスに別のバージョンのCLRを使うモジュールがロードされていると正常に動かない可能性がある。
やっぱり難しいですか。 C++はかなり苦手なんだけど、ラッパDLLがいいんなんですね。 念のため調べたいので、どっかにCLRでマネージドを公開するいい例が無いでしょうか・・?
ラッパより糖衣だろう
ILかw これはひどい
>>471 逆PInvokeはさすがに知らんかった。
どの言語から使いたいのかわからないけどCOMが一番取り回しが楽だよ。
登録の問題はSxSで回避できるし。
474 :
467 :2008/02/11(月) 13:51:19
もう圧倒的にCOMがいいのは重々承知なんですが、 OpenSource系のWin32だし苦手なC++なので手が入れられないんですよね。 逆アセンブリ?もちょっと・・
じゃあやっぱりC++/CLI
476 :
467 :2008/02/11(月) 14:03:55
ですよねー。それがいいみたいですね。 よく分かってないので、C++/CLIでのラッパーの作り方とか調べてみます。
そこらへんくわしい書籍ないかな? あんまり見かけない気がする てかC++/CLI関係の本がないか。。。
装飾付きRTFファイルに装飾付きRTFデータを追記する方法で困っています 装飾部分が毎回同じ(黄色のハイライトのみ)なので単純合体の方法で 現存のRTFファイルをテキスト読込し最後の2行の終了部を削る 追加するRTFデータをRTFファイル出力してからテキスト読込して 最初の2行の装飾部を削ってテキストを合体させテキスト出力する そのくらいしか思いつきません 他によい方法はありますでしょうか?
フォームにリッチテキストボックスを2つ置いて、起動時に引数でファイル読込して 片方に追加させファイルに書込んで終了する単独ソフトを作った方がいいのかなあ
Qtで作成させたウィンドウのイベントをフックするプログラムを作りたいのですが、 スパイ++で覗いたところ、QWidgetというクラスで、キャプションはlbOKというオブジェクトです このlbOKをクリックするイベントを送りたいのですがどうしたらいいでしょうか? ウィンドウハンドルやウィンドウProcなども分かっています よろしくお願いいたします
実際にクリックしてみてどんなメッセージが飛んでるか、 Spy++で調べて、SendMessageで再現すればいいよ。
>>480 SendMessage, BM_CLICK
>>481 >>482 なるほど参考になりました
SendMessageですね!!
さっそくSpy++で調べてやってみます!!
484 :
デフォルトの名無しさん :2008/02/11(月) 21:28:58
Vistaの「Task Dialog」で
OPENFILENAME構造体のFlugsにEnableTemplateHandle、またはEnableHookを選択するとXP以前の外観に戻ってしまうんです。
ダイアログボックスをカスタマイズするには、ウィンドウメッセージをフックする必要があるので、EnableHookを必ず選択しないといけなく新しい外観のままカスタマイズすることはできないのです
C++では使えないようなんですが
ttp://msdn2.microsoft.com/ja-jp/library/43xtah3y.aspx C#ではどうなんでしょう
おねがいします。
ものすごい初心的な質問だと思うんですが ボタンだけを配置したフォームでキーイベントを受け取りたいのですが どうすれば良いのか教えてください
結局はゆうが細かったということで
ContextMenuStripでShow()した時に、 ContextMenuStripが閉じるまでShow()から制御が戻らないようにしたいんだけど、 どうすればよい? TrackPopupMenu()みたく、メニュー側でモーダルループ持たせたいんだけど。。。
HttpWebRequestを用いて通信したとき、 200successや404notfoundなどの コードはどのように取得したらいいのでしょうか? よろしくお願いいたします。
490 :
デフォルトの名無しさん :2008/02/12(火) 09:00:56
>>488 HttpWebResponse.StatusCodeとHttpWebResponse.StatusDescriptionに
はいってんじゃね?
404だと例外放るからWebExceptionキャッチして、webException.Response
をHttpWebResponseにキャストして、同様にStatusCodeなんかを見る。
>>489 >>490 ありがとうございます
HttpWebResponseにキャストしなくちゃいけなかったんですね
大変助かりました
492 :
デフォルトの名無しさん :2008/02/12(火) 15:07:00
PDFファイルの中の文字を検索とかってできるんかね?
ネットの海からライブラリを探すしかない
仕様は公開されてるから自分でできるよ
PDFってバイナリでしょ? 画像も入るからむずかしくね?
そういやGoogleボットはPDF内もクロールしてるな できるんじゃね PDFのgrep作ったら俺にもちょうだい
>>495 バイナリエディタで見ればわかるが、少なくとも文字はただのテキスト。
498 :
デフォルトの名無しさん :2008/02/12(火) 17:27:13
UserControlでスムーズスクロールを実装するにはどうやればいいのでしょうか?
499 :
デフォルトの名無しさん :2008/02/12(火) 18:06:14
ああ、つまりアレか PDFファイルを開いて文字列だけ正規表現か何かで抜き出せばいいのか
画像と画像じゃない部分は区別しなくていいの?w ダメだろそんなルーズな方法
pdfのライブラリでテキストだけ抜き出せるべ
バイナリから文字列っぽい部分拾ってくるだけなら、ただのstringツールだ
PDF -> テキスト ならTeXについてくるツールでいいんじゃね
携帯から失礼します GameState = Title; switch (GameState) { case Title: 処理 if("Aを押したら") { GameState = Main; } break; case Main: 処理 break; } こんな感じのプログラムを打っているのですが、実行結果が少しおかしいのです。 タイトル画面からAを押したらメイン画面に移行します。しかし、メイン画面での処理が始まりません。 試しにGameStateにMainを入れて始めたら、メイン画面の処理が行われました。 ちなみに、タイトル画面にメイン画面の処理を全て入れてタイトル画面→メイン画面と移行させたらメイン画面の処理が行われました。 しかし、タイトル画面ではタイトルの処理だけ、メイン画面ではメインの処理だけさせたいのでこれでは意味がないのです。 説明下手で申し訳ないです。何か分かりましたら教えて頂けないでしょうか?
>>504 breakしてんだから始まるわけないじゃん
処理のフローをちゃんと見直せ
アフォすぎてワラタ
PDFのフォーマットは失禁するほど複雑だし(1300ページ超)、文字列も何種類かあるし、 自前で解析なんてやってられない
なんでPDFなんてできたんだ
お答えありがとうございます。アホな質問に答えて頂き感謝します。 しかし、break文を消した所、 コントロールはひとつのcaseラベル(case 0)から別のラベルへ流れ落ちることはできません。 と、エラーが出ました。恐らく case Title 処理 case Main と書いてあるためだと思われますが、これだ ここまで書いて思ったのですが、なんか質問する以前の問題のような気がしました。もっと勉強し直して来ます……すいませんでした
>>509 だからフローを見直せって
switchの使い方がおかしいんだろ
>>510 はい、もう一度見直します。もっとじっくり考えます。今日はこれが出来るまで寝ないつもりで頑張ります。
C#以前に構造化プログラムを理解してないんだろ 初心者はif while以外使うな これだけでプログラム書ける
今時構造化プログラミングが何かすらソフトウェア工学で教えなかったりするらしいな
それってまずいだろw 構造化プログラムが書けなきゃOOPなんて絶対むりやん
そもそもソフトウェア工学学んだりしてるやつがほとんど居ないだろ 独学も含めてな
なんとか無事に出来ましたので報告します。やはりswitch文の使い方に問題がありました。 今思うとなんでこんなことを、と恥ずかしさで死にそうです。しかし、今回の経験を通してswitch文だけではなく、enum型、メソッドの使い方を学びました。 こんだけ必死になったのも、自分の醜態を晒したからだと思いますw これからも日々精進で頑張ります。 長々となりましたが、自分のしたいことが出来ましたので報告とさせて頂きました。色々とお見苦しい所があったかと思います。失礼しました。
うん、良い子だ
俺ん時はソフトウェア工学教える授業でちゃんとあったんだよな んで、人伝に聞いただけなんだけどJava使っていきなりOOPだとか って考え直したらソフトウェア工学自体やってねえだけか
三十郎か
522 :
484 :2008/02/13(水) 12:38:08
その後いろいろ調べてみたところ、Vistaで利用できる新しいファイルダイアログボックスをカスタマイズするには、
COMベースのAPIを利用する必要があるということがわかりました
C++での利用例を参考に(この時点では表示できている)、C++のヘッダーファイルを読み、C#で実装しました
そして、コンパイルし動かしてみると、メモリアクセス違反が発生し、ダイアログが表示されません
どうしてなんでしょうか?
ソースコードは
http://www.uploda.org/uporg1248711.zip.html 開発環境はVS2005Pro
最新のMicrosoft Windows SDK for Windows Vistaが必要だと思います。
もちろん、Vistaでのみの動作です。
お願いします
523 :
484 :2008/02/13(水) 12:44:54
>>513 順次構造・繰り返し構造・分岐構造やフローチャート程度のものなら高校でやるよ。
工業系でない一般高校でも。
>>524 まじ?一体いつから・・・
俺ん時はなかったな
くだ質でスンマセンですが List<hoge>fuga1と List<hoge>fuga2が 含まれるリストが同じか否かを知るには、どうやればいいですか?
>>526 Enumerable.SequenceEqual
528 :
526 :2008/02/13(水) 16:51:15
>>527 C#3.0まだ勉強してないです・・・
とりあえずカッコ悪いけどforeachで回します
カウンタ使わないと無理じゃないの? それならforのほうが
えっ?
^^;
>>526 まずは要素数を比較
一致するならリストをソートして先頭から順に一致するか検査
>>532 ソートしたらO(n logn)になっちゃうやん
順序も含めて「同じ」かもしれないだろ
順序無視ならHashSet<T>が使えるな
使ったこと無いけど、Dictionaryのキーだけバージョンか
うるせー ソートして何が悪い 俺はソートが好きなんだよ
HashSetは集合演算用だろ よくしらんけど
集合演算したいだけならふつうのSetがあるだろ
fuga1.TrueForAll(fuga2.Contains) みたいなことやるよりはマシか
そーっとしとこう
マジレスしてい〜い?
547 :
526 :2008/02/13(水) 23:00:19
スンマセン自分のせいでスレのふいんきが 結局どんなのが良いんですかね? ソートしちゃうのが一番単純ですが、ソートに使えそうなフィールドがない場合や IComparable付けてない場合だと駄目ですよね?? fuga1.TrueForAll(fuga2.Contains)はいいかなと思ったんですが、駄目なんですか?
つかそもそもソートしていいの?
重複はあるの?
>>547 問題を具体的に示しなよ。
正解教えてあげるからさ。
>>546 * *
* + いいよん
n ∧_∧ n
+ (ヨ(* ´∀`)E)
Y Y *
最近のC#erってのはアルゴリズムもわかっとらんのか
いやここ初心者スレだし
つまり回答者のお前らも初心者だったのか
悔しさが滲み出る良レス
>>547 それじゃ一方が他方の部分集合であることしか分からんじゃん。
それに、O(n^2)
ソートした後の結果が同じかどうか知りたいのであれば 最初からListを使うべきではないんだと思うな SortedListあるいはDictionaryあたりを使うべきなんじゃないかね
(・∀・)ニヤニヤ
560 :
526 :2008/02/13(水) 23:53:15
>>548 >つかそもそもソートしていいの?
「いい」というのは、「並びが変わってしまっていい」という意味ですか?
対象のリストは大丈夫です。必要ならソート用Listをコピーして用意すればいいと思いますが
>>549 ないです。ある場合はまた面倒なんでしょうかね・・・?
>>557 重複がないので↓で大丈夫だと思うのですが?(というか大丈夫でした)
bool b;
if(fuga1.Contains==fuga2.Contains) { b = fuga1.TrueForAll(fuga2.Contains); }
>>552 さんのいうとおりアルゴリズムの基本もちゃんと分かってない阿呆なので、この辺で失礼します。
ありがとうございました。
ソートなんかしたらO(n logn)で無駄だろ 普通に要素比較しろ
何なのこの流れ
要素数はいくつなんだ? 100とかじゃないよな?
質問者も逃げ出したのか
568 :
526 :2008/02/14(木) 00:11:20
スンマセン、
>>560 はfuga1.Contains==fuga2.Containsはミスです。
ふと思ったんですが、Listをコピーしておいて(←参照型だから軽いですよね)、
ContainsがtrueだったらRemoveしておけば多少早くなりませんか?
bool b = true;
if (fuga1.Count == fuga2.Count)
{
foreach (hoge f in fuga1)
{
if (fuga2.Contains(f))
{
fuga2.Remove(f);
}
else
{
b = false;
break;
}
}
}
else
{
b = false;
}
重複の場合はどうしょ・・・・
569 :
526 :2008/02/14(木) 00:12:19
しまったスペースが お見苦しくてスマンセン
>>568 二つのリストに同じ要素が入っているとしても順番までも同じとは限らないの?
571 :
526 :2008/02/14(木) 00:25:17
>>570 順番は違います(とくに規則性はないです)
順番が一意に決まってるのならもっと早い方法があるってことですか?
うん
ハッシュテーブルに突っ込めばいいじゃん。
574 :
デフォルトの名無しさん :2008/02/14(木) 00:38:43
wpfでfarameを使ってwebページにnavigateした後にそのページのDOMを取得するには どうしたらいいんでしょう。windows.formsのwebbrowserでdocumentを取るみたいに したいんですが。
>>574 WPFって何なのですか?
新規作成のメニューにあって気になってたんですが・・・・
WPF は流石にぐぐったらいくらでも情報出てくる。
概要さらっとぐらい教えてくれたっていいのに・・・ まあいいか、自分で調べるわ
どう考えても調べたほうが速いし正確
WPF 結構色々できますね、XMLのドキュメントはバイナリー化されているんだ、なるほど。 やっていたらもう四時になっしまった、寝なきゃ・・・
regsvr32使って登録したアンマネージドなDLLは, そのまま[DllImport]で呼べると思ってたんだけど DLLが見つかりませんって実行エラーがでる... これってどうやればいいんですか? DLLはいろんなファイルや他のDLL参照してるから 今のフォルダ構成から動かせられないって制限付きなんですが...
てs
regsvr32ならCOM呼び出しになる 参照設定で追加
C#を使い、.net無し環境で動くまともなプログラムは作れますか?
なにをしてまともと言うのか
えっと、HelloWorldくらいなら出来る、とかそういうレベルではなく 普通に配布されているようなユーティリティのようなものを作れるのかなと WinAPIを直接触ってしまったらしまったでC#でやる意味もない気もしますし 自分でもうまくまとまらないですすみません
Linuxへの移植も可能っぽいし(framework部は動かないが)、やろうと思えばできるんじゃない つかC#から.net切ったら何も残らないと思うのだが
なるほど・・・C/C++をやってきての段階なので、ちょっと概要を調べつくしつつ 使い分けできるようにしていきたいと思ってます、ありがとう
むり
いや無理じゃないぜ C#単体では動かないが
むりなものはむり
Windows限定なら.NETFrameworkなし環境用のexeを作るツールがある でも借りたPCで.NETインスコ不可等の事情がない限り、そのまま配布してほしいな よく考えてみたらスレ違いな気がする…
ngenは意味ないしなぁ ネイティブコンパイラなんてあったっけ
gugurekasu
>>597 念のために言っておくと .NET Framework の存在は仮定してない。
# C# が必要とする BCL は Micro Framework に比べてもはるかに小さいし、アセンブリやリフレクションの概念さえない。
ただし、RTTI や GC を含む基本的な言語システムはどうしても必要になってくるけど。
599 :
デフォルトの名無しさん :2008/02/14(木) 10:23:30
TextBoxでマルチラインを有効にした状態で行間設定はできないのでしょうか? 行間がビチビチで読みにくいのですが。
>>597 monoって今ぶっちゃけどうなんすか?
専用スレが寂れまくってますが。
601 :
581 :2008/02/14(木) 10:51:26
>584 参照設定でDLLを追加してみましたが,同じ結果でエラーが出ました 追加情報: System.Web.Services.Protocols.SoapException: サーバーは要求を処理できませんでした。 ---> System.DllNotFoundException: DLL '***.dll' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E) Webサービスで参照させているのが影響してたりしますでしょうか...? (テスト環境はローカル) 参照の追加ダイアログで確認する限り,DLLへのパスはあっています
ソケットでサーバーで接続元のIPアドレスとポート番号を取得するにはどうすればいい?
Socket クラス使ってんなら RemoteEndPoint があるだろ
604 :
デフォルトの名無しさん :2008/02/14(木) 13:56:30
torrentだから例え踏んでもその先に行けないだろう、キミは
C#伸びていくのかねぇ
なんだかんだある程度広がるのは確実だろうなぁ VSのC#への偏向具合もあるし、MSは.NETひいてはC#を当分主軸として動きそうだし
なんだかんだだよななんだかんだ なんだかんだWindowsシェア広いし 俺としてはASPが強力だと思えるからWindowsサーバがどれくらい増えるか気になる
vista以降は.NET標準で入ってるから、windowsが廃れない限り確実に伸びるんじゃないですかね?
windowsサーバをまともに構築する苦労というかは結構でかい気がするな というのも初心者がWindowsサーバ構築して公開して悲惨なことになっているのを見てだけど
そんなんOS問わずだと思うが
そうかねぇ、初心者が構築したってんだからそうでもないだろ linuxなんて最初からセキュリティ割とがちがちだし
初心者のLinuxサーバ構築よりマシかと、動いたところでいっぱいいっぱいで もう触らないとか、目も当てられない状況になる事多々ありなんですが 素敵な踏み台サーバーは勘弁、某大学とかとかwww
WindowsServerがセキュリティは上だよ。
初心者linuxサーバはインスコから合わせて解説通りやる ポート開放やデフォのセキュリティからちょこっと解放したり Windowsは普通にデフォのWin環境で鯖構築するから目も当てられない これくらいは常識以下 某大学は偶然狙われただけだろう、狙われればどこも同じなんて状況だよ そんな悲惨なのが溢れてる まあそういうとこは大学のページほどアクセスやらされ辛いわけだがな
WinXPやなんかで公開するのか? そりゃ見事にアウトゾーンだがまあ初心者ならやるか・・
えー、めんどくさくなって全部ONにしてtelnetポート開けっぴろげだぜベィベー とかよ
想像だけで語るスレはここですか?
WindowsServerは、馬鹿が使っても大丈夫なようになっているから、 生半可な知識でLinux鯖立てる人より安全。 なぜなら、彼らはOSのバージョンアップのやり方を知らないから。makeも知らない。 だから、人件費が削減できて、結果的に(フリーのLinuxより)Windowsを買った方が安くつく。 だから売れる。商売が成り立つ。もちろん知識のある人の多い会社はわざわざOSを買ったりしないが。 WinならWindowsUpdate一発だから。GUIだから馬鹿でもやれる。 大学のサーバは本当にひどい。 VineLinux3.2(M大、N大)とか、PHP3系(S大、W大)とか、普通に使っているし。 証明書なしで学外からパスワードを入力させる。うちの大学のことだが。 でもさすがにWinXPで鯖立てる大学は知らない。犯罪だしな。
犯罪にはならないよ
XPで鯖立てたら犯罪って。中途半端な知識だなぁ。
ヒント:同時接続数
wwwwwwwwwwwwwwww
大学は本当にヤバイですよ このスレで質問してるような自分が相当できる人だと思われてる・・・
で、C#の質問はまだ?
×大学は本当にヤバイですよ ○私の大学は本当にヤバイですよ
>>627 俺の大学、高木先生に「この大学に入学するな」リストに入ってるwww
どこ?
スラドで話題になってた奴か
やべ、俺の大学もリストアップされてるwww
どこ?
法政
636 :
デフォルトの名無しさん :2008/02/14(木) 20:59:55
wpfで作られるWindow1クラスのクラス名とかWindow1.xamlのファイル名とか リファクタリングしてもxamlの方が更新されなくて、いちいち手動で直さないと いけないのがすごく面倒くさいんですが、なんか良い方法ってあるんでしょうか? それとも、Window1でそのまま使った方が良いのかな…。なんか気分が悪い。
637 :
デフォルトの名無しさん :2008/02/14(木) 21:04:32
デフォルト設定ならWindows Serverの方が圧倒的に堅い。 素人が余計な事をしなければ、ある程度のセキュリティを確保できる。 が、ガチガチのセキュリティを確保しようとすると、やれレジストリだ何だと鬼のように難しい。 そしてちょっと凝った事をしようとすると「動かん」「バグですか」となる。 一方、デフォルトのLinuxはオープン。来る者拒まずな感じ。 そのかわりガチガチにするのは楽。 素人が訳も解らずにネット上の「入門」とか言ってるサイトに転がってる設定ファイルをコピペ するだけでも、それなりになる。 そして自分が何をやったのか、訳も解ってないのに偉そうになる。
>>637 それはもう常識でしょう、語らなくてもいいです、スレ違い(笑
なんでサーバの話してんの?
少しくらいログ読めば?
UIのコンテナ関係の質問です。 元のコンテナをDisableにすると中のコントロールも灰色になってしまうのですが、 これを自前でドローする以外で回避するにはどうしたらいいでしょうか?
自前ドローだけで回避できるのか? WS_DISABLEDが伝播してきてるんじゃないのかね
>>641 見たこと無いな、そんな機能
色は変えなくてもDisable?
それでなけれぱ、一旦コンテナから離して、優先順位を上にしてしまうのが楽チンそうな気がする。
ちょっと教えて下さい。 HttpRequest/HttpResponceを使ってWebサーバと通信して居ます。 WebサーバからCookieが送られて来るのですが、JavaScript中に埋め 込まれて送られてきます。 HttpResponceで受け取ったデータの中を舐めても良いのですが、もっ とスマートにCookieを取り出したいのですが、何か良い方法は無いで しょうか? ちなみに、IEがDocument Setting\ユーザ名\Cookieに保存するCookie ファイルを直接読み出す方法を考えて見たんですが、ログインユーザ を意識しないでやる方法を探して居ます。 何か良い方法は無いものでしょうか?
646 :
デフォルトの名無しさん :2008/02/15(金) 11:18:22
DateTime型のToString()メソッドで、XML SchemaのdateTime型(CCYY-MM-DDTHH:MM:SSZ)形式を 一発で出す方法は無いでしょうか? DateTime dt = DateTime.Now(); dt.ToString("s"); でCCYY-MM-DDTHH:MM:SSまでは出る事がわかったのですが。 (タイムゾーンが出ないです) TimeSpanを使って長ったらしい内容にしないと無理でしょうか? 後々、バグの原因になりそうなので簡潔に書いておきたいのですが。
dt.ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss':'zzz"); とか?
つーかDateTime構造体にタイムゾーン情報って含まれてたっけ? 単なるlong値じゃねーの
UTCかGMTかの区別は入ってるよ。 あとは実行した環境のタイムゾーン見ればよし。
UTCかローカルタイムか、ね
651 :
デフォルトの名無しさん :2008/02/15(金) 12:48:47
>>647 XMLスキーマのdateTimeってGMT+タイムゾーンだからそれじゃダメじゃね?
>>648 .NET2.0から仕様が変わってタイムゾーンを保持するようになった
>>644 HttpWebRequest/HttpWebResponseではJavaScriptが動作しないので、
埋め込まれていたら無理。
IEで利用しているCookieを取得するには、InternetGetCookie。
'Z'
DateTimeはカスタムクラスを作っておいて必ずそれを呼ぶ様にした方がいい。 特にDBとか使ってるときにDB側の日付型の違いで地獄に堕ちるのを防いでくれる。
>DB側の日付型の違い これって結構あるものなんですか?標準と微妙に違ってたり、とか?
657 :
デフォルトの名無しさん :2008/02/15(金) 14:36:05
フォームの質問です。 メインウィンドウからダイアログ1を開く→OK押す(ダイアログ1消える)→ダイアログ2が起動 (重い処理なのでプログレスバー表示)→完了(ダイアログ2消える)→メインウィンドウに戻る をしたいのですが、1を消すタイミングでclose()、dispose()してるにも関わらず ダイアログ2が終わるまで1のダイアログが残ってしまいます。(1の上に2が重なってるイメージ) どうやれば、1のダイアログをすぐに消すことが出来るんでしょうか。
親ウィンドウをdisposeって普通しないんじゃ? 最小化すればいいんでないの
>>656 selectした際に特に変換せずに抜き出すと、各社ばらばら。
あと内部保持形式がUTCだったり設定依存だったりと。
俺は日付に関する値でも迷わずvarcharにしている。
で、どうしてもという時は、where句で必要に応じてvarchar -> dateとかキャストして使うようにしている。
>>659 すごいですね・・・DBやったことないんで知りませんでした
地獄には堕ちたくないですよねやっぱ
重い処理とやらをUIスレッドでやってるだけじゃね?
SQL92準拠にしとけばいい
>>657 ダイアログ2を開く処理はどこに書いてる?
ダイアログ1のOKボタンのハンドラに書いてないか?
665 :
デフォルトの名無しさん :2008/02/15(金) 15:22:06
666 :
657 :2008/02/15(金) 16:28:57
>664 処理の流れは、 1.メインウィンドウ ダイアログ1を開く処理(xxx.ShowDialog()) 2.ダイアログ1 処理 (DialogResult.OKを返す) 3.メインウィンドウ DialogResult.OKを受け取った後、ダイアログ1を閉じる処理 (close()、dispose()) 4.メインウィンドウ ダイアログ2を開く処理(yyy.ShowDialog()) 5.ダイアログ2 処理 (処理後にclose()、dispose()) 5でダイアログ2が消えると同時に3のclose()が働いてるようです。 因みに3の直後でmessagebox.show()でメッセージを表示すればダイアログ1は消えます。
再描画
DateTimeにnullが代入できないのはどうにかならんのだろうか nullに相当する時間をきめてやるとか、処理がめんどい
Nullable<DateTime>
DateTime.MinValueでいいんじゃね
Nullableと?って何が違うの?
同じ。
673 :
デフォルトの名無しさん :2008/02/15(金) 19:42:34
DateTimeをクラス化すればいい
>>669 ジェネリックかじってたけどこれは知らんかった
>>670 それも考えたけどフレムワクのバージョンとか
環境の違いで値が変わる可能性がないとは言い切れない
とか妄想したんで使ってない
>>673 その考えはなかった
676 :
644 :2008/02/15(金) 23:42:22
>>645 ,652
回答ありがとうございます。早速試して見ます。
>>677 T?に対応するのはNullable<T>構造体だよ。
だからどっちも値型。
679 :
デフォルトの名無しさん :2008/02/16(土) 00:58:29
monoからDateTime.cs引っ張ってきてクラス化してみようと思ったが面倒なんで途中でやめた
世界がお前の偉業を待ち望んでる 最後までやれ
>>678 なるほどなー
Nullableって使いやすくて大好きさ
2つのIEnumeratorを並行して列挙したいんだけど 自分で列挙子を直接操作する以外の方法ある?
685 :
682 :2008/02/16(土) 13:19:55
>>684 うん
.NET3.5も含めて,標準の方法はないということでいいのかな
>>685 であれば残念ながら標準では無いですな。
必要なら作るしかない。
ちなみにMicrosoft Parallel Extensions to .NET Framework 3.5の中にも
internalメソッドでZipWithが入ってる。
標準で入れてくれてばいいのに。
Haskell を馬鹿にするわけじゃないけど、 zip with って名前が何だかださくない?
WriteLineみたいな英単語の先頭ごとに大文字にするクラス名・メソッド名の記法はなんていうの? ハンガリアン記法で調べてかかったページを見ても書いてないんだけど。
>名前付けのガイドライン
違わないか?w
"名前付けのガイドライン"でググってMSDNで確認した、後に >690のリンクに飛んだら、吹いた。 MSとWikiPediaならどっちもどっちだけど、 書いてる奴マジやる気ないんだな。
「Pascal 形式」じゃねーの? 少なくともハンガリアン記法は関係ない
ハンガリアンはMS自らによって完全否定されました
なにそれ気持ち悪い
ハンガリアンは誤解された形で広まってしまっただけで、 元々の考えは別に悪い物ではない。
699 :
デフォルトの名無しさん :2008/02/17(日) 05:08:52
独自の設定ファイルを簡単に読み書きできるクラスってないでしょうか。 また設定ファイルの一部はデータグリッドに表示して編集もしたいです。
独自のファイルを操作するクラスは独自に作るんじゃないのか?
List<Hoge> listの中身をランダムにソートしたいです。 list.Sort( delegate( Hoge a, Hoge b ) { return rand.Next( -1, 2 ); } ); のように、ランダムに-1〜1が返るようにして実装したつもりなのですが、動かすと Array.Sort が x. CompareTo(x) を呼び出したときに、IComparer または依存する IComparable メソッドは 0 を返しませんでした。 という例外が発生します。 どこが悪いのでしょうか?
比較関数は推移性とかを満たしていることが前提だからな
>>699 DataSetとか。
でも、保存するのが単純な値などかによっても善し悪しあるから、
素直に2.0以降は独自クラス作ってシリアライズのが楽。
>>701 エラーは、自分自身との比較は0を返せって意味だけど、
そもそもソートの比較関数は、例えばA<BでB<Cのとき、A<Cでなければならかなかったはず。
答えがランダムじゃだめだと思う。
一旦別のリストにコピーしてから、
そのリストの添え字をRandom.Nextで生成してAddしていけば?
>>701 ランダム並べ替えが目的なら、昔からある定番アルゴリズムを使えばよし。
Sortメソッドは、一定のルールに基づいて並べ替えを行うメソッドなので、ランダム並べ替えに使うのは良くない。コードを読む人が混乱する。
static void Shuffle<T>(ref IList<T> list)
{
Random r = new Random();
for (int i = 1; i < list.Count; i++)
{
int j = r.Next(list.Count);
T tmp = list[ i ];
list[ i ] = list[ j ];
list[ j ] = tmp;
}
}
>>701 「i番目の要素をi以上配列の長さ未満のランダムな要素と交換する」をすべてのiについて行えばシャッフルできるはず。
ところで、
Enumの名前とプロパティの名前をできるだけ同じにしたいときがあるんですがどうしてます?
↓こういう場合です。
class MyIO
{
enum MyIOMode
{
Syncronized,
Asyncronized
}
public MyIOMode MyIOMode { get; set; }
MyIO()
{
MyIOMode = MyIOMode.Asyncronized;
}
}
System.IO.FileModeみたいに複数のクラスで使われるならenumを名前空間に直接書いてもいいんですが、
そのクラスでしか使わないとなるとクラスの中に書きたいと思うのです。
708 :
705 :2008/02/17(日) 11:48:40
すまん。refは不要というか不可だ。
>>705 for (int i = 1 だとまずくね?
Count=1 や 2 なら問題ないけど Count=3 だと
リスト先頭だった要素は Shffule 後にも先頭にいる確率が 4/9 になる
>>706 MSのガイドラインによると,ネストした型を外に見せるのは推奨されない
外に書いていい
>>710 そんなガイドラインあったっけ?
っていうか.NETのライブラリだって普通にネストした型を公開してるよね。
たとえばListViewItemCollectionなんてそのはずだけど
713 :
712 :2008/02/17(日) 13:00:34
親とデザイン的に強く結び付いてるときは(親のprivateメンバにアクセスするとか) 稀に入れ子の型にすることもあるってことかな 単に親でしか使われないからというだけではなく
というより当該のガイドラインそのものが合理的根拠がない「俺様ルール」か、 それが言いすぎならせいぜい「村の掟」に過ぎないってことじゃないの?
それを言うなら名前付けの規則とか 名前空間をあんまり深くしすぎるなとかだって同じだろ 単にMSの好みだから従わなくていいと言ってしまえばそれまで
変なプログラムの例ならCプログラミング診断室を読むといいよ
Cプログラミング診断室で昔何度か探し回ったものの書籍紹介しかなくて泣いたのはいい思い出 ちょっと下にスクロールするだけだったと思わなかったのは俺だけかなぁ
君だけだろwwwww
俺だけか…てかあそこ読む意味をあんま理解してない辺りまだまだですね、すみません
>>717 え?ちょw今知ったwww本借りてきたのにwwwww
定数文字列を格納する一番(?)スマートな手段というのはどんなものなのでしょうか? 現状 struct hoge{ const string piyo = "abcde"; const string fuga = "abcde"; const string hogehoge = "abcde"; const string piyopiyo = "abcde"; const string fugafuga = "abcde"; : } といった具合にだーっと書いています、文字列定数の数は50個程度、文字列長は10~300文字程度です 調べれば定数と言えばconstと出てくるのでこれで通していたのですが もっと良い手段があるのではないかと思い質問しました。 それではよろしくお願いします
>>721 リソースとして埋め込むかテキストファイルにでも書いておいたらいいんでない?
>>721 .NET Frameworkの中では
SR.GetString("キー文字列")
みたいにしてるよ
そういう風にしとくと後で実装変えられて便利
Icon ico = Properties.Resources.IconFile1; 以上の部分で、以下のようなエラーが出ます エラー CS0103: 名前 'Properties' は現在のコンテキスト内に存在しません。 以前までは正常に動いていたためどこかを変えてしまったせいかとも考えたのですが エラー文から見るにPropertiesが無いといっているように思えます しかし、ソリューションエクスプローラから見るとProperties/Resources/IconFile1はしっかり存在します こういった場合はどういう間違い・おかしな部分が考えられるのでしょうか?
>>724 開発しているのにまずエラーコードやエラーメッセージでググらずに2chに書き込んでる部分かな
>>725 なにを根拠に言っているか笑えてきますが既に検索済みです。
ああゆう断定形はネタだよ、ガチで言っちゃってるやつはすぐふぁびょるから見もの
バルーンを手動で表示させると、最初だけふきだしの先っぽが違う方向に出るのは何故なんだぜ? ツールチップに関するコードは↓のみなんだけど、回避する方法は無いものか… toolTip1.Active = false; if( textBox1.Text.Length > 5 ){ toolTip1.Active = true; toolTip1.Show( "hoge", textBox1 ) }
ツンデレ
ArrayListで2つのコレクションがあるんだけど、どちらもPointerなのね この2つのコレクションに含まれてる要素で、重複するものだけを取り出したいんだけど、どうやればいいんでしょ? たとえば、 1つめのコレクションhoge1には、{P1, P2, P3, P6, P7, P8 } 2つめのhoge2には{P2, P7} とあるとき、P2とP7だけ取り出したいんです foreach( Point p in hoge2) { if( hoge1.Contain(p)) { point.add(p) } } とやったら、if分のところで、比較ができないというエラーが出マスタ 今回、ジェネリックは使わないので、ArrayListでお願いしますm(__)m
日本語でおkっていうか。 Pointer って何? そういうクラスってことでいいの? だとしたらポインタとごっちゃになるろくでもない名前だけど。 比較ができないってエラーメッセージはググった限り .NET のエラーメッセージには存在しないようだけど?
>>731 スマソ Point型と間違えたわ
2つのコレクションは、どちらもPoint型変数が入ってるのよ
733 :
730 :2008/02/18(月) 14:10:04
もっと調べたら、ObjectとPointが比較できないとか、明示的なキャストが必要です、とか出てきマスタ。
.NET Framework 2.0かそれ以下かでArrayList.Containsの挙動が違うらしいが。 1.xならContains使わずにループでunboxingして比較するしかないんじゃない?
ArrayList はジェネリックじゃないから、Contain() の引数は Object 型でないとダメだぞ。 Add() する時にもちゃんと Point から Object にキャストしてるんでしょ?
どうもありがとう
>>734 ソースコードはC#1.0のときに書かれたものですが、.今はNET2.0で使ってます
>>735 Add()するときはObjectにして加えてます。
なるほどそうか。
Contein()の引数を、Point型のままにしてますた。
Object型にキャストしてから引数に使えばいいんだ・・・。
やってみます。
どうもありがとうございます。
しかし、受け継いだソースがC#1.0向けに書かれたソースなので、
ArrayListを全部ジェネリックに書き換えるのが手間だと思っていたけど、
結局書き換えた方が後々楽な気がしてきた・・・orz
>>736 アップキャストしてどうすんだよ
ポリモルフィズムを理解してないんじゃねーの?
ぽまいら、変数とかの命名でプレフィックスとかつけてまつか?
必死になっていい単語思いつかないときに時々使う
どっちでもいいけどクラス外から見えるメンバにプレフィックス付けたら死刑
クラス外から見えるメンバって静的メンバ定数のことか? それ以外にまさかないよね?
アクセス制御とstaticかどうかは関係ないだろ publicフィールドはゆるさーんて言いたいだけ?
public フィールドなんてキチガイしか書かんだろ。 構造体ならともかく。
メンバって言ってるんだからC#の世界ならパブリックメソッドとプロパティとイベントでしょ。 個人的にはいまだに型名にプリフィクスつけるよ。 少数派なのは認識してるが、やっぱり構造体、クラス、列挙体がぱっと見ただけで 区別つく方が好都合な場面が多い。 特にクラスのつもりで構造体扱っちゃうような「致命的な凡ミス」を防げる蓋然性があがるし。
オレはC#の場合はプロトタイプや使い捨てのプログラムでは書く 命名規則はプロパティと同様にしておいて、 class Hoge{ public int Foo; } 必要になったら class Hoge{ private int foo; public int Foo{ get{return foo;} set{foo=value;} } } あまりオススメはしない
プレフィックスつけるってそもそも設計ミスじゃない? つーかVBer以外で使う人いるの? 結構人見てきたけどVBerだけだったよ。
まあ関連するプロジェクトが全て自分の管理下にあるならリネームなんて一発だしな。 リフレクションで型名とかメソッド名が文字列に埋め込まれてると痛いが。
>>736 私は、キャストが手間という理由でジェネリック使いまくり。
違う型のリストが複数あるとき、インテリセンスで要素の型が判別できるのが特に嬉しい。
>>737 ArrayList はポリもーフィズムとアップ・ダウンキャストを前提に使うものなのでは。
初心者用スレだし、一応ツッコミ。
メソッドやプロパティのほとんどを日本語にしているから プレフィックスがないと入力が不便。
プレフィックスが教えてくれるのは変数の型だけだぜ!! って誰かが言ってたな。
前に見た糞プロジェクトで、フィールドに普通に名前つけて プロパティ名が全部p_なんちゃらとかなってて思わずワロタよ
.NET Frameworkのクラスライブラリのソースコードのメンバ変数はプリフィックスだらけ
754 :
デフォルトの名無しさん :2008/02/18(月) 23:55:21
>>753 privateなフィールドなら好きにすればいいが、public メンバにやったら殺す
756 :
デフォルトの名無しさん :2008/02/19(火) 00:16:12
>>744 publicなフィールドってやっぱだめ?
set getでフィールド渡すだけだと、いちいちプロパティの宣言するのが面倒くさくて
ついついやっちまうんだけど。
C#3.0の自動プロパティで駆逐されると信じたい public int MyProperty { get; set } これだけ
758 :
デフォルトの名無しさん :2008/02/19(火) 00:20:31
重い処理を行うプログラムがあり、BackgroundWorkerを使ってるんですが、 画面への出力にはDoWorkからフォーム操作を行おうとすると「あるスレッドで作成された コントロールに対して、別のスレッドのコントロールを親にすることはできません。」と出ます。 それは分かるんですが、フォームへの描画自体に時間がかかる場合、その処理自体を バックグラウンドで行うにはどうやれば良いのでしょうか。
バッファに書き込んどけ
760 :
758 :2008/02/19(火) 00:43:11
説明が抜けてましたが、実際は子ウィンドウから処理を実行し、親ウィンドウに 複数のウィンドウ(タブ)を追加するといった処理をしたいです。(タブを追加する処理が重い) バッファに書き込む方法はSetStyle()だと思うんですが、どうも親ウィンドウのフォームでは SetStyle()が指定できないようでした。。
Bitmapに描いとくってことだろ
プレフィックスつけてるひと、けっこういるのね 型名とかコントール名とか、どうやって省略したらいいか困るときがある int int_x=0; string str_name = "taro"; textbox tbx_input = new textbox(); みたいな感じで頭に三文字略称をつけろとかいう つまんないローカルルールが社内で流行ってて しかも人によって略称が違うときがあって逆に混乱するという ちゃんと取り決めしてないのにプレフィックスつけろって… プレフィックス一覧とかあると助かるんだけど、いいのが ない
ないと思うけどlong int_x = 0;
var int_x = 0;
コントロールはわからないでもないけど その他の型名を付けることに関しては全く無意味だと思う
VS2005でSocket通信を行っているのですが、LANケーブルを抜かれた等の経路切断の検出方法に困っています。
調べたところ、TCP KeepAliveを使えば出来そうな気配なのですが、C#用の資料が全然見つかりません。
資料もしくはサンプルのポインタを教えてください。
私が調べたかぎりでは
ttp://vsug.jp/tabid/63/forumid/45/threadid/8051/scope/posts/Default.aspx がかなり近いケースで、ほぼ要求事項は同じです。(違いは私はクライアント側になります)
たしかにこのSetSocketOptionを設定しても、検出はできませんでした。
// KeepAliveの設定
_tcpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 30000);
レス3番目の方法はどこにどう実装していいものやらわからず、またどうやって検出するのかもわからない状況です。
必要あればサンプルも貼ります。
>>766 TCPに任せちゃうんじゃなくて,自分でソケットをラップした通信ライブラリを作ってそこでACKみたいなのをやりとりすれば
直ぐ確認できるはず
>>757 それをプロパティにするとなんかメリットあるの?
いつもpublicフィールドにしちゃうけど
>>762 型名っていうかクラスと構造体とenum(とそれぞれのインスタンス)を
区別するためだけ、なんだけどね
要はクラスならcを頭につけるとかそういうやつ
描画をバックグラウンドって、 描画からみの処理自体を細切れにしてやるしかないな。
>>771 あーやっぱめんどくさいからpublicフィールドで十分かな(´・ω・`)
propコードスニペット使えよ
774 :
デフォルトの名無しさん :2008/02/19(火) 11:14:22
プロパティーを使っておくと、リフレクションを使ったライブラリやコードを組むときに便利だよ C#3.0から導入される匿名型は自動的にプロパティーとして実装される事もあるし、とりあえず以下の例を見てもらえれば解る。 Button と DataGridView コントロールをフォームに置く。 以下のコードを実行する、C#は日本語でもコードできるのでそのままいけます、DataGridViewのタイトルに注目、プロパティーの名前がそのまま出る。 class 行の定義 { public int 行番号 { get; set; } public string 内容 { get; set; } } ボタンのイベントに対して 行の定義[] データテーブル = new 行の定義[] { new 行の定義() { 行番号 = 1 , 内容 = "ABC" } , new 行の定義() { 行番号 = 2 , 内容 = "DEF" } , new 行の定義() { 行番号 = 3 , 内容 = "GHI" } , }; dataGridView1.DataSource = データテーブル;
>>774 それぐらいだともはやこれでいい気がするけどな。
dataGridView1.DataSource = new []
{
new { 行番号 = 1 , 内容 = "ABC" } ,
new { 行番号 = 2 , 内容 = "DEF" } ,
new { 行番号 = 3 , 内容 = "GHI" } ,
};
2008は、発売されてまだ日が経っていないので、まだ知らない人いるかなと思ってそう書いたんですが・・・ とふと気付くとプロパティーを省略形にしていたorz C#3.0では、get; set; と書くと、自動的に中身が作られます。
ああ駄目だ、配列の初期化までC#3.0になっているorz もう戻れないな……
778 :
766 :2008/02/19(火) 11:54:56
>>767 御返事ありがとうございます。
> TCPに任せちゃうんじゃなくて,自分でソケットをラップした通信ライブラリを作ってそこでACKみたいなのをやりとりすれば
> 直ぐ確認できるはず
自分でそこまでできるスキルがありませんorz サンプルがあれば頑張って追いかけてみるんですが素で書くのは無理そうです。。。
サーバ側が自分でいじれればアプリ側でチェックかけるのですが、サーバ側は担当外なので変更不可です。。。
780 :
766 :2008/02/19(火) 13:38:53
>>779 ヒントありがとうございます。レジストリいじるですか。。。ちょっと気が引けますけど試してみます。
781 :
デフォルトの名無しさん :2008/02/19(火) 15:11:44
>>776 おおお、そうなのか!
2008のpropスニペットで{get;set;}としか入らないから
なんじゃこりゃ…と思っていたところ。
VS2005(C#2.0)です。 インスタンスを文字列で生成するには Activator.CreateInstance(Type.GetType("クラス名")); で生成するのは判ったんですが、"クラス名"が存在しているかどうか(生成可能かどうか)を 事前に判断するにはどうしたらいいでしょうか? データを読んでいって、専用の派生クラスがあればそれで、 無ければ汎用の基底クラスで生成しようと思ってるんです。 ご教示よろしくお願いします。
783 :
782 :2008/02/19(火) 15:37:05
あ、GetTypeしたときにnullかどうか、 もしくはCreateInstanceして例外をキャッチすればいいのか。
>>746 よくPGの人は、HogeとかHogehogeとかFooとかって書いてるけど、なんでへんてこりんな単語を使うの?
ホゲ、ホゲホゲ、ホゲ、フーーー!とかってカタカナで書くと、ぬこが喧嘩してるのかと思う
>>760 最初からタブを用意しておいてHideにしておき、必要が出たらVisibleにするのはどうなの?
すいません質問です。 列挙型の変数でToString使用しようとすると、『使用しないでください』、といったポップアップの説明が出ます。 代替としてSystem.Enum.Parseを使えと言ってますが、 現在の値の文字列を取得したいので、GetNameのような気がしますがどうでしょうか?
すいません、質問です。 複数条件を確認する場合のif文の書き方について教えてください。 こんな感じで書きたいのですが、C#の場合はエラーとなってしまいます。 C#ではどのように書いたらよいのでしょうか。 if((a=="")or(b="")){ }else{ } いくつか検索をしてみたのですが、かっこのなかの条件が一つの場合の 例しかヒットしませんでしたのでここで質問をしてみました。 どうぞよろしくお願いします。
791 :
デフォルトの名無しさん :2008/02/19(火) 18:27:11
2008ってVistaから搭載されてるガジェット作れるようになった?
>>790 日産フーガって・・・メタ構文変数だったのか
794 :
デフォルトの名無しさん :2008/02/19(火) 21:27:36
質問です。DBにA列とB列があり A B ---------- 1 日本 1 東京 1 大阪 2 アメリカ 2 ニューヨーク 3 中国 3 北京 のような形で格納されています。 これをGridに表示させる際に 1 日本 東京 大阪 2 アメリカ ニューヨーク 3 中国 北京 といった形で出力したいのですが、どのようにコードを組んだらいいのか 悩んでおります。 何か良い方法などありますでしょうか?
while(Aカラムが存在するまで): Aカラムに該当するレコードを配列に格納 while(配列が存在するまで): 配列からBカラムを抽出 end end
>>794 こんな感じ?
var table = new[]{
new { A = 1, B = "日本" }, new { A = 1, B = "東京" },
new { A = 1, B = "大阪" }, new { A = 2, B = "アメリカ" },
new { A = 2, B = "ニューヨーク" }, new { A = 3, B = "中国" },
new { A = 3, B = "北京" } };
var q = from x in table group x.B by x.A;
foreach (var x in q)
{
Console.Write(x.Key);
foreach (var y in x) Console.Write("\t{0}", y);
Console.Write("\n");
}
データの持ち方を間違ってる。 テーブル構造を見直すか、アプリ側で処理する。
テーブル構造を指摘する人って・・・
RDBの場合レコードの並びは保証されてないから国名をどうやって判定するのよ 前ブランクのあるなしかい?
国コード 国名 地域名 1 日本 東京 普通こんな感じにしないか
まあ、それ言い出したら
>>800 のテーブルも正規化されてないでしょ。
そこはスルーでいいんじゃないかと。
>>800 気持ちはわかるが、国コードと国名が冗長な気がする
つか日本なら普通、国コードは81だろ
+81
42にすれば全て解決
むしろカラム一枚で 81<>jp<>tokyo みたいにすれば最強。 で、レコード一枚でケツに繋げていくの。
.NET Frameworkのバージョンが異なるアセンブリ間で StringやImage等のオブジェクトをやりとりするのは問題ないのでしょうか?
意味ワカンネ
具体的にどういう状態?
810 :
807 :2008/02/20(水) 15:05:03
// .NET Framework2.0で作ったアプリ System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom(他の人が.NET Framework3.5で作ったDLL); Hoge hoge = (Hoge)asm.CreateInstance(DLLが公開しているクラス名); string str = hoge.Name; Image img = hoge.GetImage(); と、違うバージョンで作られたStringやImageを使っても大丈夫なのかなと。
そもそも同一プロセスに異なるバージョンのCLRはロードできないんじゃなかったっけ。 リモート使った場合は余計にシラネ。
2.0-3.5はCLRが同じバージョンだから問題ないはず。 2.0/3.0にSP1を当てておけばより確実だと思う。
>>797-802 分類基準は一番最初の数値じゃないのかな?
昔のコボラーさんたちが良く使うで、国番号でソートしておいて、国番号が変わったところで切り出すという常套手段。
C#でやるなら 796 だね、これなら番号がソートできないデータ型でもいける、データ構造を変えるなら二重テーブル、XMLを取り扱う気分で。
C#2.0での質問ですが、 ジェネリックのコレクションにadd()メソッドで加えたデータを、データグリッドに表示させる方法を教えてください
>>813 そういうレベルの話じゃなくてRDBの行に順序なんてない(ORDER BY
でも同順位内は不定)ので「初めに返ってくる」とか「一番上」とかは
不定。意味ないから同じ順で返ってくること多いが毎回ランダムで返って
来ても正しい動作。
つーわけで質問のテーブルだと格納する情報が足りないので不可能が
答えになってしまい
>>797 みたいな答えしかできないと
>>814 追加するデータのメンバーはフィールド?、それともプロパティー?
表示されるのはパブリックなプロパティーのみだよ 774 を参考にしてみて。
それでも解らなかったら詳細をどうぞ。
>>815 回答する側で勝手に必要条件やしてませんか?
……わかんないけど
>>810 なんかこわいっすね、一旦シリアライザでシリアライズしてから渡したほうが無難そうな予感がする。
バイナリフォーマッタ辺りでやれば大きくパフォーマンスも落ちないだろうし、自分ならそっち方面を狙いたいですね。
もし使うなら、こいつです
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
>>817 怖いって……
実行エンジンのバージョンとコンパイルされたアセンブリのバージョンと
ごっちゃにするなよ
つーかBinayFormatterこそめちゃくちゃバージョン依存だろう
xmlの方がまし
じゃあbyte[]やchar[]に変換したら
821 :
814 :2008/02/21(木) 01:40:00
>>816 C#2.0で、クラスを
class 行の定義
{
int _行番号
string _内容
public int 行番号
{
get{ return _行番号;}
set{ _行番号 = value;}
}
public string 内容
{
get{ return _内容;}
set{ _内容 = value; }
}
とした場合、C#2.0で、行の定義クラスを配列として使う方法が分かりません。
この方法(クラスのインスタンスを配列として使う方法と、その場合の初期化)を教えてください
行の定義[] データテーブル = new 行の定義[]();
としてもエラーが出てしまうし、
行の定義[] データテーブル = new 行の定義();
としてもエラーが出てしまいます
>>821 横やりだけど、()がいらない
行の定義[] データテーブル = new 行の定義[];
初期化をいれるなら
行の定義[] データテーブル = new 行の定義[]
{
new 行の定義( 初期化内容 ) ,
new 行の定義( 初期化内容 ) ,
...
};
"new 行の定義"でコンストラクタでメンバを初期化する機能は2.0には無いので、引数付きコンストラクタを作っておく必要がある。
行の定義[] データテーブル = new 行の定義[要素数];
話を通じさせる為にも3.0に移行がお勧めだな、VS2008はなぜかVS2005より軽量と出来が良いので買い替え時としては悪くないし
でもお客に.Net3.5Frameworkを入れさせないといけないでしょ。OSも未だにXP止まりだし。 2.0でさえやっと普及した段階なのに、作りやすいからという理由だけで3.5を入れさせるわけにもいかず・・・。
見積もり作り直してみたら? その分時間かかるけどな!!
>>825 じゃあしょうがないね。
ちなみにXPでも動く .Net3.5Framework はウインドウズアップデートでどうぞ。
客にやらせてもこの程度なら差し支えないかと、面倒ならインストーラーにぶち込んでもいいと思うけど。
これもClickOnceを使っているなら、意識する必要ないかもね。
インストーラーは開発前に吟味しておくとこういう時にいい結果を生むので手抜きはしないように。
>>825 C# 3.0/.NET Framework 3.0/3.5を使うかどうかは別として、
VS 2008は.NET Framework 2.0用のアプリケーションも書ける。
829 :
デフォルトの名無しさん :2008/02/21(木) 16:25:33
Form1の上にForm2を表示しようとしています。 private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { form2.Show(this); } とすれば、一応表示されるのですが タスクバーにForm2のアイコンが表示されるのです。 アイコン表示しなくするにはどうすればいいのでしょうか?
Form のメンバ一覧をじっくり眺めてみるんだ
>>830 ShowIconってあるじゃないっすか
ありがとうございます
>>821 配列版は出ているので、ジェネリックのコレクション版で System.Collections.Generic.List 版でも作っておきます。
class 行の定義 {
int f1;
string f2;
public int 行番号 { get { return f1; } set { f1 = value; } }
public string 内容 { get { return f2; } set { f2 = value; } }
public 行の定義(int a1, string a2) { 行番号 = a1; 内容 = a2; }
}
実行するコード
System.Collections.Generic.List<行の定義> table = new List<行の定義>();
table.Add(new 行の定義(1, "ABC"));
table.Add(new 行の定義(2, "DEF"));
table.Add(new 行の定義(3, "GHI"));
dataGridView1.DataSource = table;
これなら2.0でも大丈夫……だと思う
833 :
814 :2008/02/21(木) 19:43:48
>>822 >>832 ありがとうございます。勉強になります
>>832 のコードを試してみたところ、2.0でそのまま動きました。
配列よりジェネリックのコレクションの方が勝手がいいので、すごい参考になります。
>>833 という事は、追加削除もしたいと?
ならDataSourceにtableを直接セットせずにBindingSourceでアダプタをかましてからセットすると追加なども可能になるよ、参考までに。
基底クラスのコンストラクタを呼び出すときに,派生クラスのコンストラクタの引数をそのまま渡さずに ちょっと処理をしてその結果を渡したいんだけど,一つの式で書けるなら メソッド呼び出しも含めて実質何でもできると考えていいの?
メソッド呼び出しは出来る メソッド呼び出せばなんでも出来る
画像を分割するのってどうやれば良いんだ? パズル的なのを作りたいんだが…
Bitmap作ってGraphics.DrawImage
DrawImageか、dクス
ColorをXmlSerializerからデシリアライズしたいです。 とりあえずひな形を作るためにシリアライズしたのですが、<PackedValue>4278848010</PackedValue> というものが吐かれていました。 RGB+αとPackedValueの相互変換ができれば解決すると思うのですが、 ググってもよく分かりませんでした。 相互変換のやり方を教えていただけると助かります。 よろしくお願いいたします。
FromArgbだろどうせ
>>841 RGB=10,10,10のColorをデシリアライズして出てきたPackedValueが
4278848010で、
同じColorをToArgbして表示してみると、-16119286だったんですが…
つFF0A0A0A = 4278848010
各整数型の値域は把握しとくといいぜ
16進数も分かってないバカがプログラム書くな
ここ初心者用。
初心者用はC#という意味だろw
つか、なんでARGBはint扱いなんだと思う。 取り扱いが面倒くさすぎ。 Color.FromArgb(0xFF0a0a0a)とか書けないから、いちいち Color.FromArgb(0x0a, 0x0a, 0x0a)って書いてる。 Cの書き方に慣れてないから知らないだけなのかな。 ひょっとしてもっといい書き方あるんですか?
unchecked((int)0xXXXXXXXX)) うん余計面倒だな
>>848 intの方が楽でええがな
ビット演算子だけで扱えるし
uintはCLSに準拠しないからとかなんとか
>>848 WinAPIがそういう仕様だから、互換の関係しょうがないだろうと思う
最近HDR(輝度レンジの大きいRGB表現)が登場してRGBが浮動小数点表現になってきつつあるので、どこかの段階で作り変える必要はあるかもしれない。
静的型チェックがしっかりしていて,なおかつ実務で使える機能がお多くて,さらにとっつきやすくて,その上曲がりなりにもネイティブで実行される これだけ長所があるのに何を今更
>>853 848の不満はAPIとは関係ないよ uintじゃ無いのが面倒ってだけだから
それにAPIとの互換を重視するならABGRじゃないと駄目だし
今更GDI+拡張するとも思えん
WPFならすでに各色floatで表現できる
今はxvYCCとか色々あるからなぁ
標準はRGBの方がいいよ、その他は特種扱いで プログラムがややこしくなりすぎリる
タブページへの描画について質問です(検索してもうまく答えが見つからないのでキーワードだけでもいいです) private TabControl tabControl1; private TabPage tabPage1; private TabPage tabPage2; 以上のように宣言をし、定義しています。 tabPage1にはリストビューを使ってデータの一覧を表示しており、うまくいっています (このようにして→this.tabPage1.Controls.Add(this.listView1);) tabPage2には円グラフを描きたいのですがうまく行きません。 Graphics g = tabPage2.CreateGraphics(); g.DrawLine(new Pen(Color.AliceBlue), 30, 30, 100, 100); まずは上記のようにして線を引いてみようと思ったのですが失敗してしまいます。 どういった方法があるのでしょうか?
クラスライブラリのプロジェクトを作り、プロジェクトのプロパティから 署名→アセンブリの署名にチェック→キーファイルを新規作成(パスワード保護無し)してkeyfile.snkを作成 として署名しました。 このクラスライブラリの公開キートークンを知りたいのですが、IDE上から調べる方法はあるのでしょうか? VC#2008Expressです。
>>858 どこでDrawLineを呼んでるのかと
どのように失敗してるのかがよく分からないんだけど
多分、tabpage2のOnPaint()をoerrideするか、Paintイベントで書くかしてないんじゃないの?
例えば
tabPage2.Paint += new PaintEventHandler(tabPage2_Paint);
void tabPage2_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.DrawArc(Pens.Black, 10, 10, 100, 100, 0, 90);
}
861 :
デフォルトの名無しさん :2008/02/24(日) 04:12:20
linqとかほとんど誰も使わないような構文を言語に組み込むくせに 何で正規表現リテラルが言語仕様に無いんだよ。 この言語設計者ってアホなの?
862 :
デフォルトの名無しさん :2008/02/24(日) 05:59:55
Connector/NETの5.0だとパラメータのプレースホルダとしての接頭辞に「?」しか使えなかったけど 5.2にしてみたら「@」も使えるっぽくなっているんですが 一時変数として「@」を使っていたところまでプレースホルダと判定されちゃってエラーに;; この対処法をご存知の方いませんでしょうか?
スクリプト言語ではないから、正規表現をライブラリに投げるのは正しいと思う
865 :
デフォルトの名無しさん :2008/02/24(日) 06:54:19
C#つかうより断然Bccのほうがいいだろ 過去のソースも使えるし ドットNetなしで動くし あと開発環境が重すぎ
BCCがいいのは認める だけど.NET使ったら戻れないな
867 :
デフォルトの名無しさん :2008/02/24(日) 07:08:46
C#は、デルファイ言語、ボーランドC++のパクリだろ それにC++言語の方が有名
有名(笑)
>>867 それを作ってた開発者が
C#を開発したんじゃなかったっけ
定期的にその話題でてくるなぁ。 Anders Hejlsbergね。 元ボーランド社員のDelphi開発者。 現MS Technical Fellow。C#開発者で、.NET Frameworkの設計にも深く関わってる。
871 :
デフォルトの名無しさん :2008/02/24(日) 10:06:22
.NET Remotingを使ってメッセージ通知をしあうプログラムを書いているのですが、 サーバーとなっている方の親クラスに通知する方法が思いつきません。 下記のようにやってみたのですが、これだと呼出毎にインスタンスが出来てしまって イベントの意味がなくなってしまいます・・・ なにか良い方法はないでしょうか? // server class MsgServer : MarshalByRefObject { public event EventHandler CallRecv = null; public string Recv(string message) { if (CallRecv != null) CallRecv(this, new EventArgs()); }
俺の場合は、知らせたいクラスのオブジェクトはひとつしか作らなかったから staticでインスタンスを持っておいて、それにアクセスした。
>>861 stringの拡張メソッドにMatchでもつけてみたらどうだ
LINQで正規表現を組み立てられないかな
「デルファイ言語」
むしろ正規表現はExpressionTreeに組み込める気がする 今の実装はどうなってるんだろうね
>>876 正規表現のコンパイルオプション次第で、LCG使ってIL出力して高速化できた気がする。
あの部分のソースコードも公開されたのかな。後で見てみるか。
質問です。 HttpRequestHeaderで既に定義されている環境変数(User-Agentなど)を HttpWebRequest.Headersに直接指定したいのですが、 --- このヘッダーは、適切なプロパティを使用して変更しなければなりません。 パラメータ名: name --- このようなエラーが出てしまって出来ない状況です。 WebClientでは可能なのですが、HttpWebRequestのほうが細かいことができる感じなので どうにかして指定する方法はないものでしょうか? 具体的にはtextBoxにベタ書きしてある複数行のリクエストヘッダを直接指定しようとしています。 どうかご教示お願い致します。
諦めれ
Web認証してログインするクライアントソフトを作っているのですが、 HttpWebResponseで返されたHTMLに含まれているボタンを押すには どうすればいいでしょうか? 具体的にはHTMLソース上で <input type="submit" name="login" value="ログイン" accesskey="s" /> と書かれているボタンオブジェクトです。 よろしくお願いいたします。
881 :
デフォルトの名無しさん :2008/02/25(月) 01:30:49
>>880 <input type="submit" name="login" value="ログイン" accesskey="s" />
を包んでる<form …>タグはどうなってるの?
そこに書いてあるmethodによって、actionに書いてあるURLへのデータの送り方が変わってくる。
「HTML フォーム cgi」とかで検索するともっと詳しく分かるかもね。
883 :
デフォルトの名無しさん :2008/02/25(月) 01:37:19
なんでこういう所に出すのにusingすら使わないんかねぇ・・・
>>883 それでやってみましたが、もとのログイン画面に戻ってきてしまいますね・・・
念のため、fiddlerでブラウザが送信しているPOSTメッセージをキャッチして
比較してみたのですが、同じものを送ってるんですが・・・・
Windowsアプリのように、Clickイベントを送ることはできないのでしょうか?
普通にHTTP POSTで送れると思うのだが。
すみません 送信文字列に「&」が含まれていたようで、 それを個別に%26に変えないといけないようでした お騒がせしました ありがとうございました
フォームの上に表示される青いバー(最大化ボタンとかあるやつ)を 消すにはどうすればいいでしょうか?
FormBorderStyle.Noneにするとか ControlBoxとTextをなくすとか Regionでクライアント領域だけにするとか
>>889 ありがとうございます
FormBorderStyle.Noneが一番シンプルでよさそうです
>>861 >何で正規表現リテラルが言語仕様に無い
・・・・
まず初心者用の本を買って読めよw
あるのかYo
無知をさらけ出している事実に気付いて欲しい
正規表現リテラルが言語仕様にあったとしても Regexオブジェクトのシンタックスシュガーになるだけじゃね
>ないじゃんただの文字列じゃん死ね ?
多分891はRegularExpressionの存在を知っていてしかも使っているから書いたんだと思われ
わざわざ言語に組み込むコストとそれによる効果を考えれば明らか
言語に組み込んでも、どうせプロはオーバーライドして使いたいでしょ 機能がクラスにあればそれで十分
その機能としてですね・・ええ,はい・・・
文字列演算の上位機能として正規表現があるといいな 文字列に対してたとえば / 演算を正規表現によるマッチングで foreach(var s in "abc123abc123"/"(a*123)"){ ... } とか出来たら,正規表現云々がコード上で一目でわかってくる気がする もちろんこのまま実装したらキモくて使い物にならないけどな C#も演算子の定義とか出来ればいいのに.
foreach(var s in new RE("abc123abc123")/new RE("(a*123)")) ぐらいでええやん?
暗黒面に落ちるぞ。
マッチ対象までreにする必要はふじこ
正規表現リテラルとかいらねーよw ライブラリにあんだろw
>>907 BOOSTは言語仕様じゃなくてライブラリだが
君好みのライブラリが欲しいなら自分で作れば?w
>>906 便利とか不便とかの問題だからあなたにいらなくてもほしい人はいるのです
そんなややこしいことせんでも C#の正規表現はプリコンパイルすることも実行時コンパイルすることも コンパイルせず普通に使うことも出来るぞ
>>908 どっちもライブラリだけど、言語仕様に欲しいって言ったら、
簡単に書けることのほかの理由は
コンパイル時にどうにかしたいって話に向かうよなと思って振ってみただけ。
なーんか真面目に熱くなって水掛論してこいつら楽しいのかなぁ
熱を冷ます水かけ、地熱発電の応用がききそうだ
boostの現状を見るとtemplateはただの完全に自由なテキスト生成規則にした方が 5000倍ぐらい良かった気がするな
C++の型を認識しないで動くのは御免こうむる 正規表現のリテラルがあればテキスト処理が楽になるから実装よろ
LINQ to Objectと違って用途が限定されすぎてるよ
テキスト処理ってそんなに限定的なのか・・・
限定的と言うより抽象性が低い、かな
まぁテキスト処理すなわち正規表現ってわけでもねーし。 正規表現リテラルあってもいいけど、「linqなんて実装するくらいなら〜」てな 意見は単純に阿呆かと思う。
拡張性が低いというのならそれは一面を見ているに過ぎないという感じ そもそも正規表現が使われる範囲がそんなんだからなぁ で,思いついた. ユーザによるリテラルの実装をすればもっと幸せになれると思うんだ. class complex{ private r, i; public static literal `(literal L){ // L はコンパイラによって取得されたソース中のリテラル MatchCollection mc=L.entity/RegExWrapper`\(([0-9]*)\s,\s([0-9]*)\`; r=new int(mc.Item[0].Value); i=new int(mc.Item[1].Value); } // その他の複素数の演算は割愛 } public static class RegExWrapper{ public static literal `(literal L){ // 割愛 } public static MatchCollection operator /(string lhs, RegExWrapper rhs){ // rhsの正規表現を使ってlhsからMatchCollectionを生成 } } たとえば complex`(1,2)`*complex`(3,4)` は(1+2i)(3+4i)と等しい,とかいうことができちゃったりすると楽しそう. こうすれば可用性が格段にあがるな
独自実装でもいいしライブラリなんて探せばあるだろうしコードだって転がってるだろうし
文字に限らず一般のコレクションに対するパターンを表現する方法を考えてMSに送ってやれ
Regexと書かなくて済むからといって生産性はかけらも上がらん クエリ式はクエリ式がないとどうしても書きにくい処理があるから存在している
と言いつつもregexやmatchでコードがどんどんグチャグチャになってしまってはいないかい?
complex`(1,2)`*complex`(3,4)` new Complex(1,2) * new Complex(3,4)と書けばいいだろう たくさん出てくるなら関数作って c(1,2) * c(3,4)でもいいし
>>925 それは使い方が悪いとしか
仮に正規表現にリテラルがあったとしてもコードのあちこちにべたべた張り付けまくったらグチャグチャだろ?
>>926 全くだ。
(1+2i) * (3+4i)と書けるようにしろという話のならまだ良かった。
complexとかはただの例だからあんまりそれ自体に突っ込まないでね^p^;
ユーザ定義リテラルっつーと C++0x か。
正直@リテラルにIsMatchとかMatchとかReplaceとか名前キャプチャとか Resultとかもろもろであまり困ったことないのだが異端なのか
適当にラップしつつ使うもんだと思ってたがここ見てるとそうでもないのか
複素数なんざ滅多につかわん 汎用言語に何を求めているんだ 理想の複素数が欲しければちょっとした言語を作って 動的にILでも生成すりゃいいだろ
そこで fortran.net ですよ。
おまえらはすぐそうやって美しくわかりやすく書きたがる Javaを見習え 地味にadd()やsub()メソッドでがんがるんだよ 一時オブジェクトなんかキニシナイ
@"" が有るぐらいなら、正規表現リテラル R"" ぐらい作ってもいいかもと思うことも無くもない。 ただしただ実装するだけじゃ駄目だ、そんなのならライブラリでも構わない、C#コンパイル時にこれもコンパイルして 文法チェックした上でコンパイルエラーを出すぐらいやってくれれば入れてもらってもいい、そこまでやるなら十分有用。 それと、正規表現同士の結合演算子を実装するといいと思う、それは部分的な正規表現を結合して一つの正規表現ができるという正規表現の性質としてもいいし、 文法チェックした上で組み立て自在となれば大変便利。 とかとか考えていたら、いっそ LINQ 並に強化された Language INtegrated yacc&lex ぐらい作ってもらえるとユカイかもしれない。 boost::spirit 以上の能力を持たせてくれればグレイト。 LINQでは、Sql Xml と個別実装ができる汎用性をもつし、いっそ構文定義と解析手法を分解して簡単文法解析から超ヘビー級解析まで自在になったらいい。 やってくれヘジたん。
>>939 そこまでいくと、C#である必要あるの?という気もするな。
せっかくCLRがあるわけで、Javaじゃあるまいし、pure C#な必要なくて。
ヘジたん正規表現嫌いそうじゃね? いや、なんとなくなんだけどさ
正直正規表現はいらないというか嫌い
ヘジは正規表現リテラルを作るくらいなら テキスト処理の問題の9割を解決できる新たな枠組みを作ろうとするだろう
適当な構文の構造はXMLでも表現できるし、テキスト解析 → XML → XML to LINQ ならば間飛ばして、テキスト解析toLINQ はいLINQの強化で決まり。
木構造に適したコレクションって用意されてますかね? あれば教えて欲しいです。 無ければないでList<T>等から拡張すればいいのですが、 最初からあるのならそれをと思ってググったのですが、 見あたんない。 欲しい機能は"root->node->subnode->leaf"の様な文字列で leaf(にある)オブジェクトを取得できるとか、 leaf自身で自分のパス("root->node->subnode->leaf")を取得できるとか 等なんですが。後者はTreeViewのTreeNode.FullPath的な感じです。 あ、みなさん木構造ってどのように扱ってます。 上に書いたのは一種の多次元配列みないな物ですが、 他には直近の親もしくは子の識別子だけを 各オブジェクトに保持した隣接モデルもあります。 ケースバイケースって言われりゃそれまでのような気もしますが。
>>945 自分で作れよTreeぐらいw
BinaryTreeとかBTreeとかKDTreeとか
用途によって使い分ける部分が多すぎるだろう
947 :
945 :2008/02/26(火) 14:43:53
>>946 レスどーも。
"Treeぐらい"自分で作れるよ。てか既に作ったんだよ。
んでも、ちょっとスマートさに欠けているというか、ちゃんと動くのは動くが、
経験がまだまだ少ないものだから、「これでいいのか?」と不安なんだよ。
TreeViewとかXMLとか木構造はいろいろ使われているので、
"Treeぐらい"最初から用意されているのかなと思ったんだよ。
"そこ"には自分で思いつかなかった有用なメソッドがあるかもしんない。
なんてね。
無いと判ったら自分で作り込むだけ、DOMみないな大げさなもんが必要じゃないしね。
>>947 スレ違い
Introduction to Algorithms読め
汎用性のある木なんていらんな 2分木で十分なのにm分木にされても非効率だったりするし
C#の標準のFormって レイヤードウィンドウ、リージョンウィンドウどっちですか?
952 :
945 :2008/02/26(火) 17:31:59
各位いろいろどーも。
>>948 ちょっとネタがそれてしまってスマソ。
もともとの「木構造に適したコレクションの有無」ならスレ違いじゃないよね。
>>949 おお、サンクス。日本語ページのみにしてたから気づかなかったよ。
てかcode projectには会員登録してるのにすっかり忘れてた。
使ってみるか、参考にしてみるよ。
そもそもList<T>等を入れ子にして、
>>945 に書いた程度の機能が欲しかった
だけなんだが、利便性とかも含めいろいろ考えると確かに複雑というか太る。
DOMまで行かなくてもどこかにベースになるような物があるんだろうよ。と思ったのが発端。
>>950 検索はしたいけどそれが主体な検索木が必要だと言うことではないんです。
>>953 フォームを透明にしたいのですが、
リージョンウィンドウは重いと聞いたので・・・
聞いたのでってw
ROK
聞いたので、の何が悪いんだろうね
>>955 みたいなのはなんなんだろう?
今時の子は人に聞いたりとかってもんを軽視してるしな それしかなかった時代が存外身近なのにもかかわらず
聞くのはいいが、その裏付けを取れよ。 マニュアルを見て、また実際にプログラム書いてみればすぐわかるんだから。
パフォーマンス云々を気にするならまずやってみろってこったよ
確かにFormを透明にすると重くなると思います。 ただスペックによると思いますので、自分のPCでいけるといって顧客環境ではいけるとは限らないでしょう。逆も然り
backgroundWorkerについて質問です 以下定義 backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork); backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); backgroundWorker1.WorkerSupportsCancellation = true; 普通にバックグラウンド処理(backgroundWorker1_DoWork)の処理が終わり backgroundWorker1_RunWorkerCompletedが呼び出され終了した場合は全く問題ないのですが backgroundWorker1.CancelAsync();によりキャンセルをした場合に限り、次にまたbackgroundWorker1_DoWorkを 呼び出した場合正常に動作しません(バックグラウンド処理が全く始まらないです) これは何か定義を忘れているのでしょうか?情報不足な場合申し訳ないです、言っていただきたいです ボタンをクリック→バックグランド処理→終了→ボタンをクリック→バックグランド処理→…だと正常 ボタンをクリック→バックグランド処理→バックグランド処理中にキャンセルボタンでキャンセル→ボタンをクリック→バックグランド処理(始まらない) こんな感じです よろしくお願いします
963 :
963 :2008/02/27(水) 03:46:40
すみません、原因がわかったと同時に問題がorz backgroundWorker_DoWork内で主要処理を別メソッドとして書いています つまり別メソッドなのでbackgroundWorker1.CancellationPendingを参照出来ません DoWork内に主要処理をしっかり書くしかないというのは不便な気もしますし、しょうがないところなのかなとも思うのですが 何か対応策ないでしょうか? 設計を見直すしかないでしょうか?
964 :
963 :2008/02/27(水) 03:47:02
名前欄間違えました963=962です
backgroundWorker_DoWork(なんだったか引数) { func(); } こんな感じでfuncに主要処理が書かれてるってこと?
966 :
962 :2008/02/27(水) 03:54:13
>>965 そうです、正確にはbackground_DoWork内で状況に応じて呼び出すメソッドを変えています
backgroundWorker_DoWork(略)
{
switch(type)
{
case 1: func1();
case 2: func2();
case 3: func3();
:
default: break;
}
}
ニュアンスとしてはこんな感じです
backgroundWorker1(オブジェクト)とbackgroundWorker1_DoWorkとfunc1,2,3が 同じスコープにあるなら、何も問題ないと思うが デリゲートの概念はきちんと理解してるんだろう 推測するに、かなり省略したけどこんな感じじゃないのか class Form1 { BackgoundWorker bgWorker1; void InitializeComponent() { this.bgWorker1.DoWork += new 〜(this.bgWork1_DoWork); } void bgWorker1_DoWork(〜) { func1(); // this.bgWorker1にアクセス出来る } void func1() { // this.bgWorker1にアクセス出来る } }
C#の勉強をかねて非矩形のウインドウを作ろうと思ってとりあえず形にはなったんだけど ウインドウサイズを変更する際に目に見えて遅くなるのは実装がまずいんだろうか? 今の実装は、枠消したFormにベースとなる画像を張りつけといて その上で、張った画像の透過部分以外を囲むGraphicsPathを書いてそれでFormをくりぬく様にしてる
1byteをintに変換するのにはどうすればよいですか? int ret = BitConverter.ToInt16( value,0 ) ; 見たいにやると例外で落ちてしまいました。
キャストでええやん
そっか普通にキャストでよかったんですね 有難う御座います
972 :
デフォルトの名無しさん :2008/02/27(水) 09:53:42
複数のスレッドが走っている際のTcpListenerの反応が鈍くて困ってます。 ・コマンド受信用のThread x1(TcpListenerでテキスト1行のコマンドを待ち受け) ・データ処理用のThread x4(数字ごにょごにょしているだけ) Main() { ListenerThread(); DataConvertThread(); } となっているのですが、データ処理用のThreadが走っている間、TcpListenerの AcceptSocketが発生してくれません。 処理すべきデータを切り替えたりするコマンドを受信した際に、イベントを発生させ、 データ処理用のThreadを止めて新たに作り直したいのですが、処理が終わるまで 反応してくれないのです。 どうしたらいいでしょうか?
>>972 で,実際の中身はどうなってるの?
擬似コードは全く役に立たないよ
Dictionary<string, string[]> list = new Dictionary<string, string[]>(); キーの一覧を取りたいのですがstring[] lists = list.Keysだと暗黙の変換が出来ないと怒られるのですが どうしたら良いのでしょうか?
Keysの型がなんでstring[]だと思ったのかkwsk
>>975 これでキーが取れたから(^^;
foreach (string key in list)
{
}
MSDN で Dictionary<TKey, TValue>.Keys プロパティ調べれ
>>974 仕方ないから教えてやるけど、次からちゃんとMSDN読めよ。
MSDNが難しかったらオブジェクトブラウザでもいいし。
string str0 = list.Keys[0]
string str1 = list.Keys[1]
要するにそのまま取り出せばいい。
一度変数に格納したい場合は
Dictionary<string,string[]>.KeyCollection keyList = list.Keys;
このように書く。
コレクションの概念とクラスと型の概念の勉強からやり直しなさい。
>>976 foreach()で列挙可能なのは配列型だけじゃないぞ
長いことやっててその状態なら慢性勉強不足気味
そうでなくとも原因を特定できないようじゃ結構キツイ
というわけでおれもMSDNをオメヌメ
コレクションの概念おしえてください(^^;
>>980 MethodInvoker inv;
は引数も戻り値も取らないデリゲート
Func<int,bool>
は引数にint、戻り値にboolをとるデリゲート
これは分かるのだが、
引数にint、戻り値なしというようなジェネリックデリゲートって用意されてない?
Func<int,void>
Func<MyClass,void>
みたいなものを使いたいんだが、見つけられないんだ。
今は仕方ないからboolを返すようにして、常にtrueを返すようにしてFunc<MyClass,bool>を使ってる。
戻り値いらないから、毎回boolを返さなきゃいけないのが面倒なんだよね。
Action
俺のコレクションは美少女物が少々 だが俺に何かあったときはこっそり処分して貰いたい
ファイナライザを実装しとけばおk
実行してくれるGCはどうするよ
みなさん、ありがとうございます。 MSDNも見てきました。 >> Dictionary<string,string[]>.KeyCollection keyList = list.Keys; 単にコピーするというのではなくこの行がとてもわかりやすかったです。
988 :
981 :2008/02/27(水) 13:35:22
ついでにもう一つお願い。
Public Action<int[]> TestInvoker=TestMethod;
これがあって、このデリゲートをInvokeメソッドで呼びたい。
このときInvokeメソッドの第二引数にはObject[]を渡さなければいけないそうなんだけど、
int[] param = new int[] {0,1,2};
Invoke(TestInvoker,param);
これもダメ
Invoke(TestInvoker,new Object {param});
これもダメ
実行時エラーになってまう。
エラー内容はFormatExceptionの例外で、引数が不正っぽいニュアンス。
どこがダメだかご指摘くだされ。
>>987 お礼として次スレを建ててもらえるとありがたい
他の人、立候補よろ
>>988 立てれなかった(^^;)残念
990 :
988 :2008/02/27(水) 14:18:24
自己解決しますた。 引数の渡し方の問題じゃなくて、呼び出し先のメソッドでポカやってたみたい。 渡し方は、 Invoke(TestInvoker,new Object[] {param}); で問題ないみたいだね。失礼しました。
new object[]{...} object[]が要求されてるなら素直にobject[]を渡せよと。 あと共変性って言葉を調べるといい。
992 :
988 :2008/02/27(水) 14:38:21
>>991 悪いけどそんなもんは当然分かってる。
>>988 で
>Invoke(TestInvoker,new Object {param});
と書いているのは単に[]を付け忘れただけだ。
問題だったのは呼び出し先デリゲート内の処理の方だったし、
それは自己解決したって言ってるだろ?
自己解決したっていうレスにわざわざ突っ込み入れるなんて、
いちいち追い打ちで人を貶して優越感に浸ることしかできないのか?
993 :
デフォルトの名無しさん :2008/02/27(水) 14:41:18
3行以上よめません>< 要するに「はいはい」ってことですか><; わかりません!
くだらねえ
日本語が不自由すぎる
他の掲示板で質問をすると、大抵手ひどい対応をされるわけだが、このスレの人はなんで親切揃いばっかりなのは何故だぜ? それに対して逆ギレするとはアホすぎるw
>>992 あなたさまはどこのおぼっちゃまですか?
ラムダ式について質問です。 Form OwnerForm = frm1 //frm1を表示させる OwnerForm.Invoke((Action)delegate() { OwnerForm.Show(); }); この匿名メソッドをラムダ式を使って表記したい場合どのような感じになりますか?
OwnerForm.Invoke(new Action(() => OwnerForm.Show()));
>>999 ありがとう。
なるほど普通に匿名メソッドで表記した方が可読性が良いですね。
今回は匿名メソッドで表記することにします。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。