ふらっとC#,C♯,C#(初心者用) Part31at TECH
ふらっとC#,C♯,C#(初心者用) Part31 - 暇つぶし2ch751:デフォルトの名無しさん
08/10/07 21:05:16
全然話の流れが分かってないけど、こういう使い方って問題無い?
こうしろよってのがあれば教えて下さい。

private List<Data> list = new List<Data>();
struct Data
{
    public string Key;
    public string Value;
}

752:デフォルトの名無しさん
08/10/07 21:07:46
>>750
そんな穴に落ちる奴はいないだろ。
入門者を斜め読みしただけで別物と普通は分かるよ。

「参照」って言葉の意味がC++と似てるけど別物だったりするのが落とし穴というのならわかるが、
構造体で引っかかる人間なんていないと思う。

753:デフォルトの名無しさん
08/10/07 21:10:10
struct Data
{
public readonly string Key;
public readonly string Value;
}

こうすべきじゃないかな

クラスまたは構造体の選択
URLリンク(msdn.microsoft.com)

754:デフォルトの名無しさん
08/10/07 21:15:23
リンク先の「変更できない。」という特性を守る場合
KeyやValueの値が可変なら、というか、readonlyだと駄目な状況では
構造体じゃなくクラスを使うべきなんですかね。
Listにクラスを放り込む場合どう書けば???


755:デフォルトの名無しさん
08/10/07 21:25:26
class Data
{
public string Key;
public string Value;
}
こんな感じのクラスを用意して
Data data = new Data();
で初期化して使う感じでしょうか?

756:デフォルトの名無しさん
08/10/07 21:31:58
ジェネリックなコレクションにstructを使う場合の注意としては、
IEquatable<T>.Equals(T o)と、大小比較する場合はIComparable<T>.CompareTo(T o)を実装すること。
そうしないと比較のたびにボクシングが頻発して悲惨なことになる。
もっとも基本配列であるListの場合はあまり問題ない。
実装しないなら非ジェネリックのコレクションの方が効率がいい。
登録時ボクシングは1回だけですむ。

757:デフォルトの名無しさん
08/10/07 21:51:59
>>745

そんなことしたら使い方によってはおっそろしく遅くなるよ

758:デフォルトの名無しさん
08/10/07 21:58:05
>>755

[TypeConverter(typeof(Design.DataConverter))]
struct Data : IEquatable<Data> {
 public string Key { get; set; }
 public string Value { get; set; }

 public override int GetHashCode() {...}
 public override bool Equals(object obj) {...}
 public bool Equals(Data alt) { ... }
 ...
}

namespace Design {
 class DataConverter : TypeConverter { ... }
}


759:デフォルトの名無しさん
08/10/07 22:00:44
>>758
構造体に自動プロパティを使うのは良くない
コンストラクタ書けなくなる

760:758
08/10/07 22:01:42
そいやそうだな、ごめん

761:デフォルトの名無しさん
08/10/07 22:06:00
>>757
さすがに意味がわからない突っ込みだ。
そもそもパフォーマンスが重要な場面に適合的なケースの話はしてないと思うんだけど。

762:758
08/10/07 22:07:04
ん、いや、>>759 は正確じゃないな
こうすれば書ける。自動プロパティやめとけは同意

struct Data {
 public Data() : this() { ... }
}


763:758
08/10/07 22:08:37
ああもう、

struct Data {
 public Data(string key, string value) : this() {...}
}



764:デフォルトの名無しさん
08/10/07 23:28:02
>>751って以下と変わらない気がするのですが、それでも
>>763みたいにするべきなのでしょうか。
private List<KeyValuePair<string, string>> MainList = new List<KeyValuePair<string, string>>();

そもそもがstring同士なので大小比較なども行わないし、私の頭では
どうするのが一番良いのかイマイチ理解できない…orz

765:デフォルトの名無しさん
08/10/07 23:46:17
>>764
・IL 上はだいぶ変わる(バイナリ互換の問題)
メソッドコールかフィールドアクセスになる
コード互換で言えば、ref で渡せるかどうか程度かな

・リフレクションもだいぶ変わる(バインディングで問題)
var props = TypeDescriptor.GetProperties(typeof(Data));
var prop = props["Key"];

・パフォーマンスかなと考えてもメンバ string だし

まとめると、少しでも変更に耐性のあるプロパティにしとけ
みたいな。というかフィールドにする意味ないなぁと
フィールドのほうが「あえて」立場なんだよ要するに

>>758 の例は struct 作るときに標準的にやっといたほうが
いい処理が含まれてる実装ですなただの

KeyValuePair 使うかどうかはそれ(表現したい対象)が
KeyValuePair の機能しか将来的にも持たないんなら
それでいいんじゃね

766:デフォルトの名無しさん
08/10/08 00:04:34
>>719
で引数がList<T>にしてみたんだけど

void hoge( ref List<int> a )
{
List<int> a = new List<int>();
}

767:デフォルトの名無しさん
08/10/08 00:05:54
失礼。

void hoge( ref List<int> a )
{
List<int> a = new List<int>();
}

としてコンパイルしてみたところ

ローカルの変数 'a' をこのスコープで宣言することはできません。
これは、'親またはカレント' スコープで別の意味を持つ 'a' の意味が
変更されるのを避けるためです。

というエラーが返されてしまった。
ref→out
に変更しても同じエラーが返される。
なにかまずいことでもしちゃったかな?


768:デフォルトの名無しさん
08/10/08 00:08:21
参照渡しが値渡しがどうのとか考えるレベルにすら達してないね
ローカル変数の宣言になっちゃってる

769:デフォルトの名無しさん
08/10/08 00:09:12
>>767
{
a = new List<int>();
}


770:デフォルトの名無しさん
08/10/08 00:10:34
>>769
おっ、サンクス(;^ω^)ノシ

>>768
(´;ω;`)ブワッ

771:デフォルトの名無しさん
08/10/08 00:12:46
>>768
ちょっと言い訳がましいことを言わせてもらうとList<T>があまりにも最新の技術なもんで
手持ちの参考書に一言も触れられてないのね。暗中模索状態だからつまらないところで
ミスしてしまう(;^ω^)

ちなみに

a = new List<int>();
           ↑
この()の部分ってコンストラクタの()の名残という認識でok?

772:デフォルトの名無しさん
08/10/08 00:14:35
名残っていうか引数なしのコンストラクタの呼び出しそのもの

773:デフォルトの名無しさん
08/10/08 00:18:42
List<int>もintもStringBuilderも全部型の名前
new StringBuilder()
new List<int>()
ほら同じ

774:デフォルトの名無しさん
08/10/08 00:22:10
List<T>ってC#の短い歴史から考えると全然最新じゃないんだけど

775:デフォルトの名無しさん
08/10/08 00:26:18
C#2.0が出たのって4年くらい前だっけ

776:デフォルトの名無しさん
08/10/08 00:27:03
>>771
ナカーマ

5-6年前に独習C#買って放置→最近また始めたら
ジェネリクスやらLINQやらとんでもないことになっててもうね

777:デフォルトの名無しさん
08/10/08 00:32:32
>>773
int a = new int();
string b = new string();

もokだっけ?

778:デフォルトの名無しさん
08/10/08 00:34:20
>>777
stringは引数なしコンストラクタが存在しないので無理だな

779:デフォルトの名無しさん
08/10/08 00:44:52
FileNotFoundExceptionをToString()で書き出すと

System.IO.FileNotFoundException: 指定されたファイルが見つかりません。
ファイル名 'image\hoge.png' です。

デバッガ上での実行だと、↑みたいにFileNameが出力されるのに
実行ファイルを直接開くと無視されるのね。そんなものなの?

780:デフォルトの名無しさん
08/10/08 00:45:44
>>771
言い訳が言い訳になってないのが滑稽。


781:デフォルトの名無しさん
08/10/08 00:52:39
>>790 自分でFileName出力すれば?

782:デフォルトの名無しさん
08/10/08 00:55:00
>>779
Windowsプロンプトから起動してみたけど
そんな感じのメッセージと一緒にスタックトレースが表示されるよ

783:764
08/10/08 07:50:28
>>765
>>764の書き方だと全然>>751みたいな使い方は出来ないですね。
KeyValuePairって初期化すれば値を割り当てられると思ってました。
>>764は結局>>753と同じだという事が分かりました。

クラスにすると上手く動かないし、>>763を参考にしてみます。

784:783
08/10/08 08:46:30
何度もすいません。
最終的に、クラスにしてKey、Valueのプロパティを持ち、その都度
インスタンスを生成する事で上手くいきました。
今の使い方ではあまりパフォーマンスにも影響は無さそうですが
今後の事を考えてクラスで運用します。
また、値型、参照型の違いが何となく分かった気がします。
有り難う御座いました。

785:デフォルトの名無しさん
08/10/08 10:53:02
C#ってJAVAと同じなの?

786:デフォルトの名無しさん
08/10/08 10:54:25
釣られないぞ

787:デフォルトの名無しさん
08/10/08 11:30:38
釣られてみる
あえて言おう!違うと!
まず名前が違う!これだけでじゅうぶんだ。

788:デフォルトの名無しさん
08/10/08 11:34:19
君と私は名前が違うけど同じ人間だよねえ。

789:デフォルトの名無しさん
08/10/08 11:34:30
JavaとJ++とJ#が同じかどうかとなると哲学なのだが

790:タイマーについて
08/10/08 11:35:13
質問です。タイマーについてですが、普通のWindows.Formsのタイマーを使って
います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編) - @IT
URLリンク(www.atmarkit.co.jp)

ここに書いてあるようなバグはFramework2.0以降は解決されているようでしたが、
タイムアップのイベントが立つたびに、I/Oのメモリー消費がちびっとずつ増えていく
ようなのですが、これはバグなのでしょうか。



791:デフォルトの名無しさん
08/10/08 11:35:37
一括りにすればC#もJAVAもプログラム

792:デフォルトの名無しさん
08/10/08 11:54:12
public PerformanceCounterCategory pcc = new PerformanceCounterCategory("LogicalDisk");

private void GetLogicalDiskRead()
{
this.listView1.Items.Clear();

foreach (string s in pcc.GetInstanceNames())
{
foreach (PerformanceCounter p in pcc.GetCounters(s))
{
if (p.CounterName == "Disk Read Bytes/sec" && p.InstanceName != "_Total")
{
this.listView1.Items.Add(new ListViewItem(new string[]{
p.CategoryName,
p.CounterName,
p.InstanceName,
p.NextValue().ToString()
}));
}
}
}
}

論理ディスクのReadを調べるためにこんなコードを書いたのですが、
エラーも何も無く実行できるものの値がずっと0になってしまいます。
これは何が問題なんでしょうか?


793:792
08/10/08 11:57:49
書き忘れです。タイマーで1秒毎の更新にしています。

private void timer1_Tick(object sender, EventArgs e)
{
GetLogicalDiskInfo();
}

794:デフォルトの名無しさん
08/10/08 12:53:59
>>790
失礼しました、これはタイマーのTickイベントの中で、フォルダの存在を
チェックしていて発生していたようです。メモリの消費量がイベントのたび
に0~5バイトぐらいずつ増えていくのでなんだろうと思いましたが、タイマー
とは無関係でした。すみません。


795:790
08/10/08 12:58:04
>>794
ただ、Directory.Exists(_strDirectory)これを行うたびにI/Oのメモリが
消費されるというのは正常なのでしょうか?


796:デフォルトの名無しさん
08/10/08 13:07:58
>>792
カウンタ毎回取得してたら駄目だろ
欲しいPerformanceCounterを保持しておく

797:デフォルトの名無しさん
08/10/08 13:13:48
C#とJAVAってできることはほぼ同じなの?
動く環境も。

798:デフォルトの名無しさん
08/10/08 13:13:50
>>795
「I/Oのメモリ」って何?

799:デフォルトの名無しさん
08/10/08 13:41:01
質問

VC++みたいな独自のイベントってどうやって実装するんですか?。

VC++ならWM_USER以下にならない様な番号ふってWM_HAGEとか定義して
afx_msgにつけ加え定義
MESSAGE_MAPにつけ加えて
て感じだったと思うんですが
C#ではどうやるのでしょうか


800:デフォルトの名無しさん
08/10/08 13:50:58
取りあえずヘルプでイベントの項目読め


801:デフォルトの名無しさん
08/10/08 15:06:27
WindowProc直接いじるならこれかな。
URLリンク(www.atmarkit.co.jp)

802:デフォルトの名無しさん
08/10/08 15:23:29
>>796
色々と書き直してみてとりあえず動くようにはなったんですが
我ながら何をやってるのかよくわかって無いですorz
変なことやってないですかね?

private List<PerformanceCounter> prfList = new List<PerformanceCounter>();
private void Form1_Load(object sender, EventArgs e){
SetReadInfo();
GetLogicalDiskRead2();
}
private void SetReadInfo(){
foreach(string s in pcc.GetInstanceNames())
{
if (s != "_Total"){
PerformanceCounter p = new PerformanceCounter("LogicalDisk", "Disk Read Bytes/sec", s);
prfList.Add(p);
}
}
}
private void GetLogicalDiskRead2(){
this.listView1.Items.Clear();
foreach (PerformanceCounter x in prfList){
this.listView1.Items.Add(new ListViewItem(new string[]{
x.CategoryName,
x.CounterName,
x.InstanceName,
((long)x.NextValue()).ToString()
}));
}
}

803:デフォルトの名無しさん
08/10/08 16:32:30
つぎのようなメソッドを定義し、(処理1)でエラーが発生したときただちに関数を抜け出すためには
どんな方法を採用するのが推奨されていますか?GOTO文で関数の終わりの方まで一気に
飛ばすのはあまり推奨された方法ではないと聞きました。

void Hoge()
{

・・・・

tyr{(処理1)}
catch{・・・}

tyr{(処理2)}
catch{・・・}

・・・

}

804:デフォルトの名無しさん
08/10/08 16:35:03
>>803
return;

805:デフォルトの名無しさん
08/10/08 16:37:46
>>802
何やってるか分からないてのが一番まずいな

>>803
Microsoft曰く「内部実装なんてどう書こうが知らね勝手にしろ」

806:デフォルトの名無しさん
08/10/08 16:39:41
>>804
こんな感じでいいでしょうか?

void Hoge()
{
・・・・

tyr{(処理1)}
catch{・・・; return;}

tyr{(処理2)}
catch{・・・; return;}

・・・
}

807:デフォルトの名無しさん
08/10/08 16:46:29
>>806
catch{ ... ; throw ...}という手もある

808:デフォルトの名無しさん
08/10/08 17:52:56
C#ってgoto文が実は生き残ってたのかよw

809:デフォルトの名無しさん
08/10/08 18:02:31
>>808
無知なのに上から目線ワロタw

810:デフォルトの名無しさん
08/10/08 18:22:24
下向き限定なら絶対ダメってほどでもないでそ

811:デフォルトの名無しさん
08/10/08 18:24:07
switchで使えるのはいけるかもと思った。まだ使ってないけど。

812:デフォルトの名無しさん
08/10/08 18:32:26
gotoをなくしても break ラベル とか別の文法が増えるだけ。
もう大人なんだからgotoの扱いは自分で責任をもてるだろってこと。
こういう考えでgotoを残してる言語はわりとある。

813:デフォルトの名無しさん
08/10/08 18:33:41
>>807
throw・・・例外を投げるメソッドでしたっけ?
これをそこで使うことにはどういう意味があるんですか?

814:デフォルトの名無しさん
08/10/08 18:40:48
例外投げればとにかく処理は呼び出し元に戻せる
場合によるけど何も考えずreturnよりは適切かも

815:デフォルトの名無しさん
08/10/08 18:45:33
>>814
> 例外投げればとにかく処理は呼び出し元に戻せる

void Hoge()を呼び出した元にもtry&catchの構文を書いて
そこのcatchに例外をthrowするということですか?

816:デフォルトの名無しさん
08/10/08 18:46:56
↑こんな感じでしょうか?

try{ void Hoge(); }
catch(Exception e){・・・・}

↑のcatch(Exception e){・・・・}に例外をスローすればvoid Hoge()を抜けられるという発想ですか?

817:デフォルトの名無しさん
08/10/08 20:18:34
JavaのTreeSetみたいなやつはない?

818:デフォルトの名無しさん
08/10/08 20:34:29
フォルダ名とファイル名のstringを合成してファイルへのフルパスを生成しようと思ってます。

string folder = @"c:\folder";
string file = "test.dat";

string fullPath = folder + @"\" + file;

ここでもし人によってフォルダ名を
string folder = @"c:\folder\";
のように末尾に\マークを入れてしまう人がいるかもしれません。
フルパスを合成する前にフォルダ名の末尾に\マークがあるかないか場合分けする必要が
あるわけですが、C#のクラスにこのあたりの処理を自動化してくれるものはありませんか?

無ければフォルダ名の末尾に\マークがあるかないかで場合分けして対処する必要があります。


819:デフォルトの名無しさん
08/10/08 20:37:16
Path.Combineあたり
できるかは知らないけどその辺に無かったら無い

820:デフォルトの名無しさん
08/10/08 20:47:14
>>819
どうもです。調べてみますノシ

821:デフォルトの名無しさん
08/10/08 20:47:37
ユーザに見せる必要がなければ、\が幾つ並んでも問題ない。
それでも受け付けてくれる。

822:デフォルトの名無しさん
08/10/08 20:50:54
配列のラストが\\なら消す。

823:デフォルトの名無しさん
08/10/08 21:45:13
>>816
そういうこと
抜けるだけならreturnを使うけど、例外の時はthrowを使うという手段もある。
特に、その関数無いでは対処仕切れない場合とか、例外の再throwをすることがある。
string GetMessage()
{   try {...} catch (ry) {  return " tell a lie :p";} }
より
{   try {...} catch (ry) {  throw (new Exception("ごごご、ごめんなさい");} }
のほうが良い


824:デフォルトの名無しさん
08/10/08 21:47:15
>>823
それやるなら、前の例外も付けてやったほうがいいんじゃない?
catch(Exception e) {
throw (new Exception("ごごご、ごめんなさい", e);
}

825:デフォルトの名無しさん
08/10/08 21:53:09
普通のrethrowでいいよ

826:デフォルトの名無しさん
08/10/08 21:56:20
>>825
それもそうだな。ネタを考えてて変なことやっちゃったよ

827:デフォルトの名無しさん
08/10/08 22:21:57
>>797
C#とJavaって言語だけ見るとダメで、
バックについてるのが Microsoft か SUN かという違いを見ないとダメ。

SUN がクソ。

828:デフォルトの名無しさん
08/10/08 22:35:02
Linux等でも普通に動くところがJavaと違うんだよな。
だから、おれんとこでは、クライアントアプリがC#、VBどとねと
でASPXより、Tomcat-JBOSS-Apatchがまだまだ主流だ。。。
業務サーバーとなれば、どうしてもDB+Unix系がまだまだ主流で
顧客に高級感という付加価値があびせれる。
制御系は、以外とWindowsOnlyでいけること多いんでCのDLL
をC#で呼び出す系統のものを提案できるな。

829:デフォルトの名無しさん
08/10/08 22:57:47
>>828

制御の世界でも確かに.netで組む例多くなってきてるな。
ただ、制御もSWもわかる技術者をあつめるのが難しいから
IT側とコントローラ側を分離してるだけで決してwindows オンリーでいける
というわけではない。コントローラ側はむしろ組み込みの世界に近いと思う


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch