トップページ⇒tech
1001コメント291KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001ななしぃ#2007/11/18(日) 15:53:41
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

前スレ: ふらっとC♯, C#(初心者用) Part20
http://pc11.2ch.net/test/read.cgi/tech/1191036844/
0461デフォルトの名無しさん2007/12/07(金) 22:05:00
Windows以外でC#使ってる人いるの?
やっぱC#の人はWinアプリ開発なのかな?
0462デフォルトの名無しさん2007/12/07(金) 22:06:01
うんにゃ
言語論争につかうだけ。
0463デフォルトの名無しさん2007/12/07(金) 22:10:15
いるよ
0464デフォルトの名無しさん2007/12/07(金) 22:10:58
万一Silverlightが流行ることがあれば…
0465デフォルトの名無しさん2007/12/07(金) 22:15:16
でもvista以降のOSが普及すれば一気に流行るんだろうね
LLなんて軟派な言語は要らないんだぜ?
0466デフォルトの名無しさん2007/12/07(金) 22:18:45
>>460
Symbol フォントでμとかπ出すためのコードじゃないか?
Symbol フォントのμ、πってそれぞれ m と p に対応してた気はするけど。
0467デフォルトの名無しさん2007/12/07(金) 23:02:39
配列のプロパティについて詳しく説明しているHPはありますか?
宣言の仕方と使い方の例を参照したいです。
0468デフォルトの名無しさん2007/12/07(金) 23:52:27
そりゃMSDN2
0469デフォルトの名無しさん2007/12/07(金) 23:55:34
.net frameworkのクラス階層が複雑すぎて疲れました…
c#のせいじゃないと分かってますが…
0470デフォルトの名無しさん2007/12/07(金) 23:58:47
そうなったら引退ですね
0471デフォルトの名無しさん2007/12/08(土) 00:06:57
あれが複雑てw
0472デフォルトの名無しさん2007/12/08(土) 00:27:53
Javaの方が酷い
0473デフォルトの名無しさん2007/12/08(土) 01:08:01
複雑なんじゃなくて量が多いだけ
一部のよく使うものだけ覚えておけばあとは必要に応じて調べればいい
0474デフォルトの名無しさん2007/12/08(土) 01:12:08
何の言語でもライブラリ覚えるのが一番大変だ
0475デフォルトの名無しさん2007/12/08(土) 01:19:52
.NETのクラスライブラリなんて無茶苦茶使いやすいじゃん
その昔MFCなるものがあって、最悪だったぞ。
0476デフォルトの名無しさん2007/12/08(土) 01:38:23
こいつ引退どころかプログラマになってすらいないだろうな
0477デフォルトの名無しさん2007/12/08(土) 01:39:23
なんか色々話聞きますよね・・・>MFCやSTL
これから入る初心者にとっては、昔に比べて相当恵まれた環境なんですかね、やっぱ?
0478デフォルトの名無しさん2007/12/08(土) 01:41:47
もう、恵まれてるなんてものじゃない。
10年も昔と比べたら、何十倍も何百倍も生産性高いんじゃなかろうか。
0479デフォルトの名無しさん2007/12/08(土) 02:42:06
IDEがタダなんて考えられんかったしなぁ・・・
0480デフォルトの名無しさん2007/12/08(土) 02:42:11
話ぶった切ってスマソ。質問です。

windows mobile6でファイルを同期させるプログラムをC#で書いているのですが、
ファイルの作成日や最終書き込み日時を変更させるには どうしたら良いでしょうか?
FileInfoやFileクラスだと、LastWriteTimeプロパティが読み取り専用で使えずハマってる現状です。

File.copy(string path)を使ってファイルをコピーすると、何故かファイルのミリ秒部分が
切り捨て、もしくは切り上げされているようで、書き込み日時が1秒ずれてしまうのを直したいのです。
0481デフォルトの名無しさん2007/12/08(土) 03:00:29
ExpressEditionみたいのをもっと早く出しておけば他のIDEへの流出は食い止められたのに
IDEの儲けなんて全体で見れば大したことないんでしょ?
0482デフォルトの名無しさん2007/12/08(土) 03:00:51
>>480
へ?File.SetLastWriteTimeは?
04834802007/12/08(土) 03:09:28
GetLastWriteTime はwindows mobileでもサポートされてるんですが、
何故かSetLastWriteTimeの方はサポートされていないようなんです。
0484デフォルトの名無しさん2007/12/08(土) 09:19:44
>>480
http://www.opennetcf.com/FreeSoftware/SDF14/tabid/91/Default.aspx
ここのソース見てみたらIntPtrとかでドロドロやらないと駄目みたい。
0485デフォルトの名無しさん2007/12/08(土) 09:43:25
>>480
CreationTime/LastWriteTime/LastWriteTimeはCE系はRead Onlyやね。
違ってるかも知れんけど多分Compact Framework上からは無理臭い希ガス。
まずWin32APIで出来るか確認して出来るようならDllImportする位かな。

漏れも今CE5.0+CFMで開発やってるけど、結構良く使いそうなメソッドや
プロパティーが端折られてて困る事が多々(つд`)
Win32API自体がサブセットな実装だからしゃーないんだろうけど。
04864852007/12/08(土) 09:46:11
>>484
こんなんあるのか。ちょと見て見よ。
質問主じゃないけど参考になりましたわ。
0487デフォルトの名無しさん2007/12/08(土) 12:16:38
そもそもミリ秒単位の情報って持てるの?
0488デフォルトの名無しさん2007/12/08(土) 14:01:28
持てるよ
0489デフォルトの名無しさん2007/12/08(土) 14:35:54
バイト配列AとBがあって、配列Aの中から配列Bを検索するにはどうしたらよいですか?
byte[] A = byte[0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]
byte[] B = byte[0x03, 0x04, 0x05]
だとしたら、3を返してほしいのですが…
0490デフォルトの名無しさん2007/12/08(土) 15:04:39
A.Intersect(B).First()
0491デフォルトの名無しさん2007/12/08(土) 15:24:56
そんなんあったっけ?
っていうかそれ目的違うんじゃねーの?
普通に考えて。
0492デフォルトの名無しさん2007/12/08(土) 15:31:01
byte[] A = new byte[] {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
byte[] B = new byte[] {0x03, 0x04, 0x05};
string a = System.Text.Encoding.ASCII.GetString(A);
string b = System.Text.Encoding.ASCII.GetString(B);
a.IndexOf(b)

Encoding.ASCIIで、バイト列がそのまま文字列になるなら、これでいけると思うけど。
だめなら、素直にforでまわすとか。
04934892007/12/08(土) 15:32:38
>>492
ありがとうございます。
早速試してみます。
0494デフォルトの名無しさん2007/12/08(土) 15:36:49
試すなよそんな方法w
04954892007/12/08(土) 15:42:44
ダメでしたw
StringBuilderで1バイトずつ連結して、stringのIndexOf使うことにします。
0496デフォルトの名無しさん2007/12/08(土) 15:46:52
えー。素直に二重ループじゃだめなのか?
int indexOf(byte[] A, byte[] B) {
for (int i = 0; i <= A.Length - B.Length; ++i) {
int j;
for (j = 0; j < B.Length; ++j)
if (B[j] != A[i + j]) break;
if (j == B.Length) return i;
}
return -1;
}
0497デフォルトの名無しさん2007/12/08(土) 15:59:59
16進数文字列化して検索ってしたことならあるな、手抜きのために。
04984892007/12/08(土) 16:00:36
>>496
二重ループのが簡単そうですね。
希望通りの結果が得られました。
ありがとうございました。
0499デフォルトの名無しさん2007/12/08(土) 16:02:25
>>496
先生、止まりません><
0500デフォルトの名無しさん2007/12/08(土) 16:34:42
素直にLINQ使えよ
0501デフォルトの名無しさん2007/12/08(土) 18:09:40
ちょっと教えてください。

class A
{
  public class A
  {
    public uint uiId;
    public StringBuilder sbSTR;
    public byte[] bData;
  }
  public static List<A> Alist = new List<A>();

  public staitc SetData()
  {
    A _A = new A();
    _Aにデータ詰める
    Alist.Add(_A);
  }
}
このクラスAはFrom1等から呼び出して使う感じなんですが、ここでAlistに入れたデータはFrom1の生存
期間中はずっとデータを保持してて欲しい為、AlistとSetData()をstaticで宣言しております。
しかしデータを詰める為のテンポラリー領域として_Aをnewしてリストに突っ込んでます。この_Aの生存期
間てどうなるのでしょうか?また_Aの生存期間が過ぎた時にAlistに追加されてる_Aも当然消えるのでしょ
うか?
0502デフォルトの名無しさん2007/12/08(土) 18:14:05
>>501
> このクラスAはFrom1等から呼び出して使う感じなんですが、ここでAlistに入れたデータはFrom1の生存
> 期間中はずっとデータを保持してて欲しい為、AlistとSetData()をstaticで宣言しております。
意味わかんね。FormAがAのインスタンス保持すりゃすむ話。
0503デフォルトの名無しさん2007/12/08(土) 18:23:00
生存期間とか別に気にしなくていい
誰かが使ってる(使える状況にある)限りは絶対消えない
0504デフォルトの名無しさん2007/12/08(土) 18:48:49
>>502
んとA内にはDllImportして使う他のメソッドも定義されてて全部staticで定義
されてるので、Form1側でAのインスタンス作ろうとするとエラーになるのです。

>>503
なるほどです。ちなみに色々本読んだりして探してるのですが、newした変数
/インスタンスの生存期間とか詳しく説明された物って全然見かけないのは、
気にしなくて良いからなんでしょうか?
どうしてもCの考えで、auto/static/mallocした領域に照らして考えてしまうの
で、この変数消えるんじゃね?と思える状況に多々遭遇しております。まぁク
ラスの設計がヘボなんですけど…。
こう言うメモリ回りの話しが詳しく書かれた物て何か無いのでしょうか?
0505デフォルトの名無しさん2007/12/08(土) 18:57:17
そういうことをいちいち気にしなくて済むようにするためのGC
他から参照されてないオブジェクトはそのうちGCに消される。それだけ。
0506デフォルトの名無しさん2007/12/08(土) 19:01:13
オブジェクトは到達可能ならば消えないし
到達不可能になると消える
それがGC
05075012007/12/08(土) 19:26:42
なるほど、そういう文化と言う事ですか。
ありがとうございました。
0508デフォルトの名無しさん2007/12/08(土) 21:40:28
文化じゃねないよ。仕様だよ。
0509デフォルトの名無しさん2007/12/08(土) 21:55:12
Cになれてるなら、
どこからも参照されなくなったら勝手にfreeされるmallocだと思っとけ。
0510デフォルトの名無しさん2007/12/08(土) 22:03:13
GCされる頻度って調整できるんですか?
この辺はパフォーマンスに大きく影響する部分ですよね
0511デフォルトの名無しさん2007/12/08(土) 22:06:21
自分でGC.Collect呼べば
構造体をうまく使えば
0512デフォルトの名無しさん2007/12/08(土) 22:06:53
GCは必要になったら起動される。
無理やり起動することはできるがお勧めしない。
よって直接的な調整の余地はあまり無い。
大量にインスタンスを生成して参照しなくなれば頻度は上がるし、
あまりインスタンスを作成しないなら下がる。
細かい話はいろいろあるけど、まずはそれだけ。
0513デフォルトの名無しさん2007/12/08(土) 22:09:10
ゲームなど、シビアなインタラクションが要求されるような場合は別だが、
多くの場合は細かく気にする必要は無い。
インスタンスを無駄に生成しないようにある程度注意するくらい。
0514デフォルトの名無しさん2007/12/08(土) 22:19:55
大抵の場合自分がやるよりうまいことやってくれるよ
0515デフォルトの名無しさん2007/12/08(土) 22:22:07
確かに3Dゲーム系では.net避ける人多いですね
0516デフォルトの名無しさん2007/12/08(土) 22:24:31
MDX2.0が立ち消えになっちまったからなあ
0517デフォルトの名無しさん2007/12/08(土) 22:41:44
つXNA
0518デフォルトの名無しさん2007/12/08(土) 22:47:13
あんなもの使えるかよ
0519デフォルトの名無しさん2007/12/09(日) 00:01:55
マネージドDirectXでいいじゃない
0520デフォルトの名無しさん2007/12/09(日) 00:13:54
あんなもん自分でラッパー書いたらしまいや
0521デフォルトの名無しさん2007/12/09(日) 00:25:52
>>519
>>516からの流れなのにMDXを持ち出すのはおかしいだろ
0522デフォルトの名無しさん2007/12/09(日) 00:38:30
string modosu = this.Sample_List.SelectedItem.ToString();
modosu = "@\"" + "C:\\test\\" + modosu + ".txt\"";
this.textBox1.Text = modosu;

StreamReader sr = new StreamReader(modosu, Encoding.GetEncoding("Shift_JIS"));

パスを変数化して、StreamReaderの第一引数に入れているのですが、接続されません。
ちなみに変数"modosu"の中身を直接書き込むと接続されます。
@"C:\test\時間集計.txt"
何が原因なのでしょうか?
0523デフォルトの名無しさん2007/12/09(日) 00:40:23
>>522
解決しました~~;
0524デフォルトの名無しさん2007/12/09(日) 00:41:46
@と¥がいらなそう
0525デフォルトの名無しさん2007/12/09(日) 00:42:40
.txt\"";
0526デフォルトの名無しさん2007/12/09(日) 00:44:14
>>523
もうくるな
0527デフォルトの名無しさん2007/12/09(日) 01:35:23
すいません質問があります。

あるクラスAを継承したクラスBがあるとして、
クラスBのインスタンスからはAのpublicメンバを使用できないようにすることは出来るでしょうか?
例えばFormクラスを継承したMyFormクラスを作ったが、Myformインスタンスでは勝手にクライアントサイズなどを変えてほしくない、などです。
0528デフォルトの名無しさん2007/12/09(日) 01:49:12
できません
0529デフォルトの名無しさん2007/12/09(日) 01:50:31
>>528
出来そうと思いましたが、そうでしたか。ありがとうございました。
05304802007/12/09(日) 02:56:59
>>484 >>485 レス有難うございます。
IntPtrってなんぞ、、、ってところから始まって、DllImportを初めて使ってみるまでに一日かかりました。ウヒー。
とりあえず日付は更新できるようになったものの、本当にこの書き方でよいのか激しく不安です。
添削していただけると有難いです。
[DllImport("coredll.dll")]
private static extern IntPtr CreateFile(String lpFileName, UInt32 dwDesiredAccess, UInt32 dwShareMode, IntPtr lpSecurityAttributes,
UInt32 dwCreationDisposition, UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile);

[DllImport("coredll.dll")]
private static extern bool CloseHandle(IntPtr hObject);

[DllImport("coredll.dll")]
private static extern bool GetFileTime(IntPtr handle, ref FILETIME lpCreationTime, ref FILETIME lpLastAccessTime, ref FILETIME lpLastWriteTime);

[DllImport("coredll.dll")]
unsafe private static extern bool SetFileTime(IntPtr handle, FILETIME *lpCreationTime, FILETIME *lpLastAccessTime, FILETIME *lpLastWriteTime);

public struct FILETIME{
public UInt32 dwLowDateTime;
public UInt32 dwHighDateTime;
}
public struct FileTimes{
public FILETIME CreationTime;
public FILETIME LastAccessTime;
public FILETIME LastWriteTime;
}
unsafe static public bool SetFileTimeStamps(string path, FileTimes fileTimes){
IntPtr handle = CreateFile(path, 0x80000000, 0x00000001, IntPtr.Zero, 3, 0x00000080, IntPtr.Zero);
bool re = SetFileTime(handle, &fileTimes.CreationTime, &fileTimes.LastAccessTime, &fileTimes.LastWriteTime);
CloseHandle(handle);
return re;
}
0531デフォルトの名無しさん2007/12/09(日) 03:08:18
>>529
フォームの中の使うメンバだけを公開したクラスを作ってフォームにかぶせる
0532デフォルトの名無しさん2007/12/09(日) 03:21:43
>>527
newで書き換えちゃえば呼んでも変更されないってのは出来るけど・・・お勧めはしない

public partial class Form1 : ExForm {
public Form1() {
InitializeComponent();
this.Size = new Size(500, 500);
}
}
public class ExForm : Form {
public new Size Size {
set { }
get { return base.Size; }
}
}
0533デフォルトの名無しさん2007/12/09(日) 04:09:33
例外投げればいんじゃね。
05344852007/12/09(日) 05:07:01
>>530
API周りはMSDNと見比べたけど型の設定とかは間違ってないね。
ちょっと思ったのは、FILETIMEとFileTimesの実装かな。
両方publicで外出ししてるけど、クラス内に隠蔽して、メソッドの引数は
DateTime型で貰って内部で変換した方が呼び出し元から使うのは楽な
んではないかなと。
まぁ呼び出し側で日時をどういう形式で扱ってるかによるから好きな方
法で良いとは思うけど。
05354802007/12/09(日) 05:46:26
>>534
なるほど、確かにFILETIMEは毎回ビットシフトしてlong型に直す処理を外でしていたので
DateTime型で受けて内部で処理させた方がスッキリしますね。
有難うございます。

DllImportを覚えると、一気に出来ることが増えて、まさに世界が広がった感じがします。
楽しくなってきました(´∀`)
0536デフォルトの名無しさん2007/12/09(日) 11:04:24
Wsdl.exeで登録したXMLWebサービスを削除するにはどうしたら良いの?
0537デフォルトの名無しさん2007/12/09(日) 13:11:05

Regexクラスで質問です。
あるファイルに変換前と変換後のデータが格納してあり、
文字列をその内容に従って変換したいのですが、\r\nの扱いがうまくいきません。

Regex rex = new Regex(strBefore);
strData = rex.Replace(strData, strAfter );

aaabbb → aaa\r\nbbb
(strBefore) (strAfter)

としたい場合、CRLFではなく、文字列として"\r\n"に変換されてしまいます。
エスケープシーケンスのオプションみたいなのがあるのでしょうか?
0538デフォルトの名無しさん2007/12/09(日) 13:12:49
ファイルから読み込むときに@"\r\n"を"\r\n"に変換しろ
0539デフォルトの名無しさん2007/12/09(日) 13:21:42
>>538
ありがとうございます。
うまく行きました。
0540デフォルトの名無しさん2007/12/09(日) 17:20:30
ツールチップの描画に使用されるフォント(デスクトップのプロパティのデザイン→詳細設定→ヒントで設定される奴です)を取得したいのですが、何か方法はないでしょうか。
0541デフォルトの名無しさん2007/12/09(日) 19:25:14
>>540
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.drawtooltipeventargs.font(VS.80).aspx
これ?
0542デフォルトの名無しさん2007/12/09(日) 21:10:15
抽象クラスで、フィールドとコンストラクタを継承することはできないんでしょうか?
0543デフォルトの名無しさん2007/12/09(日) 21:29:50
意味が分からない
無理に抽象的に書かなくていいから具体的にどうしたいのか書いて
0544デフォルトの名無しさん2007/12/09(日) 21:57:25
abstract class A
{
    (略)
}


class B : A
{
    (略)  
}

class C : A
{
    (略)
}


↑でクラスBとクラスCで同じようなフィールドを使って、さらにそれを同じ値で初期化するとき
クラスAのフィールドとコンストラクタが継承できたら楽だと思うんですが、できないんでしょうか?
0545デフォルトの名無しさん2007/12/09(日) 22:04:17
ベースクラスのフィールドにアクセスしたり、ベースクラスのコンストラクタを明示的に呼びたいってことか?
それならできる
0546デフォルトの名無しさん2007/12/09(日) 22:05:05
あるプログラムA(EXE、すでに起動して無限ループで待機中)でメソッドを提供し、
別のプログラムB(ASP)でこれを呼び出したいのですが、何かうまい仕組みが提供されてたりしますか?
プロセス間通信を自前で実装するくらいしか思いつかないのですが…。
0547デフォルトの名無しさん2007/12/09(日) 22:05:56
それ具象やん
0548デフォルトの名無しさん2007/12/09(日) 22:09:27
フィールドのアクセス修飾子をprivateではなくprotectedにすれば、派生クラスからもアクセスできるようになる。
ベースクラスのコンストラクタを呼びたければ派生クラスのコンストラクタを

public B() : base()
{
}

のように書けばいい
0549デフォルトの名無しさん2007/12/09(日) 22:10:01
>>545
すいません、同じ違いでした。

型名やフィールド名が"同じという意味です。

B.x
B.y

C.x
C.y

これらを一つ一つ宣言するより、親クラスから継承して
例えば全てに0等を入れて初期化する場合、コンストラクタも一緒に継承できると便利だと思うんですが……
0550デフォルトの名無しさん2007/12/09(日) 22:13:17
>>549
出来るから手動かしてみな
0551デフォルトの名無しさん2007/12/09(日) 22:19:28
>>546
リモーティング
0552デフォルトの名無しさん2007/12/09(日) 22:25:24
>>549
A.xとB.xは同じフィールドじゃなくて、たまたま名前が同じだけってこと?
protected void init(ref int x, ref int y);
みたいなの定義しといて、各コンストラクタから呼び出すとか
05535522007/12/09(日) 22:26:08
定義しといて→Aに定義しといて
0554デフォルトの名無しさん2007/12/09(日) 22:43:41
多分>>544は>>552みたいに複雑なことをやろうとしてるんじゃなくて、
継承とインスタンスがどのように挙動するかわかってないだけだと思うのだが・・・
0555デフォルトの名無しさん2007/12/09(日) 22:44:17
protectedの意味が分かれば終了だろ
0556デフォルトの名無しさん2007/12/09(日) 22:57:20
と、いうわけでアクセス修飾子の話でも。

public 何処からでもアクセス可能(アクセスレベルが低いと表現)
↑
protected 派生クラスはアクセス可能
↓
private 自分しか無理。(アクセスレベルが高い)

クラスAにposX、posY、graphic、というフィールドがあれば、
クラスAを継承したクラスBも、そのフィールドを持つ。
それらのフィールドのアクセスレベルをprotectedにしておけば、派生クラスでもフィールドに自由に代入・取り出しできる。
もしprivateだと、それぞれフィールドは存在するのに一切派生クラスからはアクセスできない、ということになる。
この場合はプロパティを基本クラスで作っておけばすれば解決できる。(というかgetとsetのアクセスレベルを分けるから大抵はこっち?かな)




0557デフォルトの名無しさん2007/12/09(日) 23:00:22
フィールドをprotectedにしちゃうのはお勧めできない
初期化はたいてい基底クラスのコンストラクタを呼べば済む
0558デフォルトの名無しさん2007/12/10(月) 00:07:18
継承なんてすんなよ。
0559デフォルトの名無しさん2007/12/10(月) 04:22:03
てか、フィールドをprotectedにするのは禁止じゃなかったか。
プロパティなら良い。
0560デフォルトの名無しさん2007/12/10(月) 10:27:11
誰が?
0561デフォルトの名無しさん2007/12/10(月) 10:29:23
オレオレ
■ このスレッドは過去ログ倉庫に格納されています