C#, C♯, C#相談室 Part42
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2007/08/26(日) 12:42:25前スレ
C#, C♯, C#相談室 Part41
http://pc11.2ch.net/test/read.cgi/tech/1184840053/
過去スレは>>2-5あたり。
0455デフォルトの名無しさん
2007/09/07(金) 19:59:40いわゆるオーナードローっぽいことがやりたいのならControlPaintを使うようだから
詳細はMSDNを見るといい
が、>>454に同意だな
0456デフォルトの名無しさん
2007/09/07(金) 20:19:15> まずその描画はOnPaintでやるべき。
TextBoxBase 以下は OnPaint が無視されたような気がする。
0457デフォルトの名無しさん
2007/09/07(金) 20:52:072003までのCPPはマネージとアンマネージはクラス分けされ、同一コード内にはかけても、そこからメモリへの受け渡しが辛かった。
2005はマネージとアンマネージを並べてかける。
つまり
int A=42
printf(A.Tostring());
みたいな事ができる。
0458デフォルトの名無しさん
2007/09/07(金) 20:56:410459デフォルトの名無しさん
2007/09/07(金) 21:15:38やってみると意外と面倒だね。
枠の幅が1でよければ、BorderStyle =BorderStyle.FixedSingleにしておいて
WM_PAINT捕まえてそこで枠を描画すればできる。
0460デフォルトの名無しさん
2007/09/07(金) 21:44:08文字列をこさえたい。リフレクション使えばできるかと思ったら、
Type.GetFileds() はフィールドの宣言順を保証しないと言う。
どうすればできる? あきらめるしかない?
0461デフォルトの名無しさん
2007/09/07(金) 21:44:35ピクチャボックスに色を塗る。
テキストをフラット枠線無しにしてピクチャの上に載せる
これが一番時間がかからない。
グラフィックで書くのも良いけど、速度は体感できない程度しか変わらない
0462デフォルトの名無しさん
2007/09/07(金) 21:47:44そもそもCILにコンパイルされた時点で宣言順なんて保証されないと思うが。
まああきらめた方がいいと思うよ(仮にできたとしても)。
0463デフォルトの名無しさん
2007/09/07(金) 21:50:44ぴったり1ピクセル分ずらすのって、むずかしくない?
0464デフォルトの名無しさん
2007/09/07(金) 21:55:20Order属性とか自分で定義して全部のフィールドに[Order(2)]みたいに付けといて
その順番で連結すれば?
それなら余計なメンバを増やしたり動作をいじったりせずにリフレクションだけでできるよ
0465デフォルトの名無しさん
2007/09/07(金) 21:58:07サイズプロパティに打つんだよ。
マウスだとちょっとズレるかもだから
0466デフォルトの名無しさん
2007/09/07(金) 22:01:35ヒント
IList
delegate
0467デフォルトの名無しさん
2007/09/07(金) 22:07:41そんなめんどくさいことするくらいなら初めから連結メソッドを定義するだろw
0468460
2007/09/07(金) 22:10:44カスタム属性か。まあ今も Excel から自動生成してるクラスなんで、
それならできそうです。
>>466
plz one more.
0469デフォルトの名無しさん
2007/09/07(金) 22:12:06確かに宣言順は保証されないんだが、
宣言順に初期化されるという保証があるので事実上宣言順に並んしまうという状態。
それを利用してリフレクションを使って順番通りに文字列をなんかするなんてソースが会社に大量にあって動いている困った状態。
どうにかして宣言順に並んでいないケースって意図的に作れないかな?
順番は保証されてないから動かない可能性があるって言っても動いてるからって理由で修正を拒まれて困ってる。
0470デフォルトの名無しさん
2007/09/07(金) 22:14:45自動生成クラスなら文字列連結メソッドも自動生成した方がいい。
自動生成クラスが何かのケースで実際に動かして動かないことが発覚するリフレクションより
コンパイル時に動かないコードになってることが分かる方がいいよ。
0471460
2007/09/07(金) 22:56:31んんん。良くわからんのだが、リフレクションは信用ならないということ?
連結メソッドにしろリフレクションしろ、コンパイルを通した上で、テスト
ケースもこなすと思うのだが。
0472453
2007/09/07(金) 23:33:24やっぱり重ねるのが楽でしょうか…。
ありがとうございました^^
>>455
了解しました、MSDN見てみます。
ありがとうございました^^
>>456
な!?
マジですか!?
処理追ってみます。
>>459
おお、その方法よさそうですね、試してみます^^
ありがとうございました^^
>>461
やはり載せる案多数ですね…。
ありがとうございます^^
とりあえず今日は退勤してまいりましたので、明日にでもいろいろやってみようかと思います。
みなさんありがとうございました^^
0473デフォルトの名無しさん
2007/09/07(金) 23:36:50メソッドは保障されてるってことだろ?
わざわざリフレクション使う内容かどうかわからないし。
0474デフォルトの名無しさん
2007/09/07(金) 23:47:590475デフォルトの名無しさん
2007/09/08(土) 00:00:35アセンブリしかできませんが、挑戦してみようかな
0476デフォルトの名無しさん
2007/09/08(土) 00:03:320477デフォルトの名無しさん
2007/09/08(土) 00:05:03今の流れはどちらかと言うと不毛な話ばっかりだと思ったが。
どこらへんが面白かったか教えてちょ!
正直c#は面白い。
0478デフォルトの名無しさん
2007/09/08(土) 00:08:330479デフォルトの名無しさん
2007/09/08(土) 00:42:40ある日、誰かがメンテをしてそのクラスを手でちょっとだけ修正を入れて
何気なくフィールドを追加しただけなのに挙動が変わったなんてことが起きるかもしれない。
せっかくの連番の属性も意味もわからないままコピペされて番号が重複したりするかもしれない。
そういうときに限ってテストケースの存在も無視される。
普通のメソッドになってれば少なくともそのメソッドの挙動は直接メソッド自体を書き換えられないと変わらないだろ。
マクロで普通のコードを生成できるのに、
リフレクションで処理しやすいようなクラスを用意するってのは本末転倒だろ。
C#のリフレクションはJavaなんかより割と速いけど普通にメソッドを叩くよりかは明らかに遅くなるだろうし。
0480デフォルトの名無しさん
2007/09/08(土) 01:09:540481デフォルトの名無しさん
2007/09/08(土) 01:46:22この表示された値(2バイト文字)をコピーしてエクセルに貼り付けると文字化けしています。
(テキストファイルなどへのコピーは平気)
エクセルへのコピーも問題なく行うにはどうればいいのでしょう?
0482480
2007/09/08(土) 02:55:090483デフォルトの名無しさん
2007/09/08(土) 03:42:070484460
2007/09/08(土) 08:26:15自動生成クラスを手でいじったり NUnit かけずに済ます文化がこちらには
ないんだが、言わんとしてることはわかった。ありがとう。
0485デフォルトの名無しさん
2007/09/08(土) 10:06:40等値比較演算子を自分で実装しないといけないの?
試してみたら自動でやってくれてるみたいだけど
0486デフォルトの名無しさん
2007/09/08(土) 10:59:150487デフォルトの名無しさん
2007/09/08(土) 13:14:240488デフォルトの名無しさん
2007/09/08(土) 13:37:18デフォルトだとValueType.Equalsが使われる。
ValueType.Equalsだが、プリミティブ型のみから構成される構造体なら
ビット比較を使うっぽい。
参照型を含んでいたりするとリフレクションでメンバごとに再帰比較してる模様。
これが遅いと言われている。
http://pc11.2ch.net/test/read.cgi/tech/1173763436/161-185
0489デフォルトの名無しさん
2007/09/08(土) 13:41:43>参照型を含んでいたりするとリフレクションでメンバごとに再帰比較してる模様。
いまのCLRならその部分をLCGで実行時生成して
キャッシュしておくこともできそうだな。
キャッシュの寿命管理が面倒そうだけど、
直近の16エントリぐらい保持しておけばそこそこヒットしそうだ。
0490デフォルトの名無しさん
2007/09/08(土) 14:01:320491デフォルトの名無しさん
2007/09/08(土) 14:09:10自分とペアになるオブジェクトをプロパティで持たせた方が簡単で早いじゃん。
・・・・・・と俺は思っちゃうんだが、これってやっぱり単細胞過ぎる発想かな。
0492デフォルトの名無しさん
2007/09/08(土) 14:10:11肝心のハッシュテーブルはどうするんだw
0493492
2007/09/08(土) 14:12:39俺のほうが単細胞だったようだorz
0494デフォルトの名無しさん
2007/09/08(土) 18:57:52ValueType.Equalsを使うならボクシングが発生するよね
それならプリミティブ型のみでもやっぱり自分で比較した方が速いのかな
0495デフォルトの名無しさん
2007/09/08(土) 23:48:320496デフォルトの名無しさん
2007/09/08(土) 23:51:320497デフォルトの名無しさん
2007/09/08(土) 23:51:33その程度のこともしらない人がつくったアプリなんて使いたくも無いw
0498デフォルトの名無しさん
2007/09/09(日) 01:41:29JITでボクシングの部分はたいてい取り除かれているらしい。
さらにインラインかもありえるらしい。
ただJITの結果は調べられないからほんとかどうかは知らない。
0499デフォルトの名無しさん
2007/09/09(日) 01:59:44>ただJITの結果は調べられないからほんとかどうかは知らない。
ボクシングが起きてるかどうかはCLR Profilerで分かるんじゃない?
GCヒープにその値型が確保されてればどっかでボクシングは起きてるてことで。
0500デフォルトの名無しさん
2007/09/09(日) 02:10:22ってか取り除かれるのはかなり限定された状況だけじゃない?
0501デフォルトの名無しさん
2007/09/09(日) 05:03:43問題が起きたら直すでおk
世の中そんなもんだ。
0502デフォルトの名無しさん
2007/09/09(日) 11:42:40jscript.netのevalはNGです。
自分で書いた独自のメソッドを呼べないので。。
public string myMethod(string s)
{
return "hoge";
}
文字列に
if(myMethod("hoge")=="hoge") "あ","い")
としておき
結果の
"あ"
を返す方法
文字列中にmyMethodがいつ来るかはわからないです。
0503デフォルトの名無しさん
2007/09/09(日) 12:23:16myMethodは静的にすれば元アセンブリ参照で呼べるだろ
0504デフォルトの名無しさん
2007/09/09(日) 12:36:05IronPython
0505デフォルトの名無しさん
2007/09/09(日) 12:37:51ArrayList で foreach を使う事について
ループ内部でIndexof を使用してIndexを求める場合、
foreach を使用せずに最初からインデックスを指定して回すやり方が普通なのかどうか
常識的に考えると後者が普通だと思うのですが
foreach を使用したほうが、コードが若干短くなるし、
コード上では多少効率が割るそうですが、オプティマイズされたCLRが吐かれるような気もしますし
0506デフォルトの名無しさん
2007/09/09(日) 12:45:06参照オンリーならforeachでいいんじゃないのか
Array<T>やList<T>ならForEachメソッドなんてのもある
0507デフォルトの名無しさん
2007/09/09(日) 13:05:00ありがとうございます
ところで、2003 にはList<T>は無いみたいです...
0508デフォルトの名無しさん
2007/09/09(日) 13:08:21使ってみたが、とてもじゃないが金を取れるソフトではありませんね
やはり、商用だとC/C++がいいのですかね
0509デフォルトの名無しさん
2007/09/09(日) 13:18:510510デフォルトの名無しさん
2007/09/09(日) 13:35:56おまいさんは金を取ることの意味を勘違いしてるな。
The Old New Thingsでも立ち読みしてこい。
ttp://www.amazon.co.jp/dp/4756150004
0511デフォルトの名無しさん
2007/09/09(日) 13:57:37みたソフトが悪い
あれはMITのヲタク学生が書いた駄作だよ
0512デフォルトの名無しさん
2007/09/09(日) 14:05:24ArrayListにオブジェクトをセットして
セットするオブジェクト: int Key, string Name1, string Name2, ...
そのArrayListに対して、例えば、Key = 3 は何番目なのかを
メソッドだけで、処理できますか?
Contain と IndesOf と、比較用のメソッドをオーバーライド?すればできそうな気もしていますが
良くわかりません
0513デフォルトの名無しさん
2007/09/09(日) 14:26:55IndexOfでとれるだろ。。unboxingされて値が同じなやつが返るだろうけど
0515デフォルトの名無しさん
2007/09/09(日) 14:33:23EqualsとGetHashCodeをoverrideする。またはHashtableでも使え。
それがいやならC#2.0のList<T>にはFindメソッドとかあるぞ。
0516デフォルトの名無しさん
2007/09/09(日) 14:35:30intなら値で比較されるだろ
もしかして
key1, string1_1, string1_2,
key2, string2_1, string2_2,
...
みたいな構造をArrayListで作ろうとしてるの?
HashTable使えよ。。。
0517デフォルトの名無しさん
2007/09/09(日) 14:42:57こういうことがしたいの?
public class Item
{
public int Key;
public string Name1;
public string Name2;
public string Name3;
}
ArrayList al = new ArrayList();
// 入力
int index = 0;
foreach (Item item in al)
{
if( item.Key == 3 ) break;
++index;
}
if (index == al.Count)
Console.WriteLine("みつかりませんでした");
else
Console.WriteLine("{0}番目", index);
0518デフォルトの名無しさん
2007/09/09(日) 14:44:43考えるだけで学ぶことをしようとしない人間は間違いを犯しやすい。
0519512
2007/09/09(日) 14:58:56ArrayList al = new ArrayList(); // 入力
Item addOrReplaeceItem = new Item(); // 追加または、更新しようとする要素(オブジェクト)
addOrReplaceItem.Key = 2;
addOrReplaceItem.Name1 = "new name1";
int index = 0;
foreach (Item item in al)
{
if( item.Key == addOrReplaceItem.Key ) ;
{
((Item)al[index]).Name1 = addOrReplaceItem.Name1; // あれば、入れ替え
break;
}
++index;
}
if (index == al.Count)
{
Console.WriteLine("みつかりませんでした");
al.Add (addOrReplaceItem); // 無ければ、追加
}
こんな感じです。
宜しくお願いします。
0520デフォルトの名無しさん
2007/09/09(日) 14:59:19あほなこと言ってないで素直にインデックスで回すか、
自前でインデックスカウントしとけ。
同じ値とか複数あったらどうすんだ?
無いとしても効率悪くなるだけ。
そんな器用な最適化ができるわけなかろう。
0521デフォルトの名無しさん
2007/09/09(日) 15:01:130522デフォルトの名無しさん
2007/09/09(日) 15:01:300523デフォルトの名無しさん
2007/09/09(日) 15:22:45「メソッドだけで」とか難しいこと考えずに
全部書くか自分でメソッド作ることをおすすめする。
どうせList<T>使えるようになったら組み直しなんだし。
難しいことやるのは慣れてからでいいよ。
0524512
2007/09/09(日) 16:11:520525デフォルトの名無しさん
2007/09/10(月) 02:22:48値を渡すのを防ぎたいんですがどうすればいいでしょう?
0526デフォルトの名無しさん
2007/09/10(月) 02:24:53でできました。。どうもです。
0527デフォルトの名無しさん
2007/09/10(月) 03:46:34やはり、.NETではこの程度が限界か?
0528デフォルトの名無しさん
2007/09/10(月) 06:36:45すみません
この発言読み飛ばしてました。
静的にすればアセンブリ参照で呼べるというのを解釈すると
new をしないようなstaticなメソッドにしてDLLとして作成。
呼び出し元プログラム側で、参照の設定をしてあげるという
のでしょうか?
この静的にするということは、タイプセーフではないという
ことになりますか?今回ASP.NETで作成したいのですが。。
>>509
IronPaython
は動的言語ということで私も考えたのですが
具体的にどうすればよいのかが浮かびませんでした。
それにC#から呼び出したいのでオーバヘッドが発生する気がします。
0529デフォルトの名無しさん
2007/09/10(月) 08:55:33それ危なくない?
0530デフォルトの名無しさん
2007/09/10(月) 12:46:34なんで?
> C#から呼び出したいのでオーバヘッドが発生する気がします。
eval とか言ってるのにオーバーヘッドw
まあ全体に ASP.NET でやるには怖すぎる処理だわな
0531デフォルトの名無しさん
2007/09/10(月) 13:01:49その手のライブラリもあるだろう。
evalと同等とかC#の関数で出来ることを全部やりたいなら、
CodeDOMやらそれなりに危険なことをしないと無理。
話はそれるがC#3.0のExpression<Func<>>の仕組みをつかって、
eval的なことが出来そうな気がする。
いまのところDLinq用だが、どう見てもLispのクォートを狙ってるとしか思えない。
0532デフォルトの名無しさん
2007/09/10(月) 18:43:40本題とはずれるけど、C# 3.0 のラムダ式の話、
C# 3.0 は F# からいろいろ輸入したって話らしいから、
F# の(大元をたどればもちろん LISP の) quote 由来だろうね。
LISP だと、データとプログラムを区別しないってのを、
.NET Framework だと、ラムダ式を
デリゲートに代入したときはプログラムとして、
Expression 型に代入したときはデータとして扱う
というコンセプトみたい。
0533デフォルトの名無しさん
2007/09/10(月) 18:49:29DLRも見てみると面白いよ。
ASTからILへの汎用変換エンジンになりつある。
CodeDOMは死相が出ちゃったけど
DLRはRubyとPythonという目標がある以上、
ある程度のところまで作り込むんじゃないかな。
ちなみにExpression Treeの裏話。
ttp://d.hatena.ne.jp/siokoshou/20070709
ま た D o n B o x か !
0534デフォルトの名無しさん
2007/09/10(月) 23:55:38HTML中で16進形式(5桁:ex."𠮟")で指定されたサロゲートペア文字を
正しく変換する楽な方法ってないですか?
HttpUtility.HtmlDecodeだと、下位4桁までしか認識しないようで、困っております。
string s = HttpUtility.HtmlDecode("𠮟");
foreach (char c in s)
Console.WriteLine(string.Format("{0:X4}",(int)c));
--出力(こんな値が入ってて欲しい)--
D842
DF9F
--出力(でもこうなっちゃってる orz)--
0B9F
0535デフォルトの名無しさん
2007/09/11(火) 00:07:190536デフォルトの名無しさん
2007/09/11(火) 00:19:54できればメソッド一発でできたらなぁ、と思ったんですが、
やっぱそこだけ別に処理するしかないスかね。
0537デフォルトの名無しさん
2007/09/11(火) 00:29:04というのをひとつのメソッドにすればメソッド一発だよ
0538デフォルトの名無しさん
2007/09/11(火) 00:54:18いわゆるUCS-4なんだが、-1はBMPしか扱わないそうな。-2がそれ以外の文字。
0539デフォルトの名無しさん
2007/09/11(火) 01:32:11ローカルメモリオブジェクト内のDIBをもとに作成したBitmapオブジェクトが破棄されるまではローカルメモリオブジェクトを解放せずにおき、Bitmapオブジェクトが破棄された段階でローカルメモリオブジェクトを解放するようにしたいのです。
DIBをマネージメモリにコピーしてからImage.FromStream()でImageオブジェクトを生成し、すぐさまローカルメモリオブジェクトを解放する、という方法なら安全確実なのですが、いかんせん遅いのです。
0540デフォルトの名無しさん
2007/09/11(火) 05:44:01>まあやっぱりJScript.NETのevalだな
>myMethodは静的にすれば元アセンブリ参照で呼べるだろ
やってみたけど無理でしたよ!
やっぱりできないのでは?
DLL側に
public class MultiplyClass
{
public static long Multiply(long x, long y)
{
return (x * y);
}
}
としてコンパイル、それを呼び出し側で参照の追加。
string exp = "MultiplyClass.Multiply(10, 5)";
Microsoft.JScript.Vsa.VsaEngine ve =
Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
long result =
(long)Microsoft.JScript.Eval.JScriptEvaluate(
exp, ve);
そうすると
変数 'MultiplyClass' が宣言されていません。
結局、作成したクラスはスコープの範囲外でした。
0541デフォルトの名無しさん
2007/09/11(火) 07:22:54なるほど。HttpUtility.HtmlDecodeのバグというわけではないわけですね。
わざわざありがとうございます。
0542デフォルトの名無しさん
2007/09/11(火) 17:14:33いや・・・
0543デフォルトの名無しさん
2007/09/11(火) 22:57:12アンマネージリソースを安全に管理するために、
SafeHandleクラスを継承しようと思っているんですが、
ReleaseHandleとIsInvalidをオーバーライドするだけでいいんでしょうか
(実際にはCreateToolhelp32Snapshotでプロセスのスナップショットを得たいので、
CriticalHandleMinusOneIsInvalidから継承したハンドル管理クラスを作る)
具体例的に解説しているサイト等あったら教えてください。
MSDNのサンプルには
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
なんて属性もでてきたりするんですが、意味がわからなくて・・・
0544デフォルトの名無しさん
2007/09/11(火) 23:08:300545デフォルトの名無しさん
2007/09/11(火) 23:22:570546デフォルトの名無しさん
2007/09/13(木) 00:18:36だれか答えて!
お願いします
0547デフォルトの名無しさん
2007/09/13(木) 00:25:290548デフォルトの名無しさん
2007/09/13(木) 01:45:04[DllImport("aaa.dll", EntryPoint="FunctionA")]
private static extern uint FunctionA();
で試してみたら実行時に「dllがありません」て返ってきます。
0549デフォルトの名無しさん
2007/09/13(木) 01:53:25exeと同じフォルダにおいてるか?
0550デフォルトの名無しさん
2007/09/13(木) 03:04:310551デフォルトの名無しさん
2007/09/13(木) 05:01:06C++のSTLでいう、setクラスみたいなものです。
0552デフォルトの名無しさん
2007/09/13(木) 08:01:590553デフォルトの名無しさん
2007/09/13(木) 10:52:29>550
すみません。メッセージが間違ってました
「DLL 'aaa.dll'を読み込めません:指定されたモジュールが見つかりません。」
でした。
ちなみにDLLはexeと同じフォルダに置いています。
BCBで作ったプログラムからは呼び出しできます。
0554デフォルトの名無しさん
2007/09/13(木) 12:05:07■ このスレッドは過去ログ倉庫に格納されています