[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 04/03 03:17 / Filesize : 222 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2009/06/06(土) 12:30:18 ]
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

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

前スレ

ふらっとC#,C♯,C#(初心者用) Part40
pc12.2ch.net/test/read.cgi/tech/1239599317/

449 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 10:19:43 ]
>>442
>どうしてoverrideという概念があるかというレベルに見えるが
に対しての見解なので

450 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 10:43:36 ]
>>441
ん、んーん?


451 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 10:59:33 ]
overrideがないと、関数名を考えるのが面倒じゃん
MyFunction( )
MyFunction_int(int n)
MyFunction_intint(int n, m)
MyFunction_intstr(int n, string t)
とか、どんどん増える

452 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 11:00:19 ]
overloadと勘違いして奴がいる模様。

453 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:06:15 ]
overloadと勘違いして奴がいる模様。

454 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:13:18 ]
c#の入門用ページ、
どこもコンソールアプリケーションのことしか書いてないんだけど
WIndowsプログラムのこと書いたページで良いとこない?

455 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:16:23 ]
>>454
言語自体の入門ページだと、そりゃそんなもんだろ。
Windows Forms とか WPF でググりなおした方がいいんでは。

あと、コンソールアプリで入門記事書いてるページでも、
1ページくらいは GUI に記事さいてないか?

456 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:18:02 ]
そりゃ、C#の入門であって、.NETでGUIプログラミングをするための入門では
ないから、仕方ないのでは?
前者はもう充分だから、後者に移りたいというのが質問の趣旨?
それとも、前者も後者もいっしょくたにしたいという話?

いっしょくたはおすすめできないぞ。

457 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:29:13 ]
GUIプログラミング=IDEの使い方だし、めんどくさいだろ?作るの。



458 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:38:46 ]
俺はClass personから継承してtaroをつくるとかどうでもいいことじゃなくて
たとえばだが
Form1のx=200,y=300のドットの色を取得して
画面を塗りつぶすとか
そういうことやりたいんだが

コンソールアプリじゃそういうことわからん。
IDEつくるのめんどくさいのか;;

459 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:42:42 ]
>>458
どうでもいいけど
> Class personから継承してtaroをつくる
これは気持ち悪い
taroっていう種族がいるのか…?

460 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:44:53 ]
>>458
class Taro キモすww

それは置いといて、
そういう話の場合、「入門」じゃなくて「サンプル」でググって、
説明読むんじゃなくてコード読む方がオススメ。

461 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:46:01 ]
別に居ても居なくてもどうでも良いな
3年を継承して山田を作るのに山田って組があるのか?とか
マジでどうでも良い

462 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 13:11:29 ]
ちょっと力ぬけよ

463 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 15:40:08 ]
メモリの解放のタイミングについて教えてください。

フォーム上にDataGridViewとComboBox(DropDownListとして利用)、
Buttonがあるとします。
ButtonをクリックするとComboBoxのSelectedIndexによってDataGridViewの
内容が変わります。DataGridViewはReadonlyです。

現在、初期化としてフォームのコンストラクタのInitializeComponent()の後で、
それぞれDataTableを取得して、ComboBoxとDataGridViewにバインドしています。

DataGridViewはReadonlyなので、
using(DataTable dt = …)
{
  // 処理
  dataGridView1.DataSource = dt;
}
と閉じてしまっても問題ありませんが、ComboBoxの方はusingで囲むと値が
表示されません。
その場合、comboBox1.DataSourceにセットしたDataTableはどこでDisposeすれば
良いのでしょうか?

464 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:01:14 ]
Disposeはメモリの解放じゃない
DataSourceとして使用してる間にDisposeしちゃまずいだろDisposeの意味的に考えて
そのDataTableを使わなくなるタイミングだから、大体フォームが閉じるときでいいんじゃね

実用上はDataTableならDisposeする必要もないけどな

465 名前:デフォルトの名無しさん [2009/06/13(土) 16:33:55 ]
>>464
ぐぐって下記のページを見つけて読んできました。
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34497&forum=7

大体理解できました(と思います)。
リンク先もさらに読んできます。

466 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 23:54:15 ]
内容が等しいことを示すにはどうしたらいいでしょうか?

class test{
int a;
int b;
}

test x1=new test();
test x2=new test();

x1.a=10;
x2.a=10;
x1.b=20;
x2.b=20;

if(x1==x2)
//等しいと表示
else
//等しくないと表示

クラスは参照型なので等しくないって表示されちゃうことはわかるんだけど
クラスの内容自体を比較するのはどうやんの?

467 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 23:55:46 ]
IComparer



468 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 01:16:18 ]
>>466
==,!=オーバーライド

469 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 01:19:37 ]
>>466
x1.a == x2.a && x1.b == x2.b
というかそれ、public ないから普通にコンパイルエラーにならんか?

そのクラスを値チックにしか使わないなら Equals とか GetHashCode とか
オーバーライドして operator ==/!= 定義する。IEquatable は・・・この場合は
まぁいいか

470 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 03:19:03 ]
GetHashCodeはオーバーライドしとけ。


471 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 03:52:16 ]
GetHashCodeってどんなときに呼ばれんの?

472 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 04:48:38 ]
Hashtable
Dictionary

473 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 04:48:54 ]
Dictionaryにキーとして放り込む時とか

474 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 13:10:04 ]
列が100、行数が20というデータテーブルを作ってDataGridViewで表示してるんですが、
ボタンをクリックするとテーブルに対してColumns.Addで列数を増やすように作ったんだけど、
なぜか1列増やすごとに1秒ぐらいかかる。
ぐぐったら「Debugは遅い」って書いてあるのを見つけたんでReleaseに変えてみたけど、
それでも0.7秒ぐらいかかってるみたい。

ボタンをクリックしてから画面が更新されるまで、ちょっとタイムラグがあるのが気になるんだけど、
もっと高速に列数を増やす方法はないですか?
マシンはPen4/2.8GHzにメモリ2GBで、極端にマシンが遅いわけでもないと思うんですが。
OSはXP SP3に無料のC#2008 NET3.5です。

475 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 13:11:11 ]
あ、データテーブルの中身はintです。

476 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 13:20:18 ]
追加に時間がかかってるのか、再描画に時間がかかってるのか、
どっち?

477 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 13:59:15 ]
どっちかわかりません。
追加すると自動的に再描画されてしまうと思うのですが、
どうやったら別々に調べることが出来ますか?



478 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 14:04:08 ]
Stopwatchクラスで時間計ってみ

479 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 16:50:00 ]
画像を縦30横30に切り取りたいのですがどうすればいいのでしょうか?><

480 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 16:54:05 ]
>>479
「C# 画像 切り取り」で検索すればすぐに出てくるんだけど

481 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 16:55:14 ]
縦30、横30でコピーすればOK

482 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 16:57:06 ]
>>48 ありがとうです0

483 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 18:24:14 ]
パネルに編集画面を描画(Direct3D)していて、
カメラ位置を移動させるためのスクロールバーを配置したいんだけど、
1発でばしっと縦横スロールバーがつけられるコントロールってありますか?

やっぱり
親パネルの右に垂直スクロールバー配置、アンカーを上下右に設定、
親パネルの下に水平スクロールバー配置、アンカーを左右下に設定、
残った領域にスクロール操作の対象になるパネルを配置、アンカーで上下左右を設定 
みたいにしないとダメ?


484 名前:デフォルトの名無しさん mailto:sage [2009/06/14(日) 21:04:31 ]
パネルってそもそも ScrollableControl 継承してなかったか?

485 名前:デフォルトの名無しさん [2009/06/14(日) 21:45:46 ]
そりゃ中に大きなコントロール入れたらスクロールバー出るけど483の用途には全く適さない

486 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 05:17:28 ]
普通、インスタンス生成するときは

Class名 名前=new Class名();
で生成できるのに

Graphicsクラスのインスタンス生成する際
Graphics gr=new Graphics();
じゃ生成できないのはなんで?
Graphics gr=CreateGraphics();
なら生成できるみたい

487 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 06:30:50 ]
newさせたくないから。幼稚園児に油性マジック渡すようなもの。



488 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 06:50:13 ]
幼稚園児に油性マジック渡したら
キャップし忘れてすぐだめにしちゃうよね

489 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 08:19:14 ]
CreateGraphics()はthis.CreateGraphics()だから。

490 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 08:40:29 ]
つまり、大人の事情でそう決まってるからとしか言いようがない。

491 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 08:54:31 ]
大人の事情っていうと、「仕方なくそうなってる」感じがするけど、
new Graphics() できないのは仕方なくじゃなくて、その方がいい設計だからだろ。


492 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 09:21:22 ]
でもDispose()しないといけないのは何故

493 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 09:55:13 ]
GDIの作法を知らない世代か。

494 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 12:01:20 ]
newとDisposeは対になるものじゃないしね

495 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 12:33:09 ]
Dispose()はC++からのクセだろ
別にしなくてもいいし

496 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 12:51:44 ]
やんなくてもGCが回収してくれるけど、その間リソースを持ち続ける事になるからねぇ

ファイル開こうとしたらいつまでもロックされてる とかよくある。
Closeすればいい?それならDisposeしちゃえよ。

497 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 12:58:16 ]
>>495
ドキュメントにDispose()しろってんだからしろよ<



498 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 13:16:50 ]
> しろよ<
よろしくにみえた

499 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 14:16:34 ]
private void Form1_Load(object sender, EventArgs e)
()内のobject sender, EventArgs eってなんですか?

500 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 14:20:21 ]
イベントの発生元とイベントのパラメータ

501 名前:デフォルトの名無しさん [2009/06/15(月) 14:22:47 ]
Loadイベントに限っていえば意味はない
イベントハンドラの引数の形式を統一するためのダミー

502 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 14:32:36 ]
Windowsアプリケーションを製作しております。
処理に必要なデータ(CSVファイル)を、利用者側から見られないようにしたいのですが
なにか策はありますでしょうか?ご教授下さい。

503 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 14:37:10 ]
System.Security.Cryptographyでも使って暗号化すれば
気休めだけどね

504 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 14:38:30 ]
>>502
PC内に保存するなら簡単に見られるだろ。
見にくくしたいなら暗号化かな。
簡単な暗号でいいならxor暗号で。

505 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 14:45:17 ]
>>502
web上に配置してsslとか

506 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 14:47:43 ]
>>502
エロゲのセーブデータか?

507 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 14:50:33 ]
食いつき良いなお前ら。



508 名前:502 mailto:sage [2009/06/15(月) 14:52:46 ]
>>503
ありがとうございます、調べてみます。

>>504
ありがとうございます。XOR暗号、調べてみます。

>>505
Web上への配置ですか、検討してみます。

>>502
いえ、そういうのではないのですが。
そのファイルを見られてしまうとプログラム内でなにをやっているかがわかってしまうのです。

509 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 15:05:58 ]
ファイルなんか見なくても何してるか丸見えだけどな

510 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 15:21:35 ]
ゲームとかでネタばれになるようなのは隠したいわな

511 名前:502 mailto:sage [2009/06/15(月) 15:25:55 ]
Security.Cryptographyでやってみようと思います。
本当にありがとうございました。感謝します。

512 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 15:27:12 ]
カジュアルハックを防ぐだけならそれでいいんじゃね。

513 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 15:54:28 ]
2次元のHashtableはつくれますか?
hash["abc"]["def"]のような。

514 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:05:19 ]
Hashtable<Hashtable<T>>

515 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:06:45 ]
>>514
ただし2次元ではない

もしくはそういう感じのを作ればおk

516 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:16:41 ]
>>513
hasu["abcdef"]という値をキーにすれば良い

517 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:17:56 ]
商用なら間違いなく仕様バグで訴えられるな。



518 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:18:10 ]
>>516
そうですね、ありがとうございました。

519 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:18:49 ]
>>518
hash["a"]["bcdef"]との違いがわからなくね?

520 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:21:27 ]
実際は

abc = 重複のない3桁の数字
def = 重複のある1〜2桁の数字

なので、>>513さんの意見で大丈夫かなと思ったのですが。

521 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:22:45 ]
すいません、>>513ではなく>>516でした

522 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:36:00 ]
>>520
じゃあそれでいいんでね?

523 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:36:05 ]
>>519
別に汎用でなくてもかまわない。
キーが取り得る値として辻褄が合うように適宜仕様変更すれば良いんだよ。

524 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:38:21 ]
>>523
適宜仕様変更すると汎用になるんでないかい

525 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:38:51 ]
てか、自分でハッシュ関数作ればいいじゃん

526 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:42:36 ]
目的に最適化されたハッシュか、汎用のハッシュか、どっちが高速かと言えば前者だな

527 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:47:04 ]
hash[new {Fst = "abc", Snd = "def"}]
ってできる?



528 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:49:45 ]
>>527
試した?

529 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 16:50:14 ]
>>528
試してない
だって俺C#の文法知らないもん

530 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 17:03:22 ]
はっはっは こやつめ

531 名前:デフォルトの名無しさん [2009/06/15(月) 17:13:00 ]
new Dictionary {{"あ","A"},{"い","I"}}

532 名前:デフォルトの名無しさん [2009/06/15(月) 17:15:30 ]
<string,string>追加

533 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 17:22:05 ]
うわぁ的なことをした人がいる
d.hatena.ne.jp/NyaRuRu/20071211/p3
var dict = Dictionary
(
    x => "foo",
    y => "bar",
    Hauhau => "gaogao"
);
C#3.5以降のはず

534 名前:デフォルトの名無しさん [2009/06/15(月) 17:27:09 ]
わざわざそんなキモいことしなくても531で正解なんだが

535 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 17:28:57 ]
一番軽いのはどーれだ

536 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 17:41:11 ]
>>534
実現方法の一つで正解ってわけじゃないけど
どうでもいいわ

537 名前:デフォルトの名無しさん [2009/06/15(月) 18:00:02 ]
言語に組み込むのは、手段を統一させるため
昔C#のコンセプトについてそんなコメントがあった気がする



538 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 19:48:35 ]
VC#フォームデザイナでメニューを作ったとき、キャプションに
「上書き保存)(&S)」とか入力してからダブルクリックして
メニューの Click イベントを書こうとすると

private void 上書き保存SToolStripMenuItem_Click(object sender, EventArgs e)

ってなるのが気持ち悪くてしょうがないんだけど、
みんなちゃんと飲み込めてるの?


539 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 20:09:18 ]
お好きなようにどうぞ
・実害はないので気にしない
・リネームする
・英語キャプションでハンドラを生成して、後から日本語に変更
・先にハンドラを用意する

540 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 20:35:12 ]
>>513
public struct ComplexKey<X, Y> : IEquatable<ComplexKey<X, Y>>

を作ってみるのは俺だけか?


541 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 21:28:02 ]
is演算子、 as演算子って多用すべきでない?

542 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 21:50:50 ]
キャストと比べても、パフォーマンス的には殆ど同じだから安心して使うといい。

キャストに失敗する可能性がある場合には必ずas,isを使うべき
InvalidCastExceptionをtry-catchするような方法だと桁違いに遅い。

543 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 22:32:18 ]
if (hoge is Foo)
{
Foo foo = (Foo)hoge;
// ...
}
個人的には、上よりは下の方がいいと思うとか、細かいことを挙げたらきりがないけどな。
Foo foo = hoge as Foo;
if (foo != null)
{
// ...
}

544 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 22:49:13 ]
>>541
as演算子のほうがキャストより高速になる場合が多いらしい

545 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 22:55:46 ]
まあそりゃチェックが2回になるからね。
でも、そんな差を気にしなければならないのはよほどタイトな処理の時くらいだし、
普通に書いた時変数のスコープが広がるというデメリットもあるから、
別にどっちでもいいレベルだと思うけどね。

なぜかやたらとここにこだわるやつがいて不思議。


546 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 22:55:48 ]
上は無駄な事をしてる感じなのが気に入らない
下は変数のスコープが気に入らない

scalaのswitchが使えればいいんだけどなぁ

547 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 22:56:34 ]
質問です。
次のような配列があったとして、HighPriceの最大値を求めたいのですが、簡潔に書くにはどう書けばいいのでしょうか?

hoge[0].HighPrice = 1000;
hoge[1].HighPrice = 780;
.(略)
hoge[99].HighPrice = 300;


環境はVisual C# 2008です。よろしくお願いします。

自分で考えたのは、
「int maxにまず初期値1000を設定、あとはforループでまわしてmaxをこえていれば新たにそれをmaxに設定する」
というものですが、もっとスッキリさせられないものかと思ってます。

ちなみに、hoge[0].HighPriceは本日(0日前)の高値、hoge[1].HighPriceは1日前の高値・・・
といった設定。100日間の高値の中で最大値を求めたいんです。



548 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 23:02:07 ]
>>547
LINQ使って
int max = hoge.Max();

549 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 23:11:18 ]
HighPrice メンバみたいだから
int max = hoge.Select((x) => x.HighPrice).Max();
だな






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<222KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef