ふらっとC#,C♯,C#(初心者用) Part25at TECH
ふらっとC#,C♯,C#(初心者用) Part25 - 暇つぶし2ch159:デフォルトの名無しさん
08/03/02 14:14:48
>>152
ネットワークプログラミングやバイナリファイルの読み込みではビットオーダーに気をつけないといけないね。

160:デフォルトの名無しさん
08/03/02 14:15:43
自分で作ったクラスライブラリのファイルを複数のプロジェクトで利用する事は出来ないのでしょうか?。
プロジェクト毎にコピーされるのではなく1つのクラスライブラリファイルを複数のプロジェクトで共有したい。

161:デフォルトの名無しさん
08/03/02 14:17:42
>>158
環境非依存ビットストリームライブラリは欲しいと思うけど、なおnativeは今後の事を考えると問題を引き起こす可能性が高いから止めるべき。
そもそもCom相互運用では処理速度が低下してかえって良くない状態に陥る。

162:デフォルトの名無しさん
08/03/02 14:19:27
>>160
普通にできるよ、追加のところのメニューをくまなく探す

163:デフォルトの名無しさん
08/03/02 14:25:39
>>160
聞く前に検索くらいしろよ。一発で出てきたぞ
URLリンク(www.atmarkit.co.jp)

164:デフォルトの名無しさん
08/03/02 14:37:00
>>162-163
ありがとうございます。追加ボタンの横にある矢印に気付きませんでした。

165:デフォルトの名無しさん
08/03/02 14:37:05
まあ、新興の言語だとビットフィールドを採用しない傾向にあるからね。
intrinsicなビット操作命令は持ってたりするけど。

166:デフォルトの名無しさん
08/03/02 15:03:15
自作板のAHCIスレから来ました。

「iata75_cd.exeに-a -aって起動オプションをつけて走らせる。」
って言われたんですが、-a -aって起動オプションをつけて
走らせるにはどうしたらいいですか?

何か書き換えるためのプログラムが必要なんでしょうか。

167:デフォルトの名無しさん
08/03/02 15:06:54
スレ違いだコマンドラインでググれ低能

168:デフォルトの名無しさん
08/03/02 15:08:17
>>152
GUIの設定(ラジオボタン)とかはよくビットでデータ持つよ

169:デフォルトの名無しさん
08/03/02 15:09:57
>>168
あー、チェックが入ってるか否かを0と1でって感じでしょうか?
bool型とかにしてもそんな問題ない気はするけど実際はそういう話でもないのかな

170:デフォルトの名無しさん
08/03/02 15:13:18
>>169
boolで一つ一つ持つよりも、ビットでまとめて
マスク処理とかした方が分岐させやすい

171:デフォルトの名無しさん
08/03/02 15:16:14
>>167
コマンドラインですか><
了解しますた。

172:デフォルトの名無しさん
08/03/02 15:33:45
iata75_cd.exeでぐぐるとあら不思議w

173:デフォルトの名無しさん
08/03/02 15:34:23
盛大なマルチだな

174:102
08/03/03 01:48:41
>>142
結構便利なので自分でも使い始めたのですが・・・
ダブルチェックドロックングの処理にバグを発見してしまいました、使うならこちらを使って下さい。
前出のコードではマルチスレッドで過負荷をかけると、Dictionary が壊れます。

>>139 氏の意見も取り入れて、ジェネリックにしてみました、実は当初も考えたのですが、
C++のように static 関数からジェネリックなシングルトンとなるオブジェクトを作り出す方法が思いつかなくて、
とりあえず object で実装していましたが、やり方を発見したので実装してみました。
ハッシュテーブルが一つになってさらに高速化したと思われます、またその過程でマルチスレッドバグも取れました。
あと、ハンドルの意味分りません、>>139 氏、説明お願いできますか?

さらに高速化するなら、LINQ のようにアクセス部分をコンパイルして switch 文にしまうか……
それは今後の課題にでもしておきます。
使い方は変わりません。

public class FieldIndexerAttribute : System.Attribute
{
  public int Index { get;set;}
  public FieldIndexerAttribute(int index) { Index = index; }
};

175:102
08/03/03 01:49:31
public static class FieldIndexer
{
  class LookupTable<TSource>
  {
    public static LookupTable<TSource> Instance = new LookupTable<TSource>();
    public System.Collections.Generic.Dictionary<int, System.Reflection.FieldInfo> mapIndexToField;
    public LookupTable()
    {
      mapIndexToField = new System.Collections.Generic.Dictionary<int, System.Reflection.FieldInfo>();
      foreach (var fieldInfo in typeof(TSource).GetFields())
      {
        var customAttributes = fieldInfo.GetCustomAttributes(true).OfType<FieldIndexerAttribute>();
        var count = customAttributes.Count();
        if (count == 0) continue;
        if (count != 1) throw new System.Exception("FieldIndexerAttributeが二つ以上ついているフィールドを発見");
        int key = customAttributes.First().Index;
        if (mapIndexToField.ContainsKey(key)) throw new System.Exception("同じ値の FieldIndexerAttribute ついているフィールドを発見");
        mapIndexToField.Add(key, fieldInfo);
      }
    }
  }

176:102
08/03/03 01:50:11
  public static object GetValue<TDataClass>(TDataClass obj, int index)
  {
    try
    {
      return LookupTable<TDataClass>.Instance.mapIndexToField[index].GetValue(obj);
    }
    catch (System.Collections.Generic.KeyNotFoundException)
    {
      throw new System.Exception("指定のインデックスの設定されたフィールドが存在しなかった");
    }
  }
  public static void SetValue<TDataClass>(TDataClass obj, int index, object value)
  {
    try
    {
      LookupTable<TDataClass>.Instance.mapIndexToField[index].SetValue(obj, value);
    }
    catch (System.Collections.Generic.KeyNotFoundException)
    {
      throw new System.Exception("指定のインデックスの設定されたフィールドが存在しなかった");
    }
  }
}

177:デフォルトの名無しさん
08/03/03 07:10:05
マルチスレッド云々ならば性的コンストラクタ使えばいいじゃん

178:デフォルトの名無しさん
08/03/03 10:24:34
>>170
どんな手順か教えてちょ

179:デフォルトの名無しさん
08/03/03 11:35:54
C#ってswitch文でbreakかかなくてもだーっと全部実行されないの?

180:デフォルトの名無しさん
08/03/03 11:43:27
関数ポインタ使えないだけですごい構文崩れるなぁ

181:デフォルトの名無しさん
08/03/03 11:53:38
>>179
そもそもコンパイルエラー

182:デフォルトの名無しさん
08/03/03 11:53:55
>>179
フォールスルーしたいなら明示的にgoto
caseラベル間が空白でない場合は、break/return/gotoが必要

183:デフォルトの名無しさん
08/03/03 12:55:03
>>178
>>170じゃないけど、たとえば
class MyClass
{
public int X, Y, Z;
public string Str1, Str2, Str3;
public bool flag1, flag2, flag3;
}

class Program
{
static MyClass[] tmp = new MyClass[] {//何か入ってる };
static void Main()
{
foreach (MyClass item in tmp)
{
if (item.flag1)
{
//処理
}
}
}
}
フラグを読んで色々処理を変えたいようなクラスを作ったとする。
運用上、格納するフラグを増やす必要が出てきたときにどうする?
MyClassをライブラリとして作成するような場合、そのライブラリの回収が必要になってくる。
もしフラグ自体をboolじゃなくて例えばintで持っていたとすると、
1ビットに1フラグを割り当てておけばよいから、32種類のフラグを格納できる。
上の例だと、フラグが3つあるということは残り29ビットは予備の領域として確保できる。
運用を変えるだけでフラグを簡単に増やせるようであれば、ライブラリ化してあるMyClassの回収の必要がないので便利。



184:デフォルトの名無しさん
08/03/03 13:11:02
>>178
あとは本題のマスク処理というのは、多分こういうことだと思う。

class MyClass
{
public int X, Y, Z;
public string Str1, Str2, Str3;
public int flag; //ビット単位でフラグを格納
public bool flag1, flag2, flag3, flag4; //全てboolで格納
}

フラグ1と3と4が立っている場合の条件分岐を考える。
boolで各フラグを格納しているクラスを使う場合、
bool f = flag1 && flag3 && flag4;

一方、intで格納しているクラスを使う場合、
int ff = 1 + 4 + 8; //それぞれflag1,flag3,flag4を表す
bool f = (flag & ff) == ff

また、全てのフラグをリセット(false)にしたいときなんかは、
flag1 = false;
flag2 = false;
flag3 = false;
flag4 = false;

intでフラグを格納してあれば当然、
flag = 0;
これだけで済む。

MyClassの中身が複雑になればなるほど、こういう手法は効果的になる。



185:デフォルトの名無しさん
08/03/03 13:12:48
おまえら、そんなにC#でビットマスク使いたいなら、すなおに System.FlagsAttribute を適用した enum 使えゴラー
URLリンク(msdn2.microsoft.com)(VS.80).aspx

186:デフォルトの名無しさん
08/03/03 13:38:10
>>184
なんで148?

187:デフォルトの名無しさん
08/03/03 13:44:28
LINQのある今、ビット操作類もここに統合すると便利かもしれないな
bitvector.All() 指定のビットすべてについて true なら true
bitvector.Any() 指定のビットのなかに true なものがあれば true
はるかに柔軟性があるし。

188:デフォルトの名無しさん
08/03/03 13:45:06
そんくらい自分で

189:デフォルトの名無しさん
08/03/03 13:49:22
>>186
2進数だろカス

190:デフォルトの名無しさん
08/03/03 14:03:49
>>187
BitArrayならOfType<bool>通せば可能だよ
列挙体やBitVectorにも拡張メソッド付けて
flag.ToEnumerable().Anyとかできるようにしたら面白いかもね

191:デフォルトの名無しさん
08/03/03 16:43:20
ひとつのクラスで何行以上はよろしくないみたいなのはありますか?

192:デフォルトの名無しさん
08/03/03 16:48:08
>>191
ない

193:デフォルトの名無しさん
08/03/03 16:56:34
なるほど、ないんですかー
今色々試してみてるところで、ちょこっと場当たり的に作ってみたのですが
1つのクラスは2000行ほどなのに対してもうひとつが200行弱ほどで、その2つのみなのでどうも不自然に感じていたようです

194:デフォルトの名無しさん
08/03/03 17:02:30
あんまり長いのは常識的によろしくないから気になるんだったら切ればいい

195:デフォルトの名無しさん
08/03/03 17:05:43
切るっていうのはpartialってことではないですよね

主要処理部分のswitchが厄介だしここを別クラスにすべきっぽいかな…
ありがとうございました

196:102
08/03/03 17:20:58
適当に長そうなところを、マウスでにるにるっと選択して
右クリック→リファクタ→メソッドの抽出
ってやればいいんだよ

197:デフォルトの名無しさん
08/03/03 17:22:20
その機能はしってるんだけれども抽出してどうするんだろう

198:デフォルトの名無しさん
08/03/03 17:24:04
最近namespaceを
namespace ソリューション名.Properties
にしているんですが
namespace ソリューション名
と違いはあるんでしょうか、普通にやると下になってそれがデフォルトのようですが

199:102
08/03/03 17:25:39
>>198
こらー、何処にいれちょるかー
そこは、アプリケーションプロパティーの居るべき場所じゃー

200:デフォルトの名無しさん
08/03/03 17:26:27
まあ名前空間はほんとにただの名前だからどうでもいいといえばどうでもいい

201:198
08/03/03 17:30:31
最初はソリューション名だけだったけどなぜか途中から切り替えました
たしかコードか何か新規項目を追加したときかな

で、今戻したらエラーが、Propertiesでいいや

202:デフォルトの名無しさん
08/03/03 20:22:54
Enum.GetValuesで得られる値の配列と,
Enum.GetNamesで得られる名前の配列の
要素の順番の対応は保障されてるの?

203:デフォルトの名無しさん
08/03/03 20:38:06
されてるって書かれてなかったっけ?

204:デフォルトの名無しさん
08/03/03 21:43:45
されないよ
同値異名が可能なことを考えれば明らか

205:デフォルトの名無しさん
08/03/03 21:48:21
>>203
謎の日本語だけれど、期待するなと書かれているように受け止められますな

> 解説
>戻り値の配列の要素は列挙定数の値に基づいて並べ替えられます。同じ値を持つ列挙定数がある場合、対応する名前の順序は指定されていません。




206:デフォルトの名無しさん
08/03/03 22:07:43
保障も何もどういう順序づけしていいかわかんないだろ

207:デフォルトの名無しさん
08/03/03 22:51:40
enum Hoge
{
A = 4,
B = 3
}

こんなん書けたよな

208:デフォルトの名無しさん
08/03/03 22:54:56
泉あつの?

209:デフォルトの名無しさん
08/03/03 22:56:46
>>207
書けるんじゃね
続いてCだけを定義すると自動的に4になる

210:デフォルトの名無しさん
08/03/03 23:08:46
すいません
C#でExcelへの書き込みを行ってるのですが、
URLリンク(jeanne.wankuma.com)
このソースコードでExcelの解放が出来たのですが、書き込みをする為に

xlSheet.Cells[1, 2] = "テスト";

この上記の一行を入れたら解放されなくなりました。
何が原因なのでしょうか??
もしくは上記以外でExcelに書き込んで保存する方法はあるのでしょうか?

211:デフォルトの名無しさん
08/03/03 23:11:11
210です!
問題解決しました!!!!!

212:デフォルトの名無しさん
08/03/03 23:11:35
CellsもCOMオブジェクト返すんじゃなかったっけ

213:デフォルトの名無しさん
08/03/03 23:22:51
>>211
どう解決したか書けっつーのカス
書けないなら最初から2chで質問すんな

214:デフォルトの名無しさん
08/03/03 23:23:49
211です。
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheet.Cells);
これを入れたら、なんか解放したりしなかったり・・・
VSの問題???

215:デフォルトの名無しさん
08/03/03 23:24:27
さんざん既出な気がするが回答忘れた

216:デフォルトの名無しさん
08/03/03 23:25:39
211です
// Excel を起動しファイルを読み込む
// ※ Excel ファイルのパスは適宜修正してください
Excel.Application app = new Excel.Application();
Excel._Workbook wb = app.Workbooks.Open(
@"C:\test\test.xls",
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing
);
wb.Application.Visible = false;

// 人口のデータを配列に読み込む
Excel._Worksheet ws = (Excel.Worksheet)wb.ActiveSheet;
ws.Cells[5, 5] = "テスト";
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws.Cells);
// ファイルをセーブし、Excel を終了する
wb.Save();
app.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

これでは解放しない??

217:デフォルトの名無しさん
08/03/03 23:35:33
もう、GC.Collect(); GC.WaitForPendingFinalizers();でいいよ

218:デフォルトの名無しさん
08/03/03 23:41:22
なんで同じロジックで解放したりしなかったりするんだろうか・・・

219:デフォルトの名無しさん
08/03/03 23:46:45
たとえば、
app.Workbooks.Open
ここで、Workbooksが漏れる

wb.Application.Visible = false;
ここでApplicationが漏れる

220:デフォルトの名無しさん
08/03/03 23:52:36
>>219
ありがとう、なんか現象として、cellに入れる値を変えてリビルドすると
解放されるんだけど、すぐにもう一回すると解放されない・・・みたいな

221:デフォルトの名無しさん
08/03/03 23:54:55
220です
すいません。
リビルドでなくデバックです^^;

222:デフォルトの名無しさん
08/03/03 23:56:03
ws.Cells[5, 5] = "テスト"; 
を分解すると
a1 = ws.Cells
a2 = a1[5, 5]
a2.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, "テスト");

でa2の開放がもれている。

223:デフォルトの名無しさん
08/03/04 00:00:02
>>222
すいません。
a1,a2はなんの変数でしょうか?

224:デフォルトの名無しさん
08/03/04 00:00:21
a1も漏れる気がするけど?

225:デフォルトの名無しさん
08/03/04 00:01:27
a1はRangeでa2もRange。

226:デフォルトの名無しさん
08/03/04 00:12:15
>>202
・各要素は列挙定数でソートされる
・列挙定数が同値の要素の順序は不定

Enumとしてはともかく、値だけ見れば対応していると言えるな
列挙定数が同値というのは要するに別名だし

とりあえず、(type)Enum.Parse(type,names[i])==values[i]は真

>>224
開放されてるように見えるが?
念のために補足しておくと、>>216でws.Cells[5,5]も解放しろって話だろ

227:デフォルトの名無しさん
08/03/04 00:21:58
解放はされるようになったが、今度は上書きされなくなった orz

// 1000 ミリ秒 (1秒) 待機する
System.Threading.Thread.Sleep(1000);
xlRange.set_Item(3, 5, "テスト");
System.Threading.Thread.Sleep(1000);
xlBook.Save();

Rangeにはset_Itemしかなく、何か参照が足りないのでしょうか??
Excel.XlRangeValueDataTypeを書いてもエラーが出ます。

228:デフォルトの名無しさん
08/03/04 00:33:15
COMラッパの開放漏れをなくすのには限度があるから、諦めれ

229:デフォルトの名無しさん
08/03/04 00:33:27
ws.Cellsと言った時点でリファレンスカウントが1進むんじゃないの?
だからReleaseComObject(ws.Cells)は、増やして減らして意味ない
文かなーと思ったけど

230:デフォルトの名無しさん
08/03/04 00:35:44
>>229
RCWの参照とCOMの参照カウンタは別。
RCW、つまりマネージ参照をいくらコピーしてもCOMの参照カウンタは増えない。

231:デフォルトの名無しさん
08/03/04 00:38:41
ReleaseComObject(ws.Cells)
は新しいCOMオブジェクトを取ってきてそれを開放するから意味がないだろ。

232:デフォルトの名無しさん
08/03/04 00:39:39
ws.Cellsは同じオブジェクトを返してくれるの?
ExcelのCOMを経由して、あたらしいオブジェクトが2つ、3つとできるんでなくて?

233:デフォルトの名無しさん
08/03/04 00:41:12
URLリンク(jeanne.wankuma.com)
ネスト深すぎテラワロス

234:デフォルトの名無しさん
08/03/04 00:45:36
ExcelのCOMインターフェイスはExcelマクロ(VBAやそれに準じるDLLなど)のための機能で
外部の独立したプロセスからExcelを操作することを意図して作られていない。
VSTOもそういう設計思想。

235:デフォルトの名無しさん
08/03/04 00:50:06
というより単に.NETとCOMの相性が悪い点が見事に現れただけではないの?

236:デフォルトの名無しさん
08/03/04 00:54:02
デストラクタでReleaseComObjectするラッパ被せてusing使うと大分ましにはなるけど、それでも汚いな

237:デフォルトの名無しさん
08/03/04 00:55:07
Office.Netマダー?

238:デフォルトの名無しさん
08/03/04 00:59:00
ふつーのGCみたいに消極追跡(使われていないかを調査)じゃなくて
積極追跡(Excel.Applicationから生み出されたRCWすべてのweakrefリストとか)して
まとめてあぼーん、みたいにはできないものかね?
 まあ、COM一般を対象にするならイマイチつかえない、Office用途な使い方になるけど。

239:デフォルトの名無しさん
08/03/04 01:05:53
タイプライブラリから生成されるアセンブリに手を加えれば出来ると思うよ。

240:デフォルトの名無しさん
08/03/04 02:41:38
こんなコード書くくらいならGCにやってもらう方を選ぶね

241:デフォルトの名無しさん
08/03/04 07:36:08
Comが入り込む場合は、出来る限り開放したら、あとはガベージコレクタを無難なタイミングで起動して解放するほうがいいような気がします。
自分はなんとなく全部書ききってしまってますけど・・・

242:デフォルトの名無しさん
08/03/04 07:38:03


243:デフォルトの名無しさん
08/03/04 08:26:26
なあに?

244:デフォルトの名無しさん
08/03/04 08:30:22
>>174
フィールドハンドルを保持しといて、必要になった時点で
フィールドインフォを取得するやり方のこと。
まあ必ずしもやる必要はないし、
単純な速度的にはやらない方が有利だけどね。


245:デフォルトの名無しさん
08/03/04 09:19:35
XmlSerializerを使った場合、BinaryFormatterでの[OnDeserialized()]に相当する機能はないのでしょうか?
TreeNode.Parentのように、
あるオブジェクトAの内部で持っているオブジェクトBでオブジェクトAをプロパティParentで持っているのですが、
これを復帰させる方法に悩んでいます。
そのままだと循環参照でエラーになってしまうのでParentには[XmlIgnore]をつけてあります。

Deserialize()したあとに再セット用のメソッドを動かせば済むのですが、
オブジェクトAはList<>の中で持っているのでループを回す必要があることもあって、
あまり美しくないのでできれば避けたいのですが、何かいい方法はないのでしょうか?

246:デフォルトの名無しさん
08/03/04 09:34:44
webbrowserコントロールで navigateを同期的に行う方法ってないですかね?

webbrowser.Navigate(url); してDocumentCompletedイベントでDocument拾うと、
コードが分離されてわかりにくいし、遷移先のページごとにあれこれ処理変えたい
場合、複数のイベントハンドラメソッドを定義して イベントにアタッチ、デタッチを
繰り返さないといけないので、ロジックがスパゲッティになっちまうんですが…。

webbrowser.Navigate(url)
while(webbrowser.IsBusy)
{
}
でループ回しても、Documentが読み込まれていないタイミングのこともあるんで
いまいち信用ならないんですが、IsBusyプロパティ以外になんか判定タイミング
ってあるんでしょうか?

247:デフォルトの名無しさん
08/03/04 10:01:56
.NETの機能を色々試してみようと思い、身近そうなFileやDirectory関係を使ってみていて疑問に思ったことがあります

foreach (string file in Directory.GetFiles(dir))
{
 try
 {
  File.Copy(file, destpath, true);
 }
 catch
 {
  continue;
 }
}

以上のように、複数ファイルをforループで回してコピーや削除を行っています
そこで、エラーは表示しなくていいのでコピーや削除でエラーが出たら飛ばしたいなと思い
コピーまたは削除処理にをtryで囲み、catchしてcontinueするという風にしています。

まず、コピーや削除が失敗することがあるのか(File.Copy、File.Delete等)
次に、私が上記で示したようにtryで処理を囲みcatchでcontinueするような処理が一般的なのかどうか
次に、出した例ではstringで処理していますがFileInfoなどを利用してみてもいます。
FileInfoを使うことで、他の質問にある答えが変わる場合それも教えて頂きたいです。
最後に、trycatchで処理部分を囲んでいるとして、それをループしています(そこがおそらく一番時間かかる主要処理)
その際、処理速度の低下などは気にするほどあるのでしょうか?

以上です、よろしくお願いします

248:デフォルトの名無しさん
08/03/04 10:22:16
>>246
>遷移先のページごとにあれこれ処理変えたい場合、
>複数のイベントハンドラメソッドを定義して イベントにアタッチ、デタッチを
>繰り返さないといけない

が理解できないが
イベントハンドラ内で分岐すりゃいいだけじゃね?
IsBusyループはあほかって感じ


>>247
>まず、コピーや削除が失敗することがあるのか
当たり前だが、ある。

>tryで処理を囲みcatchでcontinueするような処理が一般的なのか
エラー処理でどんな処理をしたいかによる
一般にcatchで握りつぶすのはよくないが、ファイル操作のときは
仕方ないときもある

>FileInfoを使うことで...
同じ。Fileの静的メソッドは内部でFileInfo使ってる

>trycatchの処理速度の低下
tryはコスト高くない。catchが発生した場合は高コスト
ディスクIOの方が重いだろうけど

249:デフォルトの名無しさん
08/03/04 10:24:58
>>247

> まず、コピーや削除が失敗することがあるのか(File.Copy、File.Delete等)
ありますね。destpathが無効だったり、アクセス許可が無かったり、ファイルがロックされていたり
destpathが既に存在したりしていれば失敗します。

> 次に、私が上記で示したようにtryで処理を囲みcatchでcontinueするような処理が一般的なのかどうか
この例でcontinueがいるとは思えないですが…。。。

> 次に、出した例ではstringで処理していますがFileInfoなどを利用してみてもいます。
> FileInfoを使うことで、他の質問にある答えが変わる場合それも教えて頂きたいです。

同じだと思います。

> 最後に、trycatchで処理部分を囲んでいるとして、それをループしています(そこがおそらく一番時間かかる主要処理)
> その際、処理速度の低下などは気にするほどあるのでしょうか?

try-catchでも例外が起きない限り、ほとんどコストはかからないと思います。
逆にコストが問題になるほどしょっちゅう例外が起きるなら、ロジックを見直すべきだと
思います。

ファイルがらみの例外は種々雑多なので例外処理のコストを嫌ってすべて条件判定
で処理しようとしても、労多く益は少ないと思いますが。

250:デフォルトの名無しさん
08/03/04 10:35:19
>>248

二つや三つの場合分けならいいんですが、たとえば
Aページでフォームに自動記入してBページに飛んで、そこでなんか情報取って
さらにCページへ飛んで、サーバ側やクライアントスクリプト、activeXコンポーネント等で自動
ジャンプさせたのを判定して…Dページでまたフォームを記入して………
などと一連の動作を自動化することを考えると、条件分岐が異常に深くなってしまって、
それはそれでものすごく読みにくいんですわ。

素直にwebclientで同期的にダウンロードしてHTML独自に解析しろって言われそうですが、
ページでスクリプトやらactiveXコンポーネント使っているとお手上げなもんで、どうしても
DOM操作して人間の動作をエミュレートしたいときがあるもんで…。

251:デフォルトの名無しさん
08/03/04 11:14:03
>>250
よくわからんけど、

abstract class Base {
public abstract void やること();
}
class 処理A : Base{
public override void やること() {
.....
}
}
class 処理B : Base{
public override void やること() {
.....
}
}

みたいにそれぞれの処理用のクラスを定義して、
Navigateする前に該当する処理クラスのオブジェクトを作って、

private Base 今の処理

みたいに保持しておいて
DocumentCompletedで

今の処理.やること()

みたいにすればすっきりするんじゃね?

252:247
08/03/04 11:15:49
>>248
>>249
ありがとうございます。
trycatchはコストが低いということが聞けて安心しました
もし、以下の処理だけならcatch{}だけでよかったですね、反省
foreach (string file in Directory.GetFiles(dir))
{
 try
 {
  File.Copy(file, destpath, true);
 }
 catch
 {
  continue;
 }
}

253:デフォルトの名無しさん
08/03/04 11:16:16
明示的にcatch{}ってしなくていんじゃないの、その例なら

254:デフォルトの名無しさん
08/03/04 11:26:18
catch{}はしなきゃだめだっての
continueはいらんっちゃいらんけど

255:デフォルトの名無しさん
08/03/04 11:28:46
まあcontinueって書いてても悪くないと思うけどな

256:デフォルトの名無しさん
08/03/04 11:36:53
MSDNに書いてある例外くらいは事前にチェックして発生させないようにしとくべきだろ
キャッチはどっちみち必要だけど

257:デフォルトの名無しさん
08/03/04 11:48:31
ある程度の事前チェックは必要だと思うけど、どうせ中でチェックして起きた例外をcatchするんだから、
事前に全部チェックしてたら二重になって遅くなりそうだし面倒くさいから俺はやらねえ。

258:デフォルトの名無しさん
08/03/04 14:39:24
>>255

ここではたまたまcontinueがループの最後にきてるから良いけど
continueは後無視してループの頭に戻っちゃうから、場合によっちゃまずくないですか?

259:デフォルトの名無しさん
08/03/04 14:39:47
先物チャートと検証ソフトを作りたいのですが、
C#のフォームとグラフィックを扱った書籍を教えていただけないでしょうか?
MDIでの開発の仕方が載っているものがあると助かります。

以前はDelphiを数年バリバリに使っておりましたので、
プログラミング初心者というわけではありません。

260:デフォルトの名無しさん
08/03/04 14:40:14
> C#のフォームとグラフィックを扱った書籍を教えていただけないでしょうか?
C#のフォームとグラフィックを扱った書籍のお勧めを教えていただけないでしょうか?

261:デフォルトの名無しさん
08/03/04 14:43:07
>>251

えっと 出していただいた例を今ひとつ理解し切れていない自分ですが、

たとえば、wb_documentcompletedでdocumentを取得して
その中のformをinvokemenber("submit")したりすると、次にやるべき処理の
クラス(baseの子クラス)を設定する場面が無いと思うんですが…。

wb.Navigateを呼び出したルーチンには戻らないでそのまま再びdocumentcompletedに
とんでっちゃうわけで…。

262:102
08/03/04 18:54:07
>>244
すみません、後学のために教えていただけますでしょうか、フィールドハンドルって何ですか?
知らない知識がまだまだあるみたいです……

263:デフォルトの名無しさん
08/03/04 18:56:19
>>258
なんでそういう解釈されたか意味不明

264:デフォルトの名無しさん
08/03/04 18:59:05
>>263
ちゃんとレス辿ってないだけでしょ、彼が

265:デフォルトの名無しさん
08/03/04 21:30:42
すみません、プログラミング自体の経験は過去にDelphiを少し触って挫折したような者です。
しかし、ひとつ作ってみたいプログラムのアイディアが浮かんだので、
これからC#で作ろうかと思っているのですが、なかなか指針すら立ちません。
どのような設計をすればよいのかアドバイスをお願いいたします。

何を作るのかというと、睡眠日誌というものがあるのですが・・・↓
URLリンク(www.kaimin.info)
これを実現するようなアプリを作りたいのです。どうすればよいでしょうか?

266:デフォルトの名無しさん
08/03/04 21:42:03
睡眠障害のある俺にぴったりじゃないか。
作るかな。
ネタ提供サンクス。

267:デフォルトの名無しさん
08/03/04 22:00:08
>>265
まず書いて動かすこと
動かせる範囲のものを書くこと
はじめからちゃんとしたものを作ろうとしないで一部分だけでいいからちゃんと動かす
うまく行かなくなったら何度も書き直す
それがうまくやるコツ

268:265
08/03/04 22:02:27
>>266
なんとありがたい!
あまり突っ込むとスレ違いになりますが、私自身過眠症で必要に迫られてのことで。ぜひともお願いいたします。
後学のため、よろしければどのような感じで作るかの指針をお教えいただけませんでしょうか?

269:265
08/03/04 22:06:56
>>267
なるほど。一度イメージするUIを紙に書いて、
自分なりにどの部位からコード化していけそうか考えてみます。
アドバイスありがとうございます。

270:デフォルトの名無しさん
08/03/04 22:37:48
>>264

いや、逆にcontinue書かなきゃいけない理由が知りたいですけど

271:デフォルトの名無しさん
08/03/04 22:44:54
>>270
むしろ後に何か書き加える場合にcontinueがないとぶっ壊れるだろ
形としてはここにcontinueがあるべきで、今必要ないからといって
削除しなきゃならないというものでもない

272:デフォルトの名無しさん
08/03/04 22:46:10
public bool IsMarked(object obj)
{
// この部分
}

上記のコメント部のなかで、
引数のobjが宣言時に特定の属性をつけられたかどうかを判別する方法はありますか?
たとえば
[Marked()]object a;

void Test()
{
if(IsMarked(a))
{
Console.WriteLine("True");
}
}

みたいなことができれば満足です。
詳しい方がたくさんおられるようなので、宜しくお願い致します。

273:デフォルトの名無しさん
08/03/04 22:47:45
過眠症なんて病気があるんだw
なんか最近の医者って新しい病気作るのに必死だよな。

274:デフォルトの名無しさん
08/03/04 22:48:30
>>272
それは属性の使い方が間違ってる

275:デフォルトの名無しさん
08/03/04 22:59:11
属性はインスタンスには付かないぜ

276:デフォルトの名無しさん
08/03/04 23:11:27
>>274
>>275
ありがとうございます。
納得しました。

277:デフォルトの名無しさん
08/03/05 00:28:15
>>271
> むしろ後に何か書き加える場合にcontinueがないとぶっ壊れるだろ
追加実装の場合は、単なるコーディングミスだろ・・・

> 形としてはここにcontinueがあるべきで
ないべき。
使用しない、意味の無いコードは書いてあっても利益にならない。
なんで使わない変数とかが警告出るか考えろよ。

278:デフォルトの名無しさん
08/03/05 00:29:56
じゃあifの中が一行しかないのに{}でくくってあったら消すのか?

279:デフォルトの名無しさん
08/03/05 00:35:35
>>278
ちゃんとレス読んでから書け、読んでてそれなら半年ROMれ。
>>247だとfor文の最終行にcontinueつけてんのと同じ事。

280:デフォルトの名無しさん
08/03/05 00:44:46
>>279
同じことだろうが
実行結果に関わらない、単に無駄なだけのコードだ
それに意味があると考えるか考えないかはお前の主観でしかない
ifを{}にいれておくのが望ましいといわれるのは、そこに何か追加することがあるからだ
あのコードは下に追加される可能性が大いにある
その意味ではあのcontinueには意味がある
elseがいらなくてもelseと書いた方が分かりやすいこともある
ケースバイケースだ

それはそれとしてC#ではfor文の最後にcontinueを書かなきゃならなくなることもよくあるぞ

281:デフォルトの名無しさん
08/03/05 00:47:14
>それはそれとしてC#ではfor文の最後にcontinueを書かなきゃならなくなることもよくあるぞ
いいえ

282:デフォルトの名無しさん
08/03/05 00:48:41
静的コンストラクタが呼ばれるのは

>最初のインスタンスが作成される前、または静的メンバが参照される前

と書いてありますが、複数スレッドから同時にアクセスした場合でも正常に動作するのでしょうか?

283:デフォルトの名無しさん
08/03/05 00:49:32
gotoのラベルがfor文の最後に来る場合、ラベルの下にcontinueを書く必要がある
なんでそうなってるのかといえばラベルがforの最後にあるより、その下にcontinueがあったほうが
意味がはっきりするからだろう

284:デフォルトの名無しさん
08/03/05 00:52:24
>>280
bool flg = false;
if (flg) {
} else {
 ・・・
}
こんなコード書いちゃう人?

285:デフォルトの名無しさん
08/03/05 00:54:13
>>284
それはわかりにくいだろう
if(flg == false)
と俺は書くな

286:デフォルトの名無しさん
08/03/05 01:11:51
俺なら
if ( ! flg ) {
//・・・
}
って書くぜ。
っていうかたまに flg == false とか flg == true って書き方みるけど変じゃね?

287:デフォルトの名無しさん
08/03/05 01:18:00
if(flg == false)は
普通に左から読んでいけば
もしフラグがfalseならば、
と読める
!flgは頭の中で変換しなきゃならない
flgがよっぽど何のことか分からない名前でなければ==trueとも書かないな
しかし変数名がflgだったら==trueと書くかもしれない

288:デフォルトの名無しさん
08/03/05 01:32:30
!flg程度で頭動かさなきゃならんのは駄目だろ

289:デフォルトの名無しさん
08/03/05 02:21:11
>>271

ちょっとだんだん意味わかんなくなってきたんですけど、
もしかしてcontinueの意味取り違えてません?

あとに何か書き加えたときにcontinueあったら、「後に書き加えた何か」
無視して、次の反復処理に制御を移動されちゃうと思うんですが…。

break→以下無視して反復処理抜ける
continue→以下無視して 次の反復処理へ移動

だと思ってましたが、違いましたっけ?

290:デフォルトの名無しさん
08/03/05 02:30:41
>>289
何を言っているのか分からないが
後に書き加えた何かは、例外で失敗した後には実行されないものだ
そしてそれはtryブロックの後ろに配置されるべきものだ
全部をtryで囲んで全てをキャッチするというのは悪いコーディングだ

291:デフォルトの名無しさん
08/03/05 02:32:26
>>289
もう相手すんな

292:デフォルトの名無しさん
08/03/05 02:48:52
>>283
}の直前など、対応するコードの無い部分にラベル付けられないからだろ
どうしてもラベル付けたいなら、普通は空ステートメントを書く

>>284-288
if(flg == true)と書くやつは、何故if((flg == true) == true)あるいは
if((((flg == true) == true) == true) == true)と書かないのか
という指摘を見たことがあるな

293:デフォルトの名無しさん
08/03/05 03:00:03
>>292
空ステートメントなんていう異様なものを書くよりは、continueの方がずっと分かりやすいだろう
ちなみにCにはこんな制限はない。C#にわざわざ加えられたものだ。
おそらくcontinueと書かせるためだろう

>f(flg == true)と書くやつは、何故if((flg == true) == true)あるいは
>if((((flg == true) == true) == true) == true)と書かないのか

意味が伝わりにくくなるからだな
プログラムにとって大事なのは意味が伝わりやすいことであり
文の量が最小になることではない

294:デフォルトの名無しさん
08/03/05 03:01:10
>>290

例外で失敗した後には実行されないものはtryブロックの中に入れるべきで

>全部をtryで囲んで全てをキャッチするというのは悪いコーディングだ
とは全然無関係ですよ。

295:デフォルトの名無しさん
08/03/05 03:02:52
flgっつう名前が悪いだろ

bool isHogehoge
なら

if( isHogehoge )

と書いても違和感はない

296:デフォルトの名無しさん
08/03/05 03:09:48
>>294
それでは例外で失敗しなかった後に実行された文で起こった例外まで無差別にキャッチする
それはバグを握りつぶしてしまう
よくないコーディングだ

297:デフォルトの名無しさん
08/03/05 03:35:54
continue より flg の話が気になるな
まず flg という名前が論外で、if ... の ... に配置して意味が通るような名前を付けて、flg==true だの flg==false だのは今すぐ止めるべきと思うな
それが「プログラムにとって大事なのは意味が伝わりやすいこと」になるんだと思うよ。

298:293
08/03/05 03:39:42
>>297
全く同感だ

299:デフォルトの名無しさん
08/03/05 03:40:54
>プログラムにとって大事なのは意味が伝わりやすいことであり
>文の量が最小になることではない
まったくもって同感だが、ロジックの複雑さは最小にすべきだ。

300:292
08/03/05 04:36:35
>>293
continueを書くかどうかは好みの問題だから議論する気はないが、
「continueと書かせるため」というのは誤解を招くので

ラベルの後にステートメントが必須なのはC++からで、
一応、仕様ではlabeled statementということになっている
単にラベル単独では存在し得ないというだけのこと

301:デフォルトの名無しさん
08/03/05 04:40:14
>>283
ラベルは命令文の前に書く必要がある。命令文は空文でも良い。
for ( .. ) {
 ....
 label_1: ;
}
でOK。

302:デフォルトの名無しさん
08/03/05 06:47:59
DataGridViewでのコンテキストメニューの抑制ができなくて困っています。
自作のコンテキストメニューではなく、標準というかShell(?)のコンテキストメニューです。

DataGridViewTextBoxColumn、DataGridViewTextBoxCellでセル選択後に
カーソルがあたった状態で編集可能になったときに
右クリックすると、このコンテキストメニューが出るのを抑えたいのです。

通常のTextBoxでは
TextBoxのContextMenuStripに、空のContextMenuStripを設定するなり
新しいContextMenuStripのインスタンスを(newする)設定するなりすれば
抑制できるとことまでは判明して、実行できているのですが
DataGridViewの場合に、同様の制御をするための実装方法がわからないのです。

ご存知の方、お教えください。

303:デフォルトの名無しさん
08/03/05 06:48:34
ifでの条件文の書き方についてのノウハウはCとC#で違うから混同すると議論が噛み合わない。
C++には論理型があるがCとの互換のために穴だらけだから結局Cと同じになる。
一方C#のifには条件文しかかけないし、論理型は単独で条件文たりえる。


304:デフォルトの名無しさん
08/03/05 07:05:06
>>302
EditingControlShowing とか

305:デフォルトの名無しさん
08/03/05 07:49:18
文字列をデータとしてファイルに保存してあとで読み込みたいと思っています。
文字列の構成は、9つの行と、行数不定の項目です。
その構成を一つのかたまりとしてたくさん扱いたいのですが、どうしたらいいんでしょうか?

306:デフォルトの名無しさん
08/03/05 08:23:00
C#というのはどういった場面で使われるんでしょうか?Windows環境で動くソフトウェア全般だとは思うのですが
実際本職の方達はC/C++ベースで作ってそうですし

いまいちピンとこないです

307:デフォルトの名無しさん
08/03/05 08:31:32
>>305
CSVでもXmlSerializeでもいいんじゃないかと。
>>306
ASP.NETとか?

308:デフォルトの名無しさん
08/03/05 08:49:49
>>297

flgの話は 命名法の問題は同意 その先 ==trueとするかどうかは趣味の問題。


>>296
continue書かないなら正解。
continueなんてせっかくの例外処理の構造化をわざわざ壊すようなもんをどうしても
書きたいなら不正解だろ。

309:デフォルトの名無しさん
08/03/05 09:40:47
>>262
RuntimeFieldHandle
フィールドを一意に識別出来るハンドル。
識別という意味では、FieldInfoに1対1で対応している。
RuntimeFieldHandleとFieldInfoは相互に取り出すことが出来る。

FieldInfoなどのオブジェクトはサイズが大きいため、
常に使い続ける必要がないものはRuntimeFieldHandleで保持しておき、
実際に必要になった時点でRuntimeFieldHandleからFieldInfoを取得する。
こうするとFieldInfoがGC対象となり、頻繁に使われないものはメモリを占有しなくなる。


310:デフォルトの名無しさん
08/03/05 10:25:56
>>306
いやいや、中小企業で使ってる業務システムには、VisualBasicが多いよ
Cで組んだシステムの方が珍しい。
大企業みたく開発費をかけたくないし、開発期間も短くしたいし、保守性を容易にしたいし、
負荷も少ないしリアルタイム性も求められない用途は多いから。
C#はVisualBasicよりいいし、そういう方面にも使われる


311:デフォルトの名無しさん
08/03/05 10:34:38
>>307
>>310
なるほど…
来年度から就職でして、使うのかなぁといった感じで質問しました。
C/C++をやりつつC#に手出してて最近はWinAPI関連の本買って手出し始めたので
ちょっと気になりました、ありがとう



312:デフォルトの名無しさん
08/03/05 10:35:48
どんな分野?それによるからなぁ、逆に低級言語ばっか使うとこもあるし

313:デフォルトの名無しさん
08/03/05 10:38:04
>>312
そこら辺が明確に教えてもらえてなくって(使う言語とか)
一応エンジニア業と営業のそれを両方出来る人材を…って感じで募集されてて
会社自体は自動車会社のシステム部門です

314:デフォルトの名無しさん
08/03/05 10:39:17
お前らそういう話大好きだな

315:デフォルトの名無しさん
08/03/05 10:53:19
>>313
だったら、営業の顧客管理表をC#でちゃちゃっと作ったり
(たいてい、個人が自分の机のPCでエクセルでちまちまやってるから、
活用するときに面倒だったり、顧客表の流出する可能性があったり、
各営業間で共有が出来てなかったり等々。システムを作れば、
顧客の誕生日一週間前にポップアップさせてみたり、
車検前や12ヶ月点検前にポップアップさせてみたり、いろんな活用も出来る)。
また、営業所とエンジニア部門とをLANで結んだ連絡システムを作ったりにも使えるだろ。
stand-aloneなシステムを手早く作るのにも、
離れた部門をLAN経由で結んだシステムにも、C#は向いているし。

316:デフォルトの名無しさん
08/03/05 11:02:40
文字列に指定の引用符を付けたり(Quote)、外したりする(Dequote)メソッドはないでしょうか?


317:デフォルトの名無しさん
08/03/05 11:11:46
>>316
ごめ質問が理解できないので具体例をあげて

>>313
続けたいならあとはマ板でたのむ


318:デフォルトの名無しさん
08/03/05 11:24:17
>>316です。
ええと。例えば、文字列ABCにダブルクォート"の引用符を付けると、
"ABC"、文字列DE"Fに付けると、"をエスケープ?して、"DE""F"にする
ようなメソッドです。Dequoteはその逆の操作です。



319:デフォルトの名無しさん
08/03/05 11:25:02
class = new class();
このclassに後から変数を追加するなんて暴挙はできないでしょうか?。

320:デフォルトの名無しさん
08/03/05 11:33:26
>>318
それくらい自分で作れば

>>319
無理
classのオブジェクトをキーにしたDictionary使うとか

321:デフォルトの名無しさん
08/03/05 11:57:01
初めまして。
C# 2008 Expressを使ってます。
OpenFileDialogで、画像を選択した際にdialogのウィンドーにプレビュー画像を表示したいのですが、
いったいどうすればいいのでしょうか。

322:デフォルトの名無しさん
08/03/05 12:00:53
>>304
ありがと。
それでなんとかなりそうです。

323:デフォルトの名無しさん
08/03/05 12:03:02
ボタンにUACのシールドアイコンを付加しようとしているのですが、
VS2005なので SystemIcons.Shieldが利用できません。

なので、APIから行おうとしたのですが、

internal class WinAPI
{
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
extern public static IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wp, IntPtr lp);
}

WinAPI.SendMessage(Target.Handle, (UInt32)0x160c, IntPtr.Zero, (IntPtr)1);

としてもシールドアイコンが表示されません。
何か間違ってるのでしょうか?

324:321
08/03/05 12:05:32
追加でごめんなさい。
↑の件ですが、「縮小版」ではなく、クリックしたときにパッと表示してほしいんです。

あと、openFileDialogには大きさのプロパティがありませんが、
実行時にはマウスでドラッグして大きさが変えられますよね。
プログラム上で自動で変更できるんでしょうか。

325:デフォルトの名無しさん
08/03/05 13:10:17
>>307
ありがとうございます。
XmlSerializeでなんとか出来そうです。

326:デフォルトの名無しさん
08/03/05 13:29:52
>>321>>324
つまり、OpenFileDialogを拡張したいということだろ
結論から言うと、Win32API使わないと無理
cf. URLリンク(msdn2.microsoft.com)

327:デフォルトの名無しさん
08/03/05 13:34:58
試しに>>174をDynamicMethodでif…else if…相当のコードを生成して
毎回リフレクションを使わないようにしてみたら10倍くらい速くなった
もっと速くなると思ったんだけどなあ

328:321
08/03/05 13:43:14
>>326
ありがとうございます。
敷居が高そうですね・・。もう少し慣れてから挑戦してみます。

329:デフォルトの名無しさん
08/03/05 14:59:10
>>327
if else は、フィールドの数が増えると遅くなるんじゃねえの、使うならswitchだろ。

330:デフォルトの名無しさん
08/03/05 15:19:44
どっちもJITコンパイルされれば同じだと思うのだが

331:デフォルトの名無しさん
08/03/05 15:45:36
switchは遅くならないのかよっ

332:デフォルトの名無しさん
08/03/05 15:50:58
>>331
若干最適化は効きやすいとされる。


333:デフォルトの名無しさん
08/03/05 16:13:40
>>330-332
おまいら今すぐC言語のスレで、コンピュータの基礎を勉強しやがれ

334:デフォルトの名無しさん
08/03/05 16:27:33
この場合アセンブラだろ
お前も基礎を勉強しやがれ

335:デフォルトの名無しさん
08/03/05 16:29:17
>>334
違うだろ、テーブルルックアップ式 goto label の勉強だ

336:デフォルトの名無しさん
08/03/05 16:29:20
>>327
FieldIndexerAttributeにAttributeUsage(Attribute)付けるといいかもと思った
あと、>>139の言ってるのは多分FieldInfo.FieldHandle/GetFieldFromHandleの事

>>329-332
以下、MSIL生成する言語に限った話しなのでそのように
疑問があれば逆アセンブル(ildasm.exe)してみればいい

判定するのが連続した整数値じゃないときはswitchもif~elseも大差ない
比較部分は同じで処理部分がサブルーチンかスパゲッティかって感じ

連続した整数値があれば(一部でも可)switchではその部分がまとめられる
MSILから先は分からないが、多分ジャンプ先を数値的に計算してるんだと思う

337:デフォルトの名無しさん
08/03/05 16:34:21
switchを逆アセンブルしてみると、if,elseとgo,labelの組み合わせだよ

338:デフォルトの名無しさん
08/03/05 16:39:46
値が連続したところは>>336の言うように纏められるよ
あれ手でやるのは面倒

339:デフォルトの名無しさん
08/03/05 16:49:22
class A
{
// ildasm.exe
static void Main( string [] arg )
{
System.Console.WriteLine( arg[0] ) ;
switch( (int)arg[0][0] )
{
case 0 : System.Console.WriteLine( 'A' ) ; break ;
case 1 : System.Console.WriteLine( 'B' ) ; break ;
case 2 : System.Console.WriteLine( 'C' ) ; break ;
}
}
}

340:デフォルトの名無しさん
08/03/05 16:50:36
.method private hidebysig static void Main(string[] arg) cil managed
{
.entrypoint
// コード サイズ 66 (0x42)
.maxstack 3
.locals init (int32 V_0)
IL_0000: ldarg.0
IL_0001: ldc.i4.0
IL_0002: ldelem.ref
IL_0003: call void [mscorlib]System.Console::WriteLine(string)
IL_0008: ldarg.0
IL_0009: ldc.i4.0
IL_000a: ldelem.ref
IL_000b: ldc.i4.0
IL_000c: callvirt instance char [mscorlib]System.String::get_Chars(int32)
IL_0011: stloc.0
IL_0012: ldloc.0
IL_0013: switch (
IL_0026,
IL_002f,
IL_0038)
IL_0024: br.s IL_0041


341:デフォルトの名無しさん
08/03/05 16:51:27
IL_0024: br.s IL_0041
IL_0026: ldc.i4.s 65
IL_0028: call void [mscorlib]System.Console::WriteLine(char)
IL_002d: br.s IL_0041
IL_002f: ldc.i4.s 66
IL_0031: call void [mscorlib]System.Console::WriteLine(char)
IL_0036: br.s IL_0041
IL_0038: ldc.i4.s 67
IL_003a: call void [mscorlib]System.Console::WriteLine(char)
IL_003f: br.s IL_0041
IL_0041: ret
} // end of method A::Main
このスレは息を吸うようにウソをつく奴が居るので注意が必要だ

342:デフォルトの名無しさん
08/03/05 16:55:09
まあ、間違いもあるだろうからそんなわざわざ相手逆なでするような言い方する必要はないと思うけど。

結局、IL レベルで switch 命令ありで、
JIT 時に if-else 式かテーブルルックアップ式かで最適な方選択ってこと?

343:デフォルトの名無しさん
08/03/05 16:57:31
間違いっつーか、これプログラマなら常識だろ?

344:デフォルトの名無しさん
08/03/05 17:04:55
自分の常識を人に押し付けるもんじゃないけど、
その常識ってのは、
MSIL が switch 命令を持ってるってのの方か、
一般に switch はルックアップテーブル使って高速化可能って話の方か、どっち?

345:デフォルトの名無しさん
08/03/05 17:07:01
そんな複雑な事は聞かないし、普通に学校で教えてもらえるだろ、switchの使い方。

346:デフォルトの名無しさん
08/03/05 17:15:14
CILのswitch命令はJavaバイトコードでいうところのtableswitch命令相当かな。
Javaバイトコードにはもう1つlookupswitchって命令もあって、CILにはこれに相当するものがない。
これがないせいでgotoだらけのコードができることもあるかもね。

あと、C#のswitch caseには文字列を突っ込むこともできて、このときはもはやswitch命令は関係なくなる。
MSのC#コンパイラは、分岐数増えてきたらDictionary<string,int>を裏で作るって実装になってたかと。


347:346
08/03/05 17:21:07
>このときはもはやswitch命令は関係なくなる。
すまん、これは言い過ぎか。

Dictionary<string,int>を使って無理矢理switch命令用のインデックスを作り出す。
が正しい。


348:デフォルトの名無しさん
08/03/05 17:26:34
今、色々 IL Disasm して遊んでみてるけど、switch のコンパイル結果、そんな単純でもなさそう。

case が 0 で始まる連続な整数 → IL switch 命令
非 0 から始まっての連続 → sub してから switch 命令
完全に不連続 → beq とか brtrue の連続(= if-else と変わらない)

だった。

349:デフォルトの名無しさん
08/03/05 17:29:51
あと、例えば、
switch(x) {
 case 0: xxx; break;
 case 4: xxx; break;
 case 6: xxx; break;
 case 9: xxx; break;
}
みたいなのは、0 のところだけ beq、
それから 4引いてから switch 命令、
その後さらに switch 後の default 句内で case 9 の判定するような妙なコードに。

ラベルが不連続でも、値の近い整数ならある程度最適化かけてるっぽい。

350:デフォルトの名無しさん
08/03/05 17:30:38
コンパイラの出力にあわせてチューンはすべきじゃないよ
高速化したいなら、コンパイラにキチンと意図の伝わる形でコードすべき
前から準にシーケンシャルに比較をする事を伝えたいなら if else if で
一括比較したいなら switch で、将来のJITのチューンにあやかれるようにね。

351:デフォルトの名無しさん
08/03/05 17:33:02
Cのswitchの実装は処理系依存だろ。常識って何だよ。

352:デフォルトの名無しさん
08/03/05 17:34:24
>>351
常識っていうのは、プログラマ間で意思疎通をするのに最低限必要な知識だよ

353:デフォルトの名無しさん
08/03/05 17:37:29
>>349
まあswitch命令がそういう仕様なんだから仕方ないよなぁ。

ここの議論とか参考になるかも。
URLリンク(www.atdot.net)
URLリンク(www.atdot.net)

354:デフォルトの名無しさん
08/03/05 17:38:13
>常識っていうのは、プログラマ間で意思疎通をするのに最低限必要な知識
これはどこに書いてありますか?

355:デフォルトの名無しさん
08/03/05 17:39:29
>>350
それは同意。

まあ、ただ、単なる興味本位で、IL の switch 命令に関して。
Java の tableswitch, lookupswitch とはどっちとも違うかも。
単に、スタックの先頭を見て、その値をインデックスにしてジャンプするだけっぽい。
ldloc.1
switch (0x10, 0x20, 0x30)
なら、ローカル変数1の値が 0 なら 0x10 に、1 なら 0x20 にジャンプってだけ。

switch をブランチの羅列にするか、引き算/テーブル参照+switch 命令にするかは
結局コンパイラ次第ね。

356:デフォルトの名無しさん
08/03/05 18:19:16
こういう議論て、ふらっとスレで行われることが多いのはなんで?

357:デフォルトの名無しさん
08/03/05 18:49:10
前からずっみみてきたが、誰か約一名、ウソを本当のように自信たっぷり書くアンポンタンが居ついているんだよ
コイツ以前マ板にもマルチレスで同僚がswitch文を使って if をごまかしたとか書きまくっていた奴じゃねぇかな
こういうキチガイはいっぺん地獄へ落ちればいいんだよ

358:デフォルトの名無しさん
08/03/05 18:54:31
>>356
一旦的外れな方向に話が行った方が議論が盛り上がるからとか?

>>357
そういう発言はキチガイをよりいっそう近づけるから、
キチガイがいやなら逆に抑えた方がいいよ。

359:デフォルトの名無しさん
08/03/05 20:11:27
paintイベントを発生させるにはRefresh()だったりを使ってイベントを発生させるけど、
任意のイベントを発生させるにはどうすればいいんでしょうか?

たとえば、textbox1でKeyPressが発生した時に、そのキーがエンターキーだった場合、
button1.Clickを発生させるときなどです。

360:デフォルトの名無しさん
08/03/05 20:19:00
>>359
button1.Click(button1,new MouseEventArgs());

こんな感じか?

361:デフォルトの名無しさん
08/03/05 20:23:20
クリックをエミュレートするのはPerformClickだな

362:デフォルトの名無しさん
08/03/05 20:57:58
>>360
上手く動かなかったのでbutton_Clickメソッドを直接呼び出してみました。
button_Click(button1,new MouseEventArgs());
一応意図したとおりに動きましたが他のクラスからだと呼び出せないと思うので常套手段ではなさそうですね…。

363:デフォルトの名無しさん
08/03/05 21:36:37
>>359
イベントは特定条件がそろった時に内部から発生するものだから、
その条件を無理やりそろえるためのメソッドがないものは基本的に無理

通常はイベントを発生させなくても、イベントハンドラで実行される処理と
同じ処理が実行されれば十分なはず
その例だとPerformClickでもいい

364:デフォルトの名無しさん
08/03/05 21:59:49
>>363
なるほどそうですか。
同じ処理をしたいだけなので、例のbutton_Clickの処理内容を別のメソッドにして、
そのメソッドを呼び出すのが自然みたいですね。

365:デフォルトの名無しさん
08/03/05 21:59:53
TableRow,TableCellで動的にボタンをいくつか作成して

***** 何回かループ *****
Button objButton = new Button();
objButton.ID = "Btn" + i.ToString();
objButton.Width = 50;
objButton.Click += new EventHandler(Button_Click);
objTableCell.Controls.Add(objButton);
***** 何回かループ *****

縦にボタンがループの回数分並んだとして、適当に真ん中辺りのボタンを押した時、
そのボタンのIDって取得出来るの???
ちなみに"Btn" + i.ToString();で順番にボタンのIDをつけてるんだけど

private void Button_Click(object sender, EventArgs e)
{
string 押されたボタンのID = どのようなコード??
}

366:デフォルトの名無しさん
08/03/05 22:03:22
ヒント: sender

367:デフォルトの名無しさん
08/03/05 22:09:34
senderをなにかのパラメーターとして渡すのでしょうか??
それともsender.Get…という形で使うのでしょうか?^^;

368:デフォルトの名無しさん
08/03/05 22:15:32
とりあえずsender.ToString();でなにが取れるか見てみたら
"System.Web.UI.WebControls.Button"としか取れず、色々してみても
特定のIDを取ってくることが出来ませんでした。。

369:デフォルトの名無しさん
08/03/05 22:21:49
わかりました!ありがとうございます!

370:デフォルトの名無しさん
08/03/05 22:23:51
>>368
それはつまりsenderがButtonにキャストできるということ。

371:デフォルトの名無しさん
08/03/05 22:27:07
IDとButtonの関係がさっぱり見えない

372:デフォルトの名無しさん
08/03/05 23:20:43
>>368
的外れな話かもですが、
そのコントロールの定義?のところに書いてある、senderなんちゃらを使ってみるというのは?


質問です。
画面AからダイアログBを呼び表示させました。


ダイアログBのロードメソッドで条件を判定した結果によって、
ダイアログBを閉じたということにしたいのですが、うまくいきません。

ロード処理の中で、ダイアログのクロージングの処理を呼んだのですが、
処理が画面Aの呼び出し元に戻らず、ダイアログが表示されたままになってしまいます。

クロージングの中で使う、CancelEventArgsで何かパラメーターを渡せばよいのでしょうか?

すいません。お願いします。

373:デフォルトの名無しさん
08/03/05 23:47:22
ヘルプ! IDEをダウンロードしたいのですがセットアップ中のダウンロードが
進まないのは私だけ?

URLリンク(www.microsoft.com)


374:デフォルトの名無しさん
08/03/06 00:10:24
>>372
クロージングの処理とやらは何?
イベントメソッドを呼んでるのか?
それは「閉じようとしてるときに呼ばれるイベントメソッド」であって
「閉じるために」呼ぶもんじゃないが。

>>373
これまじお勧め。
全部入り。
URLリンク(www.microsoft.com)


375:デフォルトの名無しさん
08/03/06 01:08:13
ListViewのColumnHeaderコレクションエディタでColumnを追加した後、
メンバの順序を↑↓で変更しても反映されないのはバグ??


376:デフォルトの名無しさん
08/03/06 01:49:03
逆引き本を探しているんですが、オススメないでしょうか。
どれも似たり寄ったりでしょうか?
ペイントブラシのようなものに挑戦しているので、グラフィック関係が書かれていると助かります。

377:デフォルトの名無しさん
08/03/06 02:13:57
>>374
いつのまにか全部入りのExpress Edition出てたのか
単品よりいいね

378:323
08/03/06 09:45:15
自己解決しました。
ボタンのFlatStyleをSystemにしたら適用されるようになりました。

379:デフォルトの名無しさん
08/03/06 15:37:43
C#使うなって言われそうだけど、
C#でWin32ネイティブアプリ作れます?

380:デフォルトの名無しさん
08/03/06 15:57:57
そもそもコンパイラがネイティブコードを吐けないはず。
VC#以外のコンパイラはしらね。

381:デフォルトの名無しさん
08/03/06 17:45:30
だれか>>375を試してみてください。
ListViewのViewプロパティをDetailsにして、Columnsのコレクションをいくつか追加して、
コレクションエディタの↑↓で位置を変えても反映されません。
(DisplayIndexが変更されない?)


382:デフォルトの名無しさん
08/03/06 19:08:52
>>381
DisplayIndexってわかってるなら自分で直せばいいじゃん。
位置を変えたときに変わらないのは仕様なのかもしれないし。

383:382
08/03/06 19:20:46
うん。やっばり仕様だと思う。
コレクションエディタの順番は単にListViewItem.SubItemsの順番で、
DisplayIndexが表示の順番なんだと思う。
で、それらは必ずしも一致せず、
ListViewItemを作る部分のコードは変えずに表示の順番を変えることも出来るようになってると。

#実は俺も前に同じように順番が変わらず悩んだことがある。
そのときは.Designer.csにDisplayIndexの指定があるのを見つけて、
なんじゃこりゃと思いつつ手作業で削除した。

384:デフォルトの名無しさん
08/03/06 20:17:33
MySqlで日本語をインサートしようとすると文字化けするのでSET NAMESでutfやsjisを
投げてみたのですが直らず。どうしたら良いのでしょうか?。

385:デフォルトの名無しさん
08/03/06 20:25:29
>>384
自己レス、接続時にcharsetを投げたら上手く行きました。
他の言語ではnamesを投げて上手く行っていたのですがc#ではだめなのですね。

386:デフォルトの名無しさん
08/03/06 21:48:21
そんなに投げちゃいかん

387:デフォルトの名無しさん
08/03/06 22:21:04
>>383
そうなのね。ありがと。
でもコレクションエディタで順番変えてOK押した一瞬だけ順番が変わってすぐに戻るのがデザイナ上で見えるからバグっぽく見える…

388:デフォルトの名無しさん
08/03/06 22:37:24
あるクラスを作って、そのインスタンスを複数作ったとき、
それぞれのインスタンスを区別するにはどうしたらいいのですか?
たとえばこんなクラスです。

public void 猫()
{
 string kainushi
 public 猫(string, ka)
 {
  this.kainushi = ka
 }
 public 好きな遊び{ get; set;}
}


389:デフォルトの名無しさん
08/03/06 22:41:45
クラスってclassで定義するんじゃないの?

390:デフォルトの名無しさん
08/03/06 23:01:41
区別してどうするの?

391:デフォルトの名無しさん
08/03/06 23:04:34
区別しない方が難しいだろ。

392:デフォルトの名無しさん
08/03/06 23:05:36
そんなこと自分で考える前に基本的な文法を勉強した方が

393:デフォルトの名無しさん
08/03/06 23:10:58
猫[] cats = new 猫[5];

Console.WriteLine(cats[0] == cats[1]);
Console.WriteLine(cats[0] == cats[2]);
Console.WriteLine(cats[0] == cats[3]);
Console.WriteLine(cats[0] == cats[4]);
Console.WriteLine(cats[1] == cats[2]);
Console.WriteLine(cats[1] == cats[3]);
Console.WriteLine(cats[1] == cats[4]);
Console.WriteLine(cats[2] == cats[3]);
Console.WriteLine(cats[2] == cats[4]);
Console.WriteLine(cats[3] == cats[4]);

全部Falseだろ。つまり区別できてる。

394:デフォルトの名無しさん
08/03/06 23:16:16
>>393
インスタンスの区別じゃないの??

395:デフォルトの名無しさん
08/03/06 23:17:20
猫 → クラス
cats[0] → インスタンス
cats[1] → インスタンス
cats[2] → インスタンス
cats[3] → インスタンス
cats[4] → インスタンス

396:デフォルトの名無しさん
08/03/06 23:22:54
>>393
そのまま動かしたら全部trueになっちゃうw

397:デフォルトの名無しさん
08/03/06 23:59:33
>>395

398:デフォルトの名無しさん
08/03/07 00:02:36
cats[0] → null
cats[1] → null
cats[2] → null
cats[3] → null
cats[4] → null

399:デフォルトの名無しさん
08/03/07 00:12:27
cats[0]がインスタンスと聞いて

400:デフォルトの名無しさん
08/03/07 00:26:15
ぬる猫がいると聞いて

401:デフォルトの名無しさん
08/03/07 00:31:44
>>393
>>393
>>393

402:デフォルトの名無しさん
08/03/07 00:54:49
何で配列にしようと思ったのやら

403:デフォルトの名無しさん
08/03/07 00:59:17
classの規定の==はそれぞれのインスタンスを区別する
中身が全く同じでもインスタンスが違えば==はfalseになる

404:デフォルトの名無しさん
08/03/07 01:24:40
>>387
5分くらいで適当に考えた対策だけど多分おk

全選択してDisplayIndexを 列数-1 で並び順になる (0だと逆順)

405:デフォルトの名無しさん
08/03/07 01:52:53
>>404
何その裏技っぽいのwすごw
でもそれでいけるね!
0指定すると逆順になるけどコレクションエディタと同期してないから同じ事だけど。

406:デフォルトの名無しさん
08/03/07 02:25:26
最近C#使ってみようと思ってるんですが、
C#3.0ってもうリリースしてるんでしょうか?

どうせなら3.0から勉強したいなと・・・^^;

407:デフォルトの名無しさん
08/03/07 02:26:47
とっくの昔にリリースしとる

408:デフォルトの名無しさん
08/03/07 02:30:41
>>407
そうでしたか・・・アホな質問してすいません(__)
Wikipediaは見たんですが、言語仕様しか書いてなくて^^;

JavaScriptっぽいらしいですね。JavaScriptは好きなんで楽しみです。
後、C#でP2Pしたいんですがお勧めのページあるでしょうか?

ActionScript3.0がSocketが扱えて同期通信できるようになるって言ってたんですが
当分先そうなんでFlex2からC#に浮気してみようかなと・・・^ω^;

409:デフォルトの名無しさん
08/03/07 02:32:33
「C#」「P2P」「ページ」の関連性について。

410:デフォルトの名無しさん
08/03/07 02:36:08
お勧めのページといったらタウンページかMSDNしかないだろう

411:デフォルトの名無しさん
08/03/07 02:39:20
Wikipediaにも最新リリース: C# 3.0とはっきり書いてある。

412:406
08/03/07 02:40:14
>>410
でwwwすwwwよwwwねwww

まぁ進捗Blogとか貼ってくれたら儲けもんぐらいに思ってただけなんで、
適当にググッてみますわwwww

413:デフォルトの名無しさん
08/03/07 02:41:43
>>411
あー・・・右上の表見落としてた・・・
まじすまそ・・・あほすぎ。

414:デフォルトの名無しさん
08/03/07 04:08:06
なんか覚えたての単語並べてみましたって感じ?

415:デフォルトの名無しさん
08/03/07 11:22:30
c#からmysqlにinsert set name=val にする時にvalをエスケープしないといけないのですが
mysql側に専用のエスケープ関数などあるのでしょうか?。

416:デフォルトの名無しさん
08/03/07 12:55:07
それはあれだ、C#のソースコード上の文字列をエスケープする関数を探すようなものだな
例えば、文字列リテラルで \" とエスケープせずに、 " と書いて関数でエスケープしたいと

417:デフォルトの名無しさん
08/03/07 13:25:23
>>416
いじわる!!笑
@の他は正規表現でいちいち書き換えないとだめなのでしょうか?

418:デフォルトの名無しさん
08/03/07 14:03:44
意地悪ではない。処理のレイヤーが違うから無理と暗にいってる

パーサが文字列リテラルを判別するためにエスケープが必要で
関数に渡されるのはパースされた文字列

当たり前すぎて確認してなかったけど、
valは文字列リテラルでエスケープというのは ' => '' とかのことだよな

419:デフォルトの名無しさん
08/03/07 14:04:50
>>417
そんなことより株取引がんばってください

420:デフォルトの名無しさん
08/03/07 14:21:10
>>418
言われて見て思ったのでちょっと試したのですがこういう事ですよね。
sqlでインサートできないから安易にエスケープと考えてしまったのですが問題は別にあると
認識し試行錯誤します。

string text = @"\a\a\a'''";
MessageBox.Show(text);

>>419
おうよ!。みずほが下がってる><

421:デフォルトの名無しさん
08/03/07 18:00:24
2008を使ってますが、2002年に出たC#の本を買っても問題ないでしょうか?
『C#によるプログラミングWindows』上下Charles Petzold (著)が気になっています。

422:デフォルトの名無しさん
08/03/07 18:33:20
せめてC#2.0(VC#2005)に対応したのにしとけ

423:デフォルトの名無しさん
08/03/07 18:47:21
PictureBoxに画像+αを表示したいのでPictureBoxのPaintデリゲートに指定した関数の中で
描画処理を行わせるようにしたのですが、その際にPaintEventArgs.Graphicsを利用して描画すると意図通り動くのに対して
それを利用せずに関数内でPictureBox.CreateGraphics()により取得したGraphicsオブジェクトを利用して描画した場合には
他のウインドウの影に隠れた場合等に再描画が正常に行われないのですが何故なのでしょうか?

424:デフォルトの名無しさん
08/03/07 19:22:06
お前さんが再描画してないんだから当然
てか、そのためのPaintイベントじゃないか

425:デフォルトの名無しさん
08/03/07 19:31:44
>>424
どちらの場合も処理してる関数自体はPictureBox.Paintに登録しているのでクライアント領域が無効化された場合には
再描画のルーチンが実行されると思ったのですが違うのでしょうか?

426:デフォルトの名無しさん
08/03/07 20:10:49
クリッピングというものがあってな

427:デフォルトの名無しさん
08/03/07 20:33:12
ああ、そういうことか
こんな感じにして何度か再描画すると面白いものがみれるよ

void pictureBox1_Paint(object sender, PaintEventArgs e) {
e.Graphics.Clear(Color.White);
Thread.Sleep(1000);
e.Graphics.Clear(Color.Gray);
Thread.Sleep(1000);
this.pictureBox1.CreateGraphics().Clear(Color.Blue);
Thread.Sleep(1000);
}

428:デフォルトの名無しさん
08/03/07 20:33:44
MySqlDataReader.read()って一番最後の行を読んだ時点でfalseになりません?

while(MySqlDataReader.read()){
List<string>.Add(val)//これだと一番最後の行が追加されない
}

429:デフォルトの名無しさん
08/03/07 21:51:04
System.Web.WebProxyクラスに設定した、プロキシサーバーが生存中かを
楽に確認する方法ってないでしょうか。
プロキシサーバーにpingを打って、100ms以内に応答がなけれ
ば無効と判断するコードの、簡単な書きかたってないでしょうか?

430:デフォルトの名無しさん
08/03/07 23:27:15
Pingクラスがあるよ

431:デフォルトの名無しさん
08/03/08 00:17:09
>>428
サードパーティ製ライブラリについて質問するのに、ライブラリの名称もバージョンも書かないとか
どんだけ

432:デフォルトの名無しさん
08/03/08 00:52:32
街の仲間たちにぬっ殺されろ


433:デフォルトの名無しさん
08/03/08 01:32:31
>>428
read()の時点で1レコード呼ばれてるってオチだろ

434:デフォルトの名無しさん
08/03/08 03:04:25
C#初心者でございます。
C#もJAVAのように数学の関数などを
Math.Sin(); 
等とクラス名を書かなければいけないようですが
クラス名を省略することは可能なのでしょうか。


435:デフォルトの名無しさん
08/03/08 03:05:09
using

436:デフォルトの名無しさん
08/03/08 03:26:02
Java には static import が付いたけど
C# には似たようなものってあったっけ

437:デフォルトの名無しさん
08/03/08 03:27:34
using

438:デフォルトの名無しさん
08/03/08 04:41:44
ハッシュテーブルのことC#では何言うんだっけ?

439:デフォルトの名無しさん
08/03/08 04:44:48
ハッシュテーブルだろ

440:デフォルトの名無しさん
08/03/08 04:49:07
Hashtable
Dictionary

441:デフォルトの名無しさん
08/03/08 07:38:26
おはようございます
string[] str = (string[]) List<string>をみたいに簡単に変換する方法はないでしょうか?

442:デフォルトの名無しさん
08/03/08 07:40:20
ToList

443:デフォルトの名無しさん
08/03/08 07:41:05
じゃなかったToArray

444:デフォルトの名無しさん
08/03/08 07:49:23
>>443
こんな便利なものがあったのですね
ありがとうございます

445:デフォルトの名無しさん
08/03/08 10:37:58
>>434
いきなりSin()とか書かれても面食らうだけだからやめてくれ

446:デフォルトの名無しさん
08/03/08 10:58:30
お答えいただき有難うございます。

usingだと省略できますか。
別名をつけられるのはできたのですが 
M.Sin()とかになってしまうのでこれでもまだすっきりしないというか。
できないならできないで仕方ありませんが。

>>445
そうですか?
数学をやるとき「数学の積分(R*数学のSIN(π + θ))」なんて
いちいち書くのは冗長ですよね・・・と思っていたのですが、
sin ,cosと来たら三角関数、というのはもはや非常識なのでしょうかね。


447:デフォルトの名無しさん
08/03/08 11:08:59
>>446
確かに数値計算系のプログラムではいちいちMathつけると読みにくいというのには同意。
自クラスに
static double sin(double x) { return Math.Sin(x); }
なんて定義するのはダメ?
クラス毎に定義しなきゃいけないのが面倒だが。

448:デフォルトの名無しさん
08/03/08 11:41:55
VBのモジュール感覚で濫用するアホが出てくるからだろ

449:デフォルトの名無しさん
08/03/08 11:46:26
doubleの拡張メソッドにしたら

450:デフォルトの名無しさん
08/03/08 11:55:12
でも確かにDelphiのwith相当のことをやりたいことはたまにあるな。

451:デフォルトの名無しさん
08/03/08 11:58:39
>>450
VB使えよ

452:デフォルトの名無しさん
08/03/08 12:17:05
ヘジは早くプリプロセッサを追加しろよ。

453:デフォルトの名無しさん
08/03/08 12:17:22
with最凶

454:デフォルトの名無しさん
08/03/08 12:38:28
>>446
現状で最もましな方法はpartialクラスで>>447だと思う
てか、モドキじゃないMix-inが使えればいいのにな

455:デフォルトの名無しさん
08/03/08 12:55:40
ListViewの詳細をクリックするとアイテムが選択されますが、
プログラムから選択させることって出来ますか?
listView1.Items[0].Selected = true;
こんな感じにしてみたのですが選択はされていると思うのですが見た目上選択されたようにはなっていません。
見た目も選択されているようにするにはどうしたらいいんでしょうか?

456:デフォルトの名無しさん
08/03/08 13:16:41
>>454
違うと思うよ。
もっとも「マシ」な方法は、"Mathがうっとうしい"などという感覚を矯正すること。

要するにただの慣れの問題でしょ。
まあ慣れすぎて自分のクラスの静的メソッドでもクラス名つけたくなってくるのも
それはそれで難儀だとは思うけど

457:デフォルトの名無しさん
08/03/08 13:25:23
あとVBのWithってブロック内のインスタンスの表記を省略できるだけなんだよね。

458:466
08/03/08 13:40:33

クラス名の省略はとりあえずできない、というのがわかって助かりました。
ありがとうございました。

459:デフォルトの名無しさん
08/03/08 14:07:05
>>455
HideSelectionがTrueのままになってて、フォーカスが他にあるってオチじゃないよね?

460:デフォルトの名無しさん
08/03/08 14:09:48
>>455

listview.Focus()してもだめ?

461:455
08/03/08 14:15:32
listView1.Select();
で解決しました。

462:デフォルトの名無しさん
08/03/08 14:17:31
>>459
違うみたいです。
>>460
だめでした。。

463:デフォルトの名無しさん
08/03/08 16:47:12
"続行するには何かキーを押してください . . ."ってどうやるの?

464:デフォルトの名無しさん
08/03/08 16:54:03
>>463
pause

465:デフォルトの名無しさん
08/03/08 17:09:11
Visualstudioでクラスの名前を変更する時、
ジェネリッククラスだとファイルとクラスの名前が連動しないのは仕様ですかね?

466:デフォルトの名無しさん
08/03/08 17:12:52
ファイル名に<>使えない

467:デフォルトの名無しさん
08/03/08 17:13:04
>>464
ごめん。質問の仕方が悪かった。
僕が言いたいのは以下のようなプログラムの場合、
using System;
namespace HelloWorld
{
  class Program
  {
    static void Main()
    {
      Console.WriteLine("Hello World");
    }
  }
}
実行すると一瞬コンソールが現れて消えてしまうんだけど「Visual Studio」とかで実行したら
"続行するには何かキーを押してください . . ."って出て終了しないよね?
それでそのようなことをするコマンドプロンプトのオプションがあるのかなあって調べたら無かったからどうやるのかなあってこと。

468:デフォルトの名無しさん
08/03/08 17:15:26
>>467
Console.Write("続行するには何かキーを押してください . . .");
Console.ReadKey();

469:デフォルトの名無しさん
08/03/08 17:32:04
>>468
レスどうもありがとう。
でもその方法は知っているんだ。
Visual Studioはいちいちそれを加えてからコンパイルして実行しているの?
違うよね。FileMonitorで監視してみたけど「Console.ReadKey();」が付加されている
exeファイルは見つけることが出来なかった。
僕は今C#用のエディタを作っているんだけどどうしても、
よく見る"続行するには何かキーを押してください . . ."が出来ない。

教えてください。よろしくお願いします。

470:デフォルトの名無しさん
08/03/08 17:33:43
だから、pause
もしくは、コマンドプロンプトから実行すればいい

471:デフォルトの名無しさん
08/03/08 17:35:24
そして、そのpauseコマンドはC#で作られているわけではない。

472:デフォルトの名無しさん
08/03/08 17:40:39
インターフェイスの利用価値がわからないんだが、インターフェイスってよく使うもんなのか?

473:デフォルトの名無しさん
08/03/08 17:50:37
多分知らないうちに一番お世話になってるのはIEnumerableとIEnumerator
デリゲートもインターフェイスみたいなもんだな

474:デフォルトの名無しさん
08/03/08 17:55:05
>>470
出来ました。ありがとうございました。

475:デフォルトの名無しさん
08/03/08 18:08:10
>>473
んじゃあ、自分でインターフェイスを作る事はそんなに無い感じなのかな?
ありがとう^

476:デフォルトの名無しさん
08/03/08 18:29:56
>>475
ライブラリつくるときとか
プラグインぽいのつくるときとか


477:デフォルトの名無しさん
08/03/08 19:54:38
>>476
じゃあ俺にはまだ必要ないな
ありがと^

478:デフォルトの名無しさん
08/03/08 22:42:48
>>467に便乗だけど、
Visual C#でコンソールアプリケーションを作成してデバグするときに
ウィンドウが消えないように、Visual C#のオプション設定でできないの?
>>468のようにソースはいじらないで。)

479:デフォルトの名無しさん
08/03/08 22:47:55
#if DEBUG
(>>468)
#endif
でいいだろもう

480:デフォルトの名無しさん
08/03/08 22:51:53
他の方法ではなく、できるかできないかを聞いている。

481:デフォルトの名無しさん
08/03/08 23:00:23
>>480
オプションではできないんじゃね?
ってか回答者は機械じゃねぇぞ。

482:デフォルトの名無しさん
08/03/08 23:02:03
できないならできないと答えろ。

483:デフォルトの名無しさん
08/03/08 23:02:41
できますん。

484:デフォルトの名無しさん
08/03/08 23:03:11
そんなきき方じゃできたとしても誰も教えないってなるだけじゃね?

485:デフォルトの名無しさん
08/03/08 23:04:30
答えられる奴が答えればいい。

>>478に回答できる奴いないの?

486:デフォルトの名無しさん
08/03/08 23:05:14
できるよ。やりかたは自分で探してね☆

487:デフォルトの名無しさん
08/03/08 23:06:17
できるかできないかでいえばできるな。

488:デフォルトの名無しさん
08/03/08 23:07:00
>>486
おk。

【結論】
Visual C#でコンソールアプリケーションを作成してデバグするときに
ウィンドウが消えないように、Visual C#のオプション設定できる。

以上。


489:デフォルトの名無しさん
08/03/08 23:07:56
POST送信をデバッグするよい方法ってないですかね?
いまのとこ、HttpWebResponseの結果をテキストにしてるのですが、
これじゃPOSTに成功したのかどうかさっぱり・・・。
IEに簡単に表示とか出来ないものでしょうか?

490:デフォルトの名無しさん
08/03/08 23:08:24
出来ない。

491:デフォルトの名無しさん
08/03/08 23:09:58
Wiresharkでも眺めてろよとかそーゆーの駄目?

492:デフォルトの名無しさん
08/03/08 23:12:17
>491
申し訳ない、プロトコルレベルでの通信は成功してます。
チェックしたいのは、掲示板に書き込んだときあとの、
「名前を入力してください」
とかの類です。POSTの送信データが抜けなく遅れてるのかをチェックしたいのです。

493:デフォルトの名無しさん
08/03/08 23:27:49
正常に送られてるか検証するためには送らないことが必要である

494:デフォルトの名無しさん
08/03/08 23:29:47
そこはTCPの保証範囲でないの。

495:デフォルトの名無しさん
08/03/09 00:21:03
ウインドウが消えないようにするには、returnのところでF9を押す

496:デフォルトの名無しさん
08/03/09 00:22:02
returnのところって何?

497:デフォルトの名無しさん
08/03/09 00:22:57
Mainメソッドのreturnかなんか

498:デフォルトの名無しさん
08/03/09 00:23:44
ああ、そういうことね。thx

499:デフォルトの名無しさん
08/03/09 00:54:21
カラムがクリックされた時にどのカラムがクリックされたのか取得したいのですがどうすればいいんでしょうか?
選択されたカラムの名前が取得できるといいのですが…。

500:デフォルトの名無しさん
08/03/09 00:57:27
カラムって何?

501:デフォルトの名無しさん
08/03/09 01:02:55
>>500
リストビューのColumnです。

502:499
08/03/09 01:27:52
ColumnClickイベントで、e.Column.ToString()でとりあえず番号は取得できますが、
columnHeaderの名前自体は取得できないのですかね…?

503:デフォルトの名無しさん
08/03/09 01:38:32
インデックスが手に入ってるんだからどうでもなるだろ

504:デフォルトの名無しさん
08/03/09 01:43:55
例えばどうするんだよ

505:デフォルトの名無しさん
08/03/09 01:52:24
listView1.Columns[index].Name;

こんなことも重いつかんのならプログラミングやめたほうがいい。
向いてないから。

506:デフォルトの名無しさん
08/03/09 01:59:34
>>502これでおk?

507:デフォルトの名無しさん
08/03/09 02:03:45
listView.Columns[e.Column]

508:デフォルトの名無しさん
08/03/09 02:15:40
>>505
index??
それ動きませんよ。

>>507
カラムの名前じゃなくて、カラムのメンバ名を取得したいのです…。

509:デフォルトの名無しさん
08/03/09 02:19:52
メンバ名とやらを手に入れる意味は無いから安心しろ

510:デフォルトの名無しさん
08/03/09 02:21:03
>>509
お前に意味はなくても>>508にはあるんだよ

511:505
08/03/09 02:30:47
>>508
string name = listView1.Columns[e.Column].Text;

お前の欲しいものはこれか?
最初っからTextって言えよ馬鹿。
本当に向いてないからやめておけ。
そして二度とくるな。



512:499
08/03/09 02:32:42
インデックス番号だけしか取得できないとカラムが動的に追加・削除されたら困ると思うのですが…。
メンバ名を取得する方法はないってことですかね??

513:デフォルトの名無しさん
08/03/09 02:34:09
>>511
さっきから釣りですか?
向いてないんじゃないですか?w

514:デフォルトの名無しさん
08/03/09 02:34:38
>>511はチンコ剥いてろ。

515:デフォルトの名無しさん
08/03/09 02:39:48
>>512
メンバ名ってprivate ColumnHeader hoge; の hoge だろ?
動的に追加削除したらメンバ名も何も無いじゃん

516:デフォルトの名無しさん
08/03/09 02:40:58
>>512
>インデックス番号だけしか取得できないとカラムが動的に追加・削除されたら困ると思うのですが…。
困りません。

>メンバ名を取得する方法はないってことですかね??
日本語でおk

517:デフォルトの名無しさん
08/03/09 02:46:25
死ね

518:デフォルトの名無しさん
08/03/09 02:48:10
>>505=>>511
はチンコ剥いてプログラミングやめて2chもやめた方がいい。
人生だけはやめなくていいから。

519:デフォルトの名無しさん
08/03/09 02:52:59
>>515-516
動的に追加・削除してインデックスがかぶってしまったら困ると思うのですが…。
例えばインデックス1を削除したあとに、新しく追加したカラムもインデックス1にしたら区別がつかなくなると思うのですが。

520:デフォルトの名無しさん
08/03/09 02:59:13
>>518
悔しかったの?w

521:デフォルトの名無しさん
08/03/09 03:00:57
>>519
削除したんならもうインデックス存在しないじゃん

522:デフォルトの名無しさん
08/03/09 03:04:21
>>521
削除した方はもうないから新しい方と区別つかないじゃん。

523:デフォルトの名無しさん
08/03/09 03:06:41
インデックスがわかればカラムのインスタンスそのものを取得できるのに、それ以上何を望む?

524:デフォルトの名無しさん
08/03/09 03:12:36
>>523
まあそうですよね。
冗長でもインデックスとは別に取得出来るんじゃないかと思ってしまってました。
ありがとうございました。

525:デフォルトの名無しさん
08/03/09 03:23:00
>>512>>519で区別できなくて困るのってどんな場合だろ
気になってしょうがないから、思いついた人おせーて

526:デフォルトの名無しさん
08/03/09 03:25:17
ちょっと待て終わらせんなw
インスタンスそのものがわかってもインスタンス名が分からないと困る事あるだろ。

527:デフォルトの名無しさん
08/03/09 03:26:48
インスタンス名ってなに?

528:デフォルトの名無しさん
08/03/09 03:27:16
変数のことかな?

529:デフォルトの名無しさん
08/03/09 03:28:09
カラムを動的に追加するときにNameプロパティをちゃんと設定しておけばOK。

530:デフォルトの名無しさん
08/03/09 03:29:58
例えばあるカラムがstringで数字を表示している時にそのカラムを数値として扱いたくなった時など。
その列以外は数字でもstringで扱いたいのに、その列だけは数値として扱いたい。
そして動的に追加・削除されるものだとしたらインデックスよりインスタンス名が欲しいでしょ?

531:デフォルトの名無しさん
08/03/09 03:32:10
で、インスタンス名ってなに?

532:デフォルトの名無しさん
08/03/09 03:35:57
>>529
Nameプロパティが取得できないからこういう流れになってるんだろ

533:デフォルトの名無しさん
08/03/09 03:36:43
>>505
>>511
>>527
>>528
>>531
もうちょっと勉強して来い

534:デフォルトの名無しさん
08/03/09 03:37:06
>>533
死ね

535:デフォルトの名無しさん
08/03/09 03:40:06
スクリプト脳の弊害ってホント恐ろしいな。

で、インスタンス名って何。

536:デフォルトの名無しさん
08/03/09 03:43:15
スクリプト脳って?

537:デフォルトの名無しさん
08/03/09 03:43:46
池沼はスルーしろよ

538:デフォルトの名無しさん
08/03/09 03:44:28
出た、スルーw

539:デフォルトの名無しさん
08/03/09 03:56:26
>>525
クリックされた列がある特定のデータ群だった時にだけ処理をしたい場合

540:デフォルトの名無しさん
08/03/09 03:59:42
「クリックされた列がある特定のデータ群」ってなに?

541:デフォルトの名無しさん
08/03/09 04:01:21
もう相手すんなよ

542:デフォルトの名無しさん
08/03/09 04:01:52
名前なんて不安定な要素で判定しないなぁ

543:デフォルトの名無しさん
08/03/09 04:01:57
出た、もう相手すんなよw

544:デフォルトの名無しさん
08/03/09 04:10:38
ただの荒らしじゃねえか

545:デフォルトの名無しさん
08/03/09 04:13:52
A B
1 1

AとBの列があったとして、Aの列(1)にだけ特定の処理をしたい場合困るんじゃね?

546:デフォルトの名無しさん
08/03/09 04:16:48
何が困るのか全く分からない。

547:デフォルトの名無しさん
08/03/09 04:18:11
break;

548:545
08/03/09 04:20:31
>>546
俺に聞いてる?
じゃあ逆にAの列をどうやって特定する?
削除される可能性もあるからインデックスからは特定できないよ。
Aの名前も削除された後に追加されるかもしれないから名前でも特定できない。

549:デフォルトの名無しさん
08/03/09 04:34:54
List<ColumnHeader>で管理するなりNumberColumnHeaderクラス作るなりどーとでも。

550:デフォルトの名無しさん
08/03/09 04:36:35
>>548
ColumnClickアクションを拾って、e.Columnでインデックスが取れるよね。
で、アプリはどのカラムが何を意味してるか知ってるはずだよね?
知らないとしたら、それってどういう状況なの??

551:デフォルトの名無しさん
08/03/09 04:45:46
ListViewからカラムを削除するのはアプリ。
ListViewにカラムを追加するのはアプリ。
何番目のカラムに何を格納するかを決めるのもアプリ。

インデックスが分かればカラムを特定できる。
カラムを特定できればあとはアプリが自由に操作できる。

何が困るのか全く分からない。

552:デフォルトの名無しさん
08/03/09 04:49:10
>>548
Tag

単純な処理ならint,enumを入れておいてその値で処遇を決めるとか、
ソートするだけならtype(比較可能)を入れておいてキャスト時に使うというのも

複雑な処理をしたければ>>549-551

553:デフォルトの名無しさん
08/03/09 06:21:56
>>548
削除された列のクリックイベントってどこから発生するの?
動的に追加削除されるカラムの中の特定のカラムに対して特定の処理をしたいってんなら、
そもそもクリックイベントでインデックスを取るまでもなく、そのカラムの変数名でアクセスすればいいだけ。
というよりも、削除されているであろうカラムのインデックスをクリックイベントで取る意味が分からん。

流れ分かってる?発端は>>499だよ

554:デフォルトの名無しさん
08/03/09 11:48:11
タブコントロールでタブを下に配置した時にFlatButtonsにする方法はないのでしょうか?

555:デフォルトの名無しさん
08/03/09 12:52:16
混乱させる忍術の稽古はよそでやれ

556:デフォルトの名無しさん
08/03/09 13:10:38
??columnのインスタンス名(??)の話の流れが全く読めないんだが
あるインスタンスを格納する変数名を取りたいってことか??
変数名なんて単なる箱なんだからスコープ違えば役に立たないと
おもうんだけど…それとは違うの?

557:デフォルトの名無しさん
08/03/09 14:19:01
>>556
何いってるの

558:デフォルトの名無しさん
08/03/09 14:30:22
釣りなのか思い込み野郎なのかは知らないけど、気にするな

559:デフォルトの名無しさん
08/03/09 14:59:37
>>550-551
こういう場合はを想定ごらん。
例えばボタン1を押したらカラム追加、ボタン2を押したらカラム削除するとして、
プログラム上ははじめから配置されているある特定のひとつのカラムだけに操作する必要がある場合。
勿論削除されたら操作しないし、内容も他のカラムと見た目上判断できない。

560:デフォルトの名無しさん
08/03/09 15:01:10
まあ削除するときに特定のカラムかどうかを判定すればいいんだけど、
>>550-551は状況を想定できないようなので言ってみた。

561:デフォルトの名無しさん
08/03/09 16:41:57
>>559
カラムクリックイベントからインデックスを取るという状況の話をしているのに、
なんでボタンのクリックイベントで特定のカラムを操作する話になってんの?
もともとそんな状況の話なんかしてないんだからそんな想定は無意味だ。

562:デフォルトの名無しさん
08/03/09 17:05:24
>>559-560
そんなもんプログラム上で如何様にもできるっての。

563:デフォルトの名無しさん
08/03/09 17:23:08
>>561
なんでインデックスを取る話になるの?
インデックスじゃ区別つかないからインデックス以外の方法はないかって話題だろ?

>>562
如何様に出来てもインデックス以外の要素で一発で判断できるメンバがあれば楽って話だろ。
例えばエクスプローラでよくあるカラム上の▲▼マークだってオーナードロー駆使すれば如何様にも出来るけど
デザイナ上で一発で出来れば楽だろ。
それと同じ。


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