ふらっとC#,C♯,C#(初心者用) Part31at TECH
ふらっとC#,C♯,C#(初心者用) Part31 - 暇つぶし2ch1:デフォルトの名無しさん
08/09/29 12:39:47
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

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

前スレ

ふらっとC#,C♯,C#(初心者用) Part30
スレリンク(tech板)

2:デフォルトの名無しさん
08/09/29 12:40:21
C#, C♯, C#相談室 Part48
スレリンク(tech板)

WPF(XAML,XBAP,.NET3.5)GUIプログラミング
スレリンク(tech板)

Live2
スレリンク(tech板)

初心者のためのプログラミング言語ガイド Part11
スレリンク(tech板)

3:デフォルトの名無しさん
08/09/29 12:40:49
参考サイト。まずはここで検索してから。
URLリンク(www.google.co.jp)
URLリンク(homepage3.nifty.com)
URLリンク(www.atmarkit.co.jp)
URLリンク(dobon.net)
URLリンク(jeanne.wankuma.com)
URLリンク(www.labasp.net)

4:デフォルトの名無しさん
08/09/29 13:20:37
(前スレ続き)
ってゲームのセーブデータみたいな移動・コピー不可属性のことか?
あれは自分で好きにプログラム組めないからできる話。

5:デフォルトの名無しさん
08/09/29 13:24:49
スレタイの「ふらっと」ってどういう意味なんでしょう(?_?)

6:デフォルトの名無しさん
08/09/29 13:30:13
>>998
そこまで規制する必要ってのも無いとは思うけどなぁ。
機密文章の持ち出しを禁止するため?

簡単に破られても良いなら、ファイルパスがキーになってファイルの暗号化を解くとかその程度で良いんじゃないかな?

それにしても、NTFSにダビング10とかコピーワンスとかあったらいやだなぁ
保護されたファイルを開くと OSがそのプログラムを監視して そのファイルに類似したデータを作成させないようにしたりして
すごく息苦しくていやになるなぁ。



7:デフォルトの名無しさん
08/09/29 13:31:59


8:前スレ993
08/09/29 13:40:28
>>4>>6

そうです、フォルダ自身やファイル自身に属性があれば制限が可能になる
のだとは思うのですが、少なくともWindows系ではそういう制限はやはり
存在しない、ということですよね?

あればそれをそのフォルダやファイルの作成者が設定可能になっていれば
できると思うのですが、今後そういうものは追加される可能性はないでしょうか?



9:デフォルトの名無しさん
08/09/29 13:48:44
いやだから、読めることができるデータがあって、どこかに書き込みできる権限があれば、
コピー不可だろうがいくつでもコピーできちゃうでしょ、ここはプログラム板だよ?
ファイラーが提供されたものしかない世界じゃないと無理。

10:デフォルトの名無しさん
08/09/29 13:52:36
> あればそれをそのフォルダやファイルの作成者が設定可能になっていれば
> できると思うのですが、今後そういうものは追加される可能性はないでしょうか?
誰かエスパーのひと解読頼む

11:デフォルトの名無しさん
08/09/29 13:58:54
>>9
>どこかに書き込みできる権限があれば、コピー不可だろうが
>いくつでもコピーできちゃうでしょ

だから、そのデータ(=フォルダ、ファイル)に色がついていて、
色がナンであるかで、書き込みを制限する属性があれば、という
ことですよ。

>>10
その属性を、それらデータ(=フォルダ、ファイル)の作成者が、
OSのサービス機能(プロパティ->セキュリティタブ、など)を使って
設定すればそれが有効になる、というような仕組みということです。


12:デフォルトの名無しさん
08/09/29 14:00:56
>>11
その属性を律儀に守らないと無理だろ。
プログラム書いたことあるのか?

13:デフォルトの名無しさん
08/09/29 14:02:33
>>11 続き

だから、例えば、「複製作成」の許可と言った感じで、「削除」の許可
の次あたりに追加してあれば、それをチェックすることで、そのフォルダや
ファイルに色がつくわけで、

そのデータを「書き込み」する時点で、それを操作を制限する、という
仕組みということです。これが可能になれば、複製してほしくないフォルダや
ファイルというものを作ることが可能になるわけです。

14:デフォルトの名無しさん
08/09/29 14:04:20
>>12

まあ、ですから、「書き込み」という操作にも影響が及ぶような
仕組みでないといけないわけではありますですが・・・。


15:デフォルトの名無しさん
08/09/29 14:04:56
>>10
>>8 ooOO(ファッキュー)
URLリンク(www.nicovideo.jp)

16:デフォルトの名無しさん
08/09/29 14:05:58
いや、だからさ。
Explorerでのコピー操作ならそれでいいかもしれないよ?

でもさ、プログラム上、ファイルデータは単なるバイト配列として扱われるわけ。
で、単なるバイト配列を適当に作ったファイルに書き込むのを制限しようがないよね?

17:デフォルトの名無しさん
08/09/29 14:13:38
>>16

確かに、どこまでのレベルで制限するのか、という問題はありますね。

ただ、ファイルシステム上の操作と言われる操作機能では制限される、
ということにしておけば、いわゆる 「ファイラ・ソフト」 レベルでは簡単
にはコピーされないで済む、という感じにではできないでしょうか。

ファイラを、そうやって原初レベルのI/Oの操作から作成されてしまえば
確かにできてはしまうのでしょうが・・・。



18:デフォルトの名無しさん
08/09/29 14:17:29
その属性のファイルを読み込んだプログラムはファイルの作成
や書き込みが失敗するように
またほかのプログラムとの通信までできないようにOS側で徹底
的に管理するのか
そこまでやったとしても抜け道は存在するような気がするが


19:デフォルトの名無しさん
08/09/29 14:18:08
>>17 続き

少なくとも、Win32APIや.NETFramework上のファイルシステム関係のメソッド
からは制限できる、といった感じで。それをやっても、制限としては価値は
ないでしょうか。



20:デフォルトの名無しさん
08/09/29 14:22:19
>>18

フォルダやファイルのデータの中身そのもの仕掛けを作り、
それを所定のAPIやメソッドのコピー操作で書き込むときに
引っ掛ける、という感じまででいいかとは思っています。



21:デフォルトの名無しさん
08/09/29 14:28:25
一切ないね
バックアップソフト作る会社が迷惑蒙るだけだろ

22:デフォルトの名無しさん
08/09/29 14:37:06
なんにせよC#でやるべきじゃないのは確か

23:デフォルトの名無しさん
08/09/29 14:50:53
>>21-22

わかりました。アドバイスくださり、
ありがとうございました。


24:デフォルトの名無しさん
08/09/29 15:15:28
新しいFSを開発するスレはここですか?

25:デフォルトの名無しさん
08/09/29 15:16:59
いや、つまんないから。

26:デフォルトの名無しさん
08/09/29 15:29:33
>>993
拡張子を.scrにしたらコピーできなくなるよ

27:デフォルトの名無しさん
08/09/29 18:14:40
web上からデータを取得するために以下の命令文を記述しました

HttpWebResponse res = (HttpWebResponse)req.GetResponse();

さらに、webのURLが間違えていたり、たまたまサーバーがダウンしているときに
備え、try~catchの例外処理を施そう試み

try
{
    HttpWebResponse res = (HttpWebResponse)req.GetResponse();
}
catch(Exception e)
{
    ・・・・・
}

Stream st = res.GetResponseStream();
StreamReader sr = new StreamReader(st, enc);

と記述し直しました。

ところがこの状態でコンパイルを試みると、Stream st = res.GetResponseStream();で
「エラー 1 名前 'res' は現在のコンテキスト内に存在しません。」
というエラーが帰ってきました。try~catchの例外処理に何か間違いでもあったのでしょうか?

28:デフォルトの名無しさん
08/09/29 18:21:20
変数のスコープを考えろ。

それから、直接は関係ないがcatch(Exception)はやめたほうがいい。

29:デフォルトの名無しさん
08/09/29 18:21:28
そりゃスコープから外れたから。
HttpWebResponse res;
ここだけ外に出してごらん。

30:27
08/09/29 18:28:53
try文の中身を

HttpWebResponse res;
try
{
   res = (HttpWebResponse)req.GetResponse();
}

と変更してみましたが、今度は同じく Stream st = res.GetResponseStream();の部分で

「エラー 1 未割り当てのローカル変数 'res' が使用されました。」

という違うエラーが帰ってくるようになりましたorz・・・

その後ものは試しとtry文の前の命令を

HttpWebResponse res = null;

と書き直してみたところエラーも発生することなくコンパイルが通りました。
これでよかったのでしょうか?

31:27
08/09/29 18:29:37
>>28
> それから、直接は関係ないがcatch(Exception)はやめたほうがいい。

そうするよう参考書に書かれていたんですが(´・ω・`)・・・

32:デフォルトの名無しさん
08/09/29 18:36:38
初心者向けの本なんだろうからしょうがない
本当はMSDNに書いてある形でキャッチするようにしないと

33:デフォルトの名無しさん
08/09/29 18:40:03
tryで例外出してcatch後にもresを使ってるだろ。
それで未初期化のresを使う可能性があるという警告だよ。
tryブロックに入れるか、catchしたらres使う行に行かないようにしなくちゃ。

34:27
08/09/29 19:04:09
>>32
> 初心者向けの本なんだろうからしょうがない
> 本当はMSDNに書いてある形でキャッチするようにしないと

(WebException e)で受け取り、e.Messageあたりでエラーを表示するようにすればいいでしょうか?

>>33
なるほどresは全てtry文の中に収めたほうが堅牢性が増しましたか。

35:デフォルトの名無しさん
08/09/29 19:17:35
引数に渡されたStreamのデータのフォーマットが正しくないときにはどの例外を投げたらいい?
自作?

36:デフォルトの名無しさん
08/09/29 19:23:25
自作しても良いがArgumentExceptionでいいんじゃね

37:27
08/09/29 19:24:30
>>35
自作です。

よく考えたらStreamで受け取ったデータを見て、フォーマットが正しいか否かで
正しくデータを受信できたかどうか判定するのがいいかもしれません。

GetResponse();

の例外ってあまり使う機会は無いかも知れませんね。

38:デフォルトの名無しさん
08/09/29 19:30:32
> GetResponse();
> の例外ってあまり使う機会は無いかも知れませんね。

や、普通は503返されたりとかしたときの対応が必要だと思うが

39:デフォルトの名無しさん
08/09/29 20:17:36
問題は例外キャッチしたあとどうしようとしてるかだ

40:デフォルトの名無しさん
08/09/29 21:08:34
質問です。

生徒、Aさん Bさん Cさん.... がいます。
それぞれの人に、国語や数学のテストの成績があったとして、

(名前,科目,点数)

というようなデータを、それぞれの人がもつ変数に入れていくプログラムを作りたいと考えています。
ここで、(名前,科目,点数)のデータはイベントでランダムに送られてきます。

Aさん、Bさん、... は、生徒クラスを作成し、1人1インスタンスでnewしたとして、

問題1)Aさん、Bさん、... 別のインスタンスを作成する方法がわからない(それぞれにユニークなインスタンス名を与える方法?)

問題2)問題1が解決したとして、ランダムに送られてきたデータを、それぞれのクラスに振り分ける方法がわからない。

というよりも、なんかもっとスマートな解決策があると思うのですが、、、

41:デフォルトの名無しさん
08/09/29 21:10:43
なんかスマートじゃない方法なら、コードが書けるような口ぶりだな。

42:デフォルトの名無しさん
08/09/29 21:11:36
普通は生徒クラスに名前プロパティ用意するんじゃね?
つかクラスに振り分けるって何よ

43:デフォルトの名無しさん
08/09/29 21:20:16
>>40
「インスタンス名」とは変数名のことだと思うが、そんなものはユニークである必要どころか
名前をつける必要すらない。(データベースのレコードに名前なんて必要ないように)

単純化していえばデータ構造は「生徒クラス」のリストでよく、
要は名前なら名前からそれに一致する「生徒クラス」のインスタンスを
検索できる機能を考えればそれで済む。

それができれば問題2も自動的に解決するでしょ。

44:デフォルトの名無しさん
08/09/29 21:20:40
>>40
class クラス:List<生徒> // 生徒Collectionでもおk
{ String 名前; int Get平均点(科目名 科目);}みたいなクラスにAddしていけばいいんじゃない?


45:デフォルトの名無しさん
08/09/29 21:20:51
Dictionary<string, Student> dic = new Dictionary<string, Student>();


Data[] data = GetData();

foreach(Data d in data)
{
if(dic.ContainsKey(d.Name) == false)
{
dic.Add(d.Name, new Student(d.Name, d.Subject, d.Point));
}
else
{
dic[d.Name].AddResult(d.Subject, d.Point);
}
}

こんなんかね

46:デフォルトの名無しさん
08/09/29 21:29:46
テキストエディタ作ってみました
TeraPad風ですが、プラグインの追加機能などあります
URLリンク(www.dotup.org)

47:デフォルトの名無しさん
08/09/29 21:32:37
素早い返信ありがとうございます。

>>41さん
すいませんでした。

>>42さん
プロパティに名前を入れておき、送られたデータに対して名前が一致するかしらべるメソッドを用意して、一致すれば科目データを入れるというやり方の場合、
すべてのインスタンスにデータを送る方法がわかりません。そして、そういう処理は効率が悪いと思います。
変な説明で申し訳ないです。

>>43さん
「生徒クラス」のリスト、という意味が分かりません。クラスのリスト?クラスをリストにする?っていう意味が・・・
リストの項目にクラスのアドレスを入れておいて呼び出す?



48:デフォルトの名無しさん
08/09/29 21:44:11
>>45
そのStudentのコンストラクタ引数は不自然とおもふw

49:デフォルトの名無しさん
08/09/29 21:48:42
dic.Add(d.Name, new Student(d.Name, new[] { new SubjectScore(d.Subject, d.Point) });
こんな感じか

50:40
08/09/29 21:51:08
具体的な例文まで示していただいて頭が上がりません。

>>44さん

class クラス:List<生徒>

の意味が分かりません。すいません勉強不足です。
Listを継承してるというのは分かるんですが、<生徒>という部分がどういう意味なのか、、、

>>45さん

Dictionaryの次の< > でくくった部分の意味が44さんと同じくどういう意味を示すのか分かりません。

Data[] data = GetData(); の意味が分かりません。要素数を指定しない場合の配列は後で要素数をしていしないといけないのでは?

51:デフォルトの名無しさん
08/09/29 21:51:59
オウム返しに聞くな
馬鹿丸出しじゃないか

52:デフォルトの名無しさん
08/09/29 21:59:33
ちなみにList<T>を継承するのは非推奨だからね

53:デフォルトの名無しさん
08/09/29 21:59:35
>>51
まあしかし、そういうスレでしょ。

>>47
リストが分からないならとりあえず配列だと思えばいいよ。
「生徒クラス」の(インスタンスの)配列。

その配列の中から、名前なら名前を使って目的の「生徒クラス」のインスタンスを
検索する方法を考えればいい。

他の人が書いているようにList<T>とかDictionary<T>を使った方が簡単なんだけど、
いきなりそれらのクラスを理解しろって言っても無理っぽいからまずは配列で
やってみたら?

54:デフォルトの名無しさん
08/09/29 22:00:47
点プレにこのあたりのリンクも必要なんじゃね?
URLリンク(ufcpp.net)
URLリンク(msdn.microsoft.com)
URLリンク(msdn.microsoft.com)


55:デフォルトの名無しさん
08/09/29 22:01:08
ごめんDictionary<T>ってそんなのないなw

56:デフォルトの名無しさん
08/09/29 22:03:48
>>50
Dictionary
URLリンク(msdn.microsoft.com)
まあこれを読め

配列は

int[] array = GetArray();

...

int[] GetArray()
{
return new int[]{ 1, 3, 5 };
}

こんなことも出来るんだ

57:デフォルトの名無しさん
08/09/29 22:09:58
名前だけをキーにしてdicに入れたら、複数の教科に対応できないじゃん。
いいの?


58:デフォルトの名無しさん
08/09/29 22:14:30
>>57
複数の強化に対応できない、ってのは意味不明だけど、
>>40の話はとりあえず名前のみで検索できれば必要十分に聞こえるけど。

59:40
08/09/29 22:16:46
みなさん本当にありがとうございます。

馬鹿丸出しで申し訳ないですが、みなさんのアドバイスが充分に理解できませんでした。
コメントや参照サイト先をじっくりと読んでみます。

解決の方法は示して頂きましたので、あとは自分で理解してみます。

こんな初心者の為に貴重な時間を裂いていただき本当にありがとうございました。
では

60:デフォルトの名無しさん
08/09/29 22:27:50
>>57
それぞれの生徒が教科と点数のセットのコレクションを持てばいい

61:デフォルトの名無しさん
08/09/29 23:38:39
>>58
Aさんの国語の成績、数学の成績ってデータが入ってきたら、「A」だけのキーでdicに
入れてたら、片方の成績しか入らないじゃん。

62:デフォルトの名無しさん
08/09/29 23:42:01
RDB意識すると、こんな感じかね

      *   1         1   *
Student ------ ExamResult ------ Exam
生徒        試験結果       試験

class Student {
  public string Name;
  // その他、付加情報 (e.g. 学籍番号, etc.)
  public List<ExamResult> ExamResults;
}

class Exam {
  public string Name;
  // その他、付加情報 (e.g. 実施日時, etc.)
  public List<ExamResult> Results;
}

class ExamResult {
  public Exam Subject;
  public Student Student;
  public int Score;
}

List<Student> students;
var stu1 = students.Single(s => s.Name == "鈴木"); // 生徒の検索
stu1.ExamResults.Single(r => r.Subject.Name == "国語" && r.Subject.Date == new DateTime(2008, 7, 10)).Score; // 成績の参照
stu1.ExamResults.Add(new ExamResult { Subject = exam1, Score = 80 }); // 成績情報の追加


63:デフォルトの名無しさん
08/09/29 23:45:32
>>49
は配列を入れてるZE


64:デフォルトの名無しさん
08/09/29 23:58:48
>>61
いや意味わからんよ。
だからDictionary使うのであれば、Valueは「生徒(の成績)クラス」のインスタンスなんだよ?


65:デフォルトの名無しさん
08/09/30 10:46:45
staticなクラスとかって、どういう時に使うものなんでしょうか?
無理して使う位なら普通のクラスにしてインスタンス生成した方が
いいんでしょうか?
インスタンス生成しなくて良いという事位しか分かりません…。

66:デフォルトの名無しさん
08/09/30 10:57:37
大雑把に言うと状態を持たない(フィールドがない)ことを保証できるクラスならstatic classにできるな
Mathとかね
まあ慣れん間はわざわざ作ることもないか

67:デフォルトの名無しさん
08/09/30 11:15:06
なるほど。「フィールドがない」というパターンで考えると
分かり易いですね。参考になりました。有り難う御座いました。

68:デフォルトの名無しさん
08/09/30 13:19:51
フィールド持っててもOO的に複数のクラスと関連があるけど
決してそのクラスがほかのクラスの参照を持つわけではなかったりした時
staticクラスにする方がいいの?

69:デフォルトの名無しさん
08/09/30 13:31:25
フィールドが全部static readonlyまたはconstでない限りはやめたほうがいい

70:69
08/09/30 13:38:53
static readonlyっていうのはおかしいな
同じメソッドを同じ引数で呼び出したらいつも同じ結果が得られるならstaticでおk

71:デフォルトの名無しさん
08/09/30 16:16:17
web上で指定した名前のhtmlファイルやtextファイルが存在するかどうかをチェックするには
どういうプログラムを組めばいいでしょうか?

req = (HttpWebRequest)WebRequest.Create("URLリンク(hoge.com)");
HttpWebResponse res = (HttpWebResponse)req.GetResponse();

if ("URLリンク(hoge.com)".Equals(res.ResponseUri))
{
Console.Writeline("指定されたtxtファイルはありましたよ( ´∀`)b");
}

のようなプログラムを組めばよろしいでしょうか?
それとももっと適切なプログラムがありますか?

72:デフォルトの名無しさん
08/09/30 16:22:44
何をもって存在したのかという定義は?
res.StatusCode が200ならというだけじゃダメなのかな。

73:デフォルトの名無しさん
08/09/30 16:23:21
200つーか、 HttpStatusCode.OKか

74:デフォルトの名無しさん
08/09/30 16:29:22
リダイレクト考えると大変かもね
FileNotFoundのときにリダイレクトで200 OKな404.html返してきたり

75:デフォルトの名無しさん
08/09/30 16:42:49
>>71
それだと HTTP GET してしまうので
req.Method = "HEAD"; するとか

76:71
08/09/30 16:54:42
>>72-74
そうなんですよ。リダイレクトするサーバーだと指定したファイルが存在しない
違うページに飛ばされた上で200:OKが返されたりするんで判定に使うには
今一歩信頼性が無いんです。

77:デフォルトの名無しさん
08/09/30 17:02:39
いやだから定義は?
URL完全一致なの?
別の場所にリダイレクトするけど同じファイル名だったりするのはどうなの?

78:デフォルトの名無しさん
08/09/30 17:03:28
とは言えどうしようもないんじゃないかなHTTPの仕様上
リダイレクトされたら存在しないとするってんなら多少は簡単になるが
存在しなくても200 OKを返すって挙動も可能なんだし(負荷が大きくなるから普通はしないだろうが)

79:71
08/09/30 17:08:26
>>77
はい、指定した場所にURLが一致するファイルが存在しなければ
そのURLは無効というふうに判断したいです。
リダイレクトされた場合は存在しないと判断したいです。

80:デフォルトの名無しさん
08/09/30 17:14:07
あと、どっちかというと

Uri uri = new Uri("URLリンク(hoge.com)");
if (uri.Equals(res.ResponseUri))

だろうなあ。

81:デフォルトの名無しさん
08/09/30 18:15:00
HttpWebRequestのメンバにリダイレクトを処理するかどうかのプロパティあったろ。
それ無効にしといて、200帰るかどうかみりゃいいんじゃないのか。

82:デフォルトの名無しさん
08/09/30 18:18:29
>リダイレクトを処理するかどうかのプロパティ
そんなのあったのか、知らなかった

83:デフォルトの名無しさん
08/09/30 19:00:04
ListViewやStringなど標準ライブラリのソースを見る方法はないですか?

84:デフォルトの名無しさん
08/09/30 19:07:21
ちょっとは検索しろ

85:デフォルトの名無しさん
08/09/30 19:08:13
MSのを見るのは会社の規模&審査とすさまじい金額がかかったはずなので、MONOのソースでも見たら?

86:デフォルトの名無しさん
08/09/30 19:11:02
URLリンク(www.codeplex.com)

87:デフォルトの名無しさん
08/09/30 19:12:52
>>85
今は閲覧目的に限り無償一般公開されてるんだよ

88:デフォルトの名無しさん
08/09/30 19:52:54
へー

89:デフォルトの名無しさん
08/09/30 20:07:15
独学でC#はじめたんですがsetとgetの使い方がよくわかりません。
よろしければ御教授ください、お願いします。

90:デフォルトの名無しさん
08/09/30 20:09:22
それを言うなら御教示だ

91:89
08/09/30 20:30:45
>>90
すみません間違えました

92:デフォルトの名無しさん
08/09/30 20:31:23
>>89
プロパティのことか?
強いて言うなら、変数っぽいメソッドを作るための仕様という感じかな?
C#の入門サイトで理解できなかったら、いっそうのこと他の言語のサイトも見てみると理解できることもあるかもしれない。

たとえばTextBoxでTextプロパティがあるけど、これをプロパティを使わないでやるとしたら
textbox1.SetText("hogera");
String hoge = textbox1.GetText();と書かなければならない。

もちろん
class TextBox
{
 public String Text;
}
として公開してしまえばtextbox1.Text = "hogera";で書き込み読み込みができるが、
SetText(String value)
{ // ReadOnlyの時は変更禁止 (こういう処理を副作用と言う)
  if (!this.ReadOnly)   this.str = value;
}
というようなことはできなくなる。これをできるようにするためのものがプロパティ
public String str; // Textの実体。こんなダサイ名前をつけるのはよろしくないけど
public String Text{
 get { return this.str;}
 set { if (!this.ReadOnly)   this.str = value;}
}
これでtextbox1.Text = "hoge"とかができるようになる。
また、副作用のないプロパティは(今後、副作用を設定するかもしれないので必要)
public String Text { get; set;}と書くことができる


93:89
08/09/30 20:42:27
>>92
すごく丁寧な説明ありがとうございます。なんとか理解できました。

94:71
08/09/30 20:43:19
>>81
どうもです。

req.AllowAutoRedirect = false;

でオートリダイレクトを拒否することができるようになりました( ´∀`)ノシ

95:デフォルトの名無しさん
08/09/30 20:45:20
>>92
それだったらメソッドで書けばいいだろ
なんでプロパティ使うんだよ

96:デフォルトの名無しさん
08/09/30 20:46:52
>>95
だったら、とはどういう意味?

97:デフォルトの名無しさん
08/09/30 20:47:17
プロパティにする利点は使う側にある

98:デフォルトの名無しさん
08/09/30 20:54:38
String と string ってどうちがうの?

99:デフォルトの名無しさん
08/09/30 20:55:50
まったく同じであることが言語仕様に明記されています

100:デフォルトの名無しさん
08/09/30 21:00:25
ごめんなさい

101:デフォルトの名無しさん
08/09/30 21:22:37
質問です。
クリップボードからテキストボックスに文字を貼りつけています。
単に貼りつけると、テキストボックスで文字入力できなくなるので、
・クリップボードの文字をメモリーする。
・クリップボードの文字がメモリーと異なるときは、貼りつける。
・クリップボードの文字がメモリーとおなじときは、なにもしない。
という処理を考えました。

clipboardwatchtimer.Interval = 500;
clipboardwatchtimer.Enabled = true;

private void clipboardwatchtimer_Tick(object sender, EventArgs e){
if (Clipboard.ContainsText()) {
string clipboardTextBefore = (Clipboard.GetText());
System.Threading.Thread.Sleep(200);
string clipboardTextAfter = (Clipboard.GetText());
if (clipboardTextAfter != clipboardTextBefore)
{textBox1.Text = (Clipboard.GetText());}
}}
これで、4回は動くのですが、そのあとは取得できなくなってしまいます。
アドバイスお願いします。


102:デフォルトの名無しさん
08/09/30 21:27:03
すみませんが、何をおっしゃっているのか理解できません

103:デフォルトの名無しさん
08/09/30 21:38:31
string clipboardTextBefore = "";

private void clipboardwatchtimer_Tick(object sender, EventArgs e){
if (Clipboard.ContainsText()) {
string clipboardTextAfter = (Clipboard.GetText());
if (clipboardTextAfter != clipboardTextBefore)
{textBox1.Text = clipboardTextAfter;
clipboardTextBefore = clipboardTextAfter}
}}

こうじゃないかな
タイマーの中でThread.Sleepとかやらん方がいいと思うよ

104:デフォルトの名無しさん
08/09/30 21:44:42
>>101
何のための機構かよくわからないし
500msごとに200msストップするようなアプリケーションは糞過ぎて使い物にならないと思うんだが

>単に貼りつけると、テキストボックスで文字入力できなくなるので、
では聞くけど、今の状況ならまともに文字入力できるのですか?
何でも良いから適当に文字を入力してみてください。

>clipboardwatchtimer.Inter(ry
・500ms ごとに200msほどユーザの操作を無視する
・その200msの間にクリップボードがたまたま変更されていたら
_・textbox1.Textに入力した文字を削除してクリップボードの内容に置換する

何がしたいのかわからない。

ひょっとして
String clipboradTextBefore = "";

private void clipb(ry_Tick(Object Sender,EventArgs e)
{
                         if (Clipboard.ContainsText())
                         {
                                  String clipboradTextNow = Clipboard.GetText();

                                   if (clipboradTextNow != clipboradTextBefore)
                                   {
                                            textBox1.SelectedText = clipboradTextNow;
                                            clipboradTextBefore = clipboradTextNow;
                                   }}}} //行が長すぎるってしかられた



105:デフォルトの名無しさん
08/09/30 21:49:30
>>103
なるほど。
ありがとうございました。


106:デフォルトの名無しさん
08/09/30 22:07:46
>>104
ありがとうございました。
SelectedTextだと追記なんですね!
ちなみに、いまの状況でいちおう文字入力は試してうまくいってました。


107:デフォルトの名無しさん
08/09/30 22:13:33
>>101
だからお前は基礎から学べと言ってるだろ
2度と来るな

108:デフォルトの名無しさん
08/09/30 22:30:51
初心者を煽る荒らしはほんと二度と来ないで欲しいんだけど

109:デフォルトの名無しさん
08/09/30 22:42:47
初心者を甘やかす荒らしはほんと二度と来ないで欲しいんだけど

110:デフォルトの名無しさん
08/09/30 22:50:13
下らんレスの応酬はそれこそ荒らし行為そのものだから二人とも止めとけって。
しかし、初心者っていっても程度問題だと俺も思うけどな。

確かに初心者って真面目に学習してても分からないところ出てきたりするから
そういうのを質問するスレ(つまりここ)があっていいと思うんだが、
最初から地道に学習することを放棄してる奴のケツを拭いてやるなんて作業は
普通の人間はお断りだろ。

それ以前に「日本語の文章表現の初心者」まで救ってやる必要なんてさらさらないと思う。

111:デフォルトの名無しさん
08/09/30 22:52:49
お前の意見を取り入れる気はさらさら無いがな。

112:デフォルトの名無しさん
08/09/30 22:53:55
>>1を読めない奴は二度と書き込むなよ

113:デフォルトの名無しさん
08/09/30 22:59:39
>>1にあてはまらない書き込みがあるの?

114:デフォルトの名無しさん
08/10/01 00:04:19
>>1をC#でおながいします。

115:デフォルトの名無しさん
08/10/01 00:08:17
>>1 なんかいちいち読むかよ。

116:デフォルトの名無しさん
08/10/01 00:33:37
>>1

117:デフォルトの名無しさん
08/10/01 01:03:52
制限時間付きオセロを作りたいのですが、どの様にすれば良いのでしょうか?

118:デフォルトの名無しさん
08/10/01 01:04:59
オセロのアルゴリズムとGUIを作ればいい

119:デフォルトの名無しさん
08/10/01 01:15:32
俺もオセロ作っているんだけど

①どこに石をおけるかを調べる
置ける場所を保存
どこに置くか選ぶ
置いた場合どの石が裏返るから調べる
相手や自分の置いた石を盤面に反映する
①ヘ

それぞれどのクラスに記述すればいいかわからなくなる

120:デフォルトの名無しさん
08/10/01 01:18:51
>>119
オブジェクト指向な人々から見るといろいろ意見はあるんだろうけど、
あんまり気にせずまとめて作っちゃえばいいんでね?

121:117
08/10/01 01:20:21
自分はほとんど知識がないのに今日の朝7時までに提出しろと言われたもので・・・


死亡フラグですよね?

122:デフォルトの名無しさん
08/10/01 01:21:16
>>119
これ読めば?
コンピュータ麻雀のアルゴリズム―AIインターフェイスと思考ルーチンを作る (I/O BOOKS)

123:デフォルトの名無しさん
08/10/01 01:21:33
>>121
うん。

124:デフォルトの名無しさん
08/10/01 01:21:45
>>121
無理諦めろ
サボってたお前が悪い

125:デフォルトの名無しさん
08/10/01 01:23:13
本すすめるならこっちだろ

リバーシのアルゴリズム C++&Java対応―「探索アルゴリズム」「評価関数」の設計と実装 (I・O BOOKS) (単行本)


126:デフォルトの名無しさん
08/10/01 01:26:15
どこに置くかを決定するアルゴリズムは面倒そうだね。
簡単なのは、四隅、端、その他、って感じで順位づけをしておいて、
置けるときに置く、って感じかな。

127:デフォルトの名無しさん
08/10/01 01:28:39
>>121
俺昔作った奴あるけど人類よりはるかに強いから
お前が作ったことにして提出したら不正がばれるだろ

128:デフォルトの名無しさん
08/10/01 01:29:05
オセロは一枚返しの定跡があるから、まぁそのあたりで評価関数作れば簡単そうだが
終盤はきちんと全幅探索して読み切る

129:規制解除ヒャッホーウ
08/10/01 01:29:11
まったくわからんが俺も考えてみよう
オセロ板クラス
どこに石が置いてあるか
石を置いて石が置ける場所じゃなかったらエラーを返すとかやるクラス
入出力はインデクサとか使って置いたり置いてあるのを調べたりとかか?

相手CPUクラス
石の置いてある箇所からどこに置くのか決めて適切な位置に置く
これが一番ムズそう

審判クラス
順番になったらイベントで通知してくれたり制限時間はかったり


先に謝っておこうなんていうかごめんなさい

130:デフォルトの名無しさん
08/10/01 01:30:27
>>129
いいんだよ

131:デフォルトの名無しさん
08/10/01 01:31:21
>>129
グリーンだよ

132:デフォルトの名無しさん
08/10/01 01:35:34
夏休み最後の日まで宿題とっておいていいのは小学生までだろ

133:デフォルトの名無しさん
08/10/01 01:38:46
課題だったら、多少くそ重くても総当たりやっちゃえばいいんじゃなかろうか。

134:デフォルトの名無しさん
08/10/01 01:41:14
総当り(笑)
アホだろ


135:デフォルトの名無しさん
08/10/01 01:43:21
もうランダムで置く場所決めればいいじゃん

136:119
08/10/01 01:44:23
>>129
大体そんな感じだろうと思って作ってみたら
CPUクラスで盤面情報を取得したり、どこに置くか?置けるのか?
などが、オセロクラスと機能が微妙にかぶるんですよね
それでこんがらがっちょになるわけで。

よくあるオブジェクト指向の考え方の例で
人間クラス>学生クラス。名簿クラス。なんかがあるけど
こういう考えで作ろうと思うと、非常に難しい

どこに置けるかなどは、オセロ板が考えるんじゃなくて人間が考えるわけで
盤面の情報も頭の中にあるわけで、じゃあ、盤面は石の状態だけ保存させておいたほうがいいのか
とか考えて、でも、CPUクラスごとにルールクラスを保持させるのも変な感じだし
とまあ、こんな感じで途方にくれてます

137:デフォルトの名無しさん
08/10/01 01:52:17
>>136
とりあえずCPUは後回しにして
人間二人が交互に打てるところまで作れば?

138:デフォルトの名無しさん
08/10/01 02:02:48
>>130
>>131
どうも
>>136
どこに置けるか?とかは
オセロ盤クラスの置いてpublicにするかもわからんなー
そうすればCPU側やUI側(マウスが置けないマスに入ったら×マークを表示するとか)とかからも使えるような気がする

139:デフォルトの名無しさん
08/10/01 04:02:51
IBMとマイクロソフトが作った昆虫のゲームの名前なんでしたっけ?
dllで昆虫を作ってプログラマーが競い合うものなんだけど

140:デフォルトの名無しさん
08/10/01 04:16:08
上の方見て、何となくClipboardWatcherというクラスを作った
イベントはまだ実装してない(Trace.WriteLineしてるだけ)けど、
コメントほとんどなしの状態で240行程度

141:119
08/10/01 04:17:27
相手と自分を同じクラスで処理してたから混乱していたのかも
Playerという基底クラスを作って
先手、後手の派生クラスを作って処理してみます

142:デフォルトの名無しさん
08/10/01 07:26:15
同じ自作コントロールを複数生成したいが、
他のフォームで使う予定はまったく無い、
といった場合、ユーザーコントロールを作るより、
フォームのファイル内に自作コントロール用のクラスを作ったほうがいいですかね?

143:デフォルトの名無しさん
08/10/01 07:32:46
>>141
質問ついでに答えてみる。
OOPは、登場人物(モノも含む)を全て洗い出すことから始めてみるといい。

144:デフォルトの名無しさん
08/10/01 07:35:24
>>139
いじったことないけど Terrarium?

145:デフォルトの名無しさん
08/10/01 09:39:46
>よくあるオブジェクト指向の考え方の例で
>人間クラス>学生クラス。名簿クラス。なんかがあるけど

ねーよ。
いや例はよくあるけど。


146:デフォルトの名無しさん
08/10/01 10:33:21
hoge.comって実在するんだなw

147:デフォルトの名無しさん
08/10/01 13:02:16
>>140
それってコントロール派生?
私的にNativewindow使用が良いなー

148:デフォルトの名無しさん
08/10/01 16:33:12
try{
res = (System.Net.HttpWebResponse)req.GetResponse();
}
catch(WebException e)
{
}

でプロトコルエラー416:RequestedRangeNotSatisfiableが返されました。
この例外をcatchで受け、416が返ってきたときに特定の処理をさせたいと思っています。

catchの中身はどう記述すればよろしいでしょうか?

catch(WebException e)
{
   if (e.Status == HttpStatusCode.RequestedRangeNotSatisfiable)
・・・・・
}

と記述したところ、e.StatusとHttpStatusCode.RequestedRangeNotSatisfiableは
型が違うと言われてコンパイルエラーになってしまいました・・・

149:デフォルトの名無しさん
08/10/01 16:37:39
WebException.Status の解説ぐらい読めよ

150:デフォルトの名無しさん
08/10/01 16:48:45
>>148
またかよ。少しはぐぐって自分で調べろ。
「WebException プロトコルエラー」 とかでぐぐっても
解決のヒントになるページがいくつも見つかるだろ。

151:デフォルトの名無しさん
08/10/01 16:49:01
全然使ったこと無いけどMSDNのサイトをちょっと回ってみた結果、

if (WebException.Status == WebExceptionStatus.ProtocolError)
{
if (((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.RequestedRangeNotSatisfiable)
{
とかやるんでないの?
}
}
聞くより検索して、実際にやってみたほうがはやいぜ。

152:デフォルトの名無しさん
08/10/01 17:56:25
>>147
System.Windows.Forms.Timerあたりのソースを参考に、
ComponentのサブクラスでNativeWindowを使用
一応、lock, PostMessageもしてるから、多分マルチスレッドでも使える

153:デフォルトの名無しさん
08/10/01 18:03:45
>>149-151
ありがとうございますm(_ _)m

((HttpWebResponse)e.Response).StatusCode == HttpStatusCode.RequestedRangeNotSatisfiable

で通りました。Responseプロパティの中にさらにプロパティStatusCodeがある
とは思い至りませんでした(´・ω・`)

154:デフォルトの名無しさん
08/10/01 19:00:41
Dictionary<T>をforeach使わずに
要素の変更される処理を施すことは出来ますか?

155:デフォルトの名無しさん
08/10/01 19:01:19
はじめましてC#超初心者です
解説本を読む前に質問してます

class1.csってところを下記の様にしたんですけど
エラーになります
どうすればいいですか
Winsockで接続するテストです
何をどうしたらいいのかわかりません
よろしくお願いします
動くように書換えお願いします


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace winsock_tes
{
public class Class1
{string url = "URLリンク(www.yahoo.co.jp)";
System.Net.WebClient wc = new System.Net.WebClient();
wc.Encoding = System.Text.Encoding.GetEncoding(51932);
string src = wc.DownloadString(url);
wc.Dispose();
}
}

156:デフォルトの名無しさん
08/10/01 19:04:28
Mainメソッドにつっこめばおk

157:デフォルトの名無しさん
08/10/01 19:06:23
どっから持ってきたコードなんだ。
まずはHelloWorldからやってみないか

158:デフォルトの名無しさん
08/10/01 19:10:57
>>154
意味が分かりません

159:デフォルトの名無しさん
08/10/01 19:54:44
>>155
マルチうざい

160:155
08/10/01 19:57:42
>>158
おまえがうざい
やっぱC#スレってカスばっかだな
Delphiにしとくわ

161:デフォルトの名無しさん
08/10/01 19:59:02
>>155です
マルチじゃないですよ
他すれで聞いたらここを紹介されたので改めてこちらで聞きました
よろしく

>>159
氏ねよ粘着

162:デフォルトの名無しさん
08/10/01 20:00:39
>>160
おいおい
>>155は私ですよ
応援はありがたいけど
やりすぎです^^;

163:デフォルトの名無しさん
08/10/01 20:53:45
>>154
Dictionary<T>なんてものはBCLに存在しません

164:デフォルトの名無しさん
08/10/01 20:58:16
>>154
数字の添え字もNext系の操作も出来ないから無理だろ

165:デフォルトの名無しさん
08/10/01 21:03:14
CやC++ならまだしも、string型が正式にサポートされたC#に
いまだchar型が存在する理由ってなんでしょうか?
CやC++に慣れ親しんだプログラマ用の救済措置ですか?

166:デフォルトの名無しさん
08/10/01 21:03:19
GetEnumeratorでIEnumerator取って自分で操作すればおk

167:デフォルトの名無しさん
08/10/01 21:04:58
>>165
パフォーマンスでしょ
文字列から一文字ずつ取り出すような処理を全部一文字のstringにしたら恐ろしいことになりそう

168:デフォルトの名無しさん
08/10/01 21:07:33
いやそれ以前に char は文字で string は文字列なんで違うものだろというか

169:デフォルトの名無しさん
08/10/01 21:21:31
>>167
C#ではcharもstringもみなクラス扱いされていますがそんなにパフォーマンスに
違いが出るものですか?

>>168
stringでも1文字だけ格納すれば実質的にcharと同じになると思うんですが。

170:デフォルトの名無しさん
08/10/01 21:23:38
そもそも値型と参照型では?

171:デフォルトの名無しさん
08/10/01 21:25:01
>>169
Charは整数型ですが

172:デフォルトの名無しさん
08/10/01 21:25:11
ならintも長さ1のint[]があれば必要ないねそうだね。

173:デフォルトの名無しさん
08/10/01 21:25:40
おいおい大丈夫か

174:デフォルトの名無しさん
08/10/01 21:25:58
>>171
なにw

ユーザー定義型ではない値型で実質プリミティブ型になる。

175:デフォルトの名無しさん
08/10/01 21:26:15
>>169
charはクラスじゃねーよカス
処理速度も倍違う

>stringでも1文字だけ格納すれば実質的にcharと同じになると思うんですが。
ならねーよバカ

176:デフォルトの名無しさん
08/10/01 21:26:17
スクリプト言語だと文字列と文字を同一視するのもあるみたいだよ

177:デフォルトの名無しさん
08/10/01 21:28:02
格納してるブツがそもそも違うだろ
stringは参照位置だけどcharはユニコードだろ?

178:デフォルトの名無しさん
08/10/01 21:32:33
デュアルコアの時代に倍違うとかどうでもいいだろ

179:デフォルトの名無しさん
08/10/01 21:33:29
string だけあれば char がいらないって発想なら、
int[] だけあれば int もいらないな。

180:デフォルトの名無しさん
08/10/01 21:34:53
GCの負担にもなるから倍どころじゃないはず

stringって内部的にはやっぱりcharの配列なんだよ
fixed (char* p = str)でポインタ取れたりするw

181:デフォルトの名無しさん
08/10/01 21:36:59
ここまでstringbuilderなし

182:デフォルトの名無しさん
08/10/01 21:38:02
札束があれば札は要らないないってレベル

183:165
08/10/01 21:40:11
釣りでした(^^)v

184:デフォルトの名無しさん
08/10/01 21:40:49
>>182
それは何か変だ。
札は束にしても額が変わるだけだけど。
char と string は点と線くらい違う。次元がそもそも違うというか。

185:デフォルトの名無しさん
08/10/01 21:43:00
>>165
救済措置っつーか、C/C++やってて、文字型のない言語に移っても、べつになんにも困らんだろ。

186:デフォルトの名無しさん
08/10/01 21:43:23
string=文字列
char=文字

これはなんでこうなるの?

187:デフォルトの名無しさん
08/10/01 21:44:03
VBにも文字単体あるだろ

188:デフォルトの名無しさん
08/10/01 21:44:45
C#.NET でWindowsアプリを書くときに、メソッドをフォームのソース
(という言い方が正しいかどうか分かりませんが)に書くことも、
フォームではない別のクラスに書くこともできると思います。

ある画面内で完結する機能はフォームのソースに書くとか
なるべくフォームのソースには書かないようにするとか
方針はいくつか考えられますが、
C#.NET ではどうするのが主流なのでしょうか?

アドバイスよろしくお願いします。

ちなみに、Javaでコンソールアプリを書いたことはありますが
その程度の経験しかありません。

189:デフォルトの名無しさん
08/10/01 21:46:00
フォームをコンソールだと思えばおのずと窓口なはず

190:デフォルトの名無しさん
08/10/01 21:48:01
>>178
私も486DXで十分だと思っていた時がありました

191:デフォルトの名無しさん
08/10/01 21:51:45
>>188
フォームとはイベントドリブンを処理するわけで条件反射みたいなもん
フォームに直接関係しない機能や重複した機能は別途クラスを用意する

192:デフォルトの名無しさん
08/10/01 21:52:55
>>188
愚問だね。
OOPというかクラスを使ったプログラミングが分かればそんな疑問は持たない。

そんなウダウダ疑問を抱くのは一通り理解してからにすべきで、
物事の順序が違うんじゃないのかな?

193:デフォルトの名無しさん
08/10/01 21:54:12
>>175
え( ´・ω・)?

194:デフォルトの名無しさん
08/10/01 22:00:00
構造体です

195:デフォルトの名無しさん
08/10/01 22:00:17
>>188
主流といえるほど主流な方法はないんじゃないかな

196:デフォルトの名無しさん
08/10/01 22:01:04
フォームのボタンを押すことでクリップボードの文字列を取得する

①ボタンが押された
②FormクラスGUI-----処理するメソッドを呼び出し------>クリップボードを処理するクラス.GetText()
③FormクラスGUI<-----------文字列を返す-----------クリップボードを処理するクラス
④FormクラスGUI--------- 文字列を送る------------->テキストボックスに表示//Formクラス内で処理

クリップボードを処理するクラスを作ってしまえば、コンソールアプリにした場合も流用できる

197:デフォルトの名無しさん
08/10/01 22:13:39
窓口のお姉さんと、お姉さんが操作する端末みたいなもん

198:デフォルトの名無しさん
08/10/01 22:18:00
C#のフォームでMVCに挑戦するも、途中でめんどくさくなって結局イベントハンドラにロジック直書き。

199:デフォルトの名無しさん
08/10/01 22:22:52
DirectXならウィンドウとか単なる依り代

200:デフォルトの名無しさん
08/10/01 23:55:34
構造体の場合コンストラクタは1つだけしか無理ですか?

201:デフォルトの名無しさん
08/10/01 23:59:13
いいえ

202:デフォルトの名無しさん
08/10/02 00:00:21
と、思ったら1つも作れないのか・・・
データに値を入れるときが面倒だなぁ

203:デフォルトの名無しさん
08/10/02 00:03:46
引数なしのコンストラクタが作れないだけ
引数のあるコンストラクタはいくつでも作れる

204:デフォルトの名無しさん
08/10/02 00:03:51
>>155です
メインメソッドに突っ込むってどういう意味ですか?
VC#2008を立ち上げて
ファイル→新しいプロジェクトを開くと
Windowsフォーム、クラスライブラリー、WPFアプリケーション、WPFブラウザ、コンソール、空のプロジェクトとあります
どこを開いてどうすればよいですか?
>>155を動くように教えてください

205:188
08/10/02 00:06:02
レスをくれた皆さんありがとうございました。

フォームに直接絡む機能以外は別のクラスに書く、という感じのようですね。

206:デフォルトの名無しさん
08/10/02 00:09:02
>>204
ネタ?

コンソールでプロジェクトを立ち上げると
static void Main(string[] args)
{
}
というのが自動で書かれているからその間に実行させたいものを書く
static void Main(string[] args)
{
 Console.WriteLine("hoge");
}



207:デフォルトの名無しさん
08/10/02 00:09:50
>>155です
よくわからないけど
下記のようなエラーでました
エラー 1 プログラム 'C:\Documents and Settings\don\Local Settings\Application Data\Temporary Projects\Project1\obj\Debug\Project1.exe' は、エントリ ポイントに適切な静的 'Main' メソッドを含んでいません Project1


208:デフォルトの名無しさん
08/10/02 00:11:47
>>206さん
ありがと
今からやってみます
コンソールですね

209:デフォルトの名無しさん
08/10/02 00:13:06
>>203
引数は無理なのねーやっぱり

かといって、クラスで定義するといろいろ面倒だったり
例えばListViewのような構造をもった自作クラスを作った場合
listView1.items=listView2.items
なんてしてもsubitemsまではコピーされなかったり、
また、参照コピーになるから、これは参照しているだけだって意識しながら
やらないとどこかで値を変更されたりするし、かといって、privateにしたりすると
値をコピーしたい場合非常に面倒だし
だから、できるだけ構造体でやってるんだけど

みんなどうしてんのかな?構造体なんて数学的な関数以外使わない?

210:デフォルトの名無しさん
08/10/02 00:16:39
>>205
最初はフォームに全部書いちゃって、あとで必要になったときに
バラす、ってので十分だろ。

211:デフォルトの名無しさん
08/10/02 00:17:23
>>207
だって、Main メソッドがないじゃん。

212:デフォルトの名無しさん
08/10/02 00:22:02
>>155です
コンソールを開いて>>206さんに教えてもらった箇所に貼り付けました
デバッグしたところ黒色の画面が数秒間出て終わりました
エラー表示とかは無いです
これは成功しているのでしょうか?
下記のコードでは接続を確立しただけ?
それともリクエストしたけど
レスポンスを受け取れない?
どのような状態なのでしょうか?

static void Main(string[] args)
{
string url = "URLリンク(www.yahoo.co.jp)";
System.Net.WebClient wc = new System.Net.WebClient();
wc.Encoding = System.Text.Encoding.GetEncoding(51932);
string src = wc.DownloadString(url);
wc.Dispose();
}

213:デフォルトの名無しさん
08/10/02 00:24:24
>>212
だからお前は概念から勉強しろと言ってるだろカス

214:デフォルトの名無しさん
08/10/02 00:24:49
>>212
ブレイクポイントでもはって確認するか、src をコンソールに出力すれ

215:デフォルトの名無しさん
08/10/02 00:25:59
>>209
正確な理由は中の人しか知らないけれど、普通に考えると引数なしの
コンストラクタを用意できると配列確保したとき要素数だけコンストラクタ
呼ばないといけなくなるから、こうなっていると思われる。
・・・というかむしろ 3.0 以降の初期化はイニシャライザのほうが推奨かな
という気がする

後その質問に関して言えば「非常に面倒」というほどでもないとしか。
気になるほどでかいデータセットになるとバインディング(+同期機構利用)前提
で考えるわけだし

216:デフォルトの名無しさん
08/10/02 00:28:31
効率が重視されるときは構造体にはイニシャライザ使っちゃダメ
無駄なコピーが発生する

217:デフォルトの名無しさん
08/10/02 00:32:20
>>155です
何度もすいません
「C# src コンソールに出力」でググッたんですが
コンソールに出力されるって文字はいっぱい出てくるんですけど
コンソールへ出力の仕方わかりません
「srcをコンソールに出力」
↑これわかるかた教えてください

218:デフォルトの名無しさん
08/10/02 00:35:57
>>217
Console.WriteLine(src);

参考書でも買った方が早いよ。俺はもうレスしないから。

219:デフォルトの名無しさん
08/10/02 00:37:34
>>215
確かに構造体配列が問題なんだよねぇ。

.NETの規格上は構造体にも引数無しのコンストラクタが作れるんだけど、
配列確保のときには要素ごとにはコンストラクタが呼ばれない。
代わりにArray.Initializeメソッドを使うことになっている。
URLリンク(msdn.microsoft.com)

220:デフォルトの名無しさん
08/10/02 00:37:34
using namespace System::Diagnostics;

~略~

Debug::WriteLine(src);

221:デフォルトの名無しさん
08/10/02 00:43:48
>>220
>>1

222:デフォルトの名無しさん
08/10/02 00:44:43
違和感がするな

223:デフォルトの名無しさん
08/10/02 00:46:53
>>155です
下記のようにしてからデバッグするとエラーになりました手直しできる方お願いします
using System.Linq;
using System.Text;
// debugoncon.cs
using System;
using System.Diagnostics;
public class DebugOnConsole
{
static void Main()
{
Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
Debug.WriteLine("デバッグ・メッセージを出力");
}
}
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string url = "URLリンク(www.yahoo.co.jp)";
System.Net.WebClient wc = new System.Net.WebClient();
wc.Encoding = System.Text.Encoding.GetEncoding(51932);
string src = wc.DownloadString(url);
wc.Dispose();
}
}
}


224:デフォルトの名無しさん
08/10/02 00:49:56
>>217
1行命令文書く度に質問しているのかい?
ごくろうさま。死んでいいよ。

225:デフォルトの名無しさん
08/10/02 00:51:35
実在するサイトのアドレスを書くな!
サイトへの攻撃とみなして報告しておく

226:デフォルトの名無しさん
08/10/02 00:51:48
>>224
そだよ
粘着キモイぞ氏ね

227:デフォルトの名無しさん
08/10/02 00:52:17
回答したい奴がすればいい

228:デフォルトの名無しさん
08/10/02 00:53:35
>>225
実在するアドレス書いたら駄目だったのか
しらなんだ
これから気をつけるよ
あんまし細かいこと言ってたら神経性の病気になるよ
あなたも気をつけたほうがいいね

229:デフォルトの名無しさん
08/10/02 00:54:29
>>227
質問回答以外はあおりですね
さよなら煽りくん
もうこなくていいからね

230:デフォルトの名無しさん
08/10/02 00:54:42
Mainが二個

231:デフォルトの名無しさん
08/10/02 00:56:10
>>229
質問回答以外はあおりですね
さよなら煽りくん
もうこなくていいからね

232:デフォルトの名無しさん
08/10/02 00:56:30
>>230さん
それ>>155へのヒントですよね
メインってのを2個にすればいいんですか?
それとも現在2つあるので1つにすればいいですか?
何から何まですいません
よろしく^^

233:デフォルトの名無しさん
08/10/02 01:00:06
>>232
氏ね低学歴。お前には一生プログラム無理

234:デフォルトの名無しさん
08/10/02 01:00:32
書いてみるからちょっと待て

235:デフォルトの名無しさん
08/10/02 01:01:05
>>233
お前は>>231を100万回読んでから氏ねカス

236:デフォルトの名無しさん
08/10/02 01:01:55
>>235
質問回答以外はあおりですね
さよなら煽りくん
もうこなくていいからね

237:デフォルトの名無しさん
08/10/02 01:02:59
あわわ、あわわわ

238:デフォルトの名無しさん
08/10/02 01:03:58
>>155さんへ

お前が低学歴なのはこのスレの住民のせいではない
八つ当たりもほどほどにしておけよハゲ
お前はまず概念理解しろ
それすらもできない低学歴は2度と来るなカス
悔しいのか?悔しいから荒らすのか?
もっとポジティブな思考ができないのかねぇこの池沼はw

239:デフォルトの名無しさん
08/10/02 01:05:01
ネットワークプログラミング相談室にいたやつだな
解決したんじゃなかったのか?

240:デフォルトの名無しさん
08/10/02 01:06:02
>>236
わかったよ
あんまし怒らなくていいだろ
仲良くしよう
これからも応援よろしく^^

241:デフォルトの名無しさん
08/10/02 01:11:26
>>238
質問回答以外はあおりですね
さよなら煽りくん
もうこなくていいからね

242:デフォルトの名無しさん
08/10/02 01:14:34
C#の環境が今ないんだがこんな感じで動いた
てゆーかソース自体に問題は無いような…

using namespace System;
using namespace System::Diagnostics;
using namespace System::Net;
using namespace System::Text;

int main(array<System::String ^> ^args)
{
  String ^url = "URLリンク(www.yahoo.co.jp)";
  WebClient ^wc = gcnew WebClient();
  wc->Encoding = Encoding::UTF8;
  String ^src = wc->DownloadString(url);
  Console::WriteLine(src);
  delete wc;

  Console::WriteLine("エンターキーで終了。");
  Console::ReadLine();
return 0;
}

243:デフォルトの名無しさん
08/10/02 01:18:34
C# だとこんなん

using System;
using System.Net;
using System.Text;

class GetTest {
public static int Main(string[] args) {
WebClient ua = new WebClient();
ua.Encoding = Encoding.UTF8;
string text = ua.DownloadString("URLリンク(www.yahoo.co.jp)");
Console.WriteLine(text);
return 0;
}
}

サイトにアクセスする前に Encoding 設定するのが良くないね
DownloadString じゃ無理なのかな

244:デフォルトの名無しさん
08/10/02 01:22:20
>デバッグしたところ黒色の画面が数秒間出て終わりました
>エラー表示とかは無いです

コンソールが勝手に閉じるからだろ

245:デフォルトの名無しさん
08/10/02 01:27:56
>>242
>>243
お疲れのところ本当にありがとうございます
>>243さんのコードでエラーなくリクエスト送信は成功していることを確認できました
ありがとうございます^^

246:デフォルトの名無しさん
08/10/02 01:28:05
へッダから文字コード取れば?

247:デフォルトの名無しさん
08/10/02 01:28:28
失せろゴミ

248:デフォルトの名無しさん
08/10/02 01:33:42
>>246
GET するユーティリティの実装ってそうしてるのかな?
今回はとりあえずバイト列として読み込んでそのまま吐いて妥協

WebClient ua = new WebClient();
Stream stream = ua.OpenRead("URLリンク(www.yahoo.co.jp)");
StreamReader streamReader = new StreamReader(stream);
Console.WriteLine(streamReader.ReadToEnd());
stream.Close();
return 0;

249:デフォルトの名無しさん
08/10/02 01:35:35
>>246
応援ありがとう
ヘッダから文字列取得は今日のところはやめておくよ
ここの>>155に貼り付けたのと
リクエスト成功した>>243さんのコードとの違いを調べてみるよ
ありがと

250:デフォルトの名無しさん
08/10/02 01:45:37
>>249
2度とくるなカス

251:デフォルトの名無しさん
08/10/02 02:06:27
うっせーはげ

252:デフォルトの名無しさん
08/10/02 02:59:46
   class Program
   {
      static void Main(string[] args)
      {
         Test t = new Test();
         t.Str = new List<string>();
         t.Str.Add("dsf");
         t.Str = new List<string>();
         Console.WriteLine(t.Str.Count);
      }
   }

   class Test
   {
      public List<string> Str;
   }

問)この場合コンソールには何が表示されるでしょうか?

253:デフォルトの名無しさん
08/10/02 04:07:18
List<>が万能過ぎるんだけどあえて配列使う意味ってあるの?

254:デフォルトの名無しさん
08/10/02 04:24:17
配列の方が速いだろ

255:デフォルトの名無しさん
08/10/02 06:21:08
>>252
何かひねったのかと思いきや予想通り0なんだけど何が言いたいの…?

256:デフォルトの名無しさん
08/10/02 09:06:40
.NET 4.0って何が変わるんですか
URLリンク(msdn.microsoft.com)

257:デフォルトの名無しさん
08/10/02 09:18:07
>>256
それの日本語記事↓
URLリンク(itpro.nikkeibp.co.jp)

「詳細は,数カ月以内に発表する予定」だそうだ。

258:デフォルトの名無しさん
08/10/02 10:37:40
>>253
とりあえず複数渡したい・返したいときは配列が速い
List<>を可視メンバの戻り値や引数にしたらマイクロソフトのガイドライン違反!

259:デフォルトの名無しさん
08/10/02 11:11:51
Listは容量を増やす時にコピーが発生するし
最悪半分ぐらいの容量が使われてなかったりするし
気分的に嫌だから作業が終わったらすぐToArrayしちゃう

260:デフォルトの名無しさん
08/10/02 11:14:52
>>258
せんせー、Enumerable.ToList がガイドライン違反ですー

261:デフォルトの名無しさん
08/10/02 11:15:22
それはCollection<T>継承したの返してあとからいじれるようにしとけと
そういう意味合いだった気がするが

262:デフォルトの名無しさん
08/10/02 11:25:32
生のListを渡すってことは
自分の知らないところでListの中身が増えたり減ったりするのを許容するってことだろ
じゃあそのListを管理してるのは誰なのよという話になるだろ

263:デフォルトの名無しさん
08/10/02 11:35:26
>>260
同じの作ってFxCopで検査したら違反になるよ
ToListやToDictionaryはコンストラクタのヘルパみたいなもんなんだから
>>261の意味合いから考えれば問題ない

264:デフォルトの名無しさん
08/10/02 11:36:56
>>259
ToArrayにする作業のほうが時間がかかったりすることはないの?

>>258
可視メンバって、privateメソッドとか?

>>262
なるほど。それはありますね

追加などの作業が終わったら、配列に戻すのがいいのかな
でも、戻り値を配列にした場合、foreach内でそのメソッドを使用するとなると
AddRangeができないから、手間ですよね?

265:デフォルトの名無しさん
08/10/02 11:39:49
ガイドラインを問題にするときの可視メンバは
publicな型のpublicメンバとprotectedメンバ

266:デフォルトの名無しさん
08/10/02 11:46:56
むむ、XNAでContentPipeline作ってLoad<>でList<>返してたが、もしかしてまずいのか。

267:デフォルトの名無しさん
08/10/02 11:48:12
それこそ配列返せばいいじゃん

268:デフォルトの名無しさん
08/10/02 11:48:14
>>265
publicで使っちゃだめなのかー
確かにわけわからなくなるもんなー
ガイドライン天才だなー

269:デフォルトの名無しさん
08/10/02 11:59:57
>>266
Content.Loadってキャッシュでしょ?
弄る前提でList返すのはダメだろ
配列でも微妙だけど

270:デフォルトの名無しさん
08/10/02 12:10:27
>>269
いや中身読んだら終わりなんだけど、中が配列の配列だったからさらに配列にしたくなかっただけ。
まあいったん配列にしますわ。

271:デフォルトの名無しさん
08/10/02 12:21:10
ん?なんでList<>を返しちゃいけないのか詳しく

272:デフォルトの名無しさん
08/10/02 12:32:22
オーバーライドできないから
フィールドじゃなくてプロパティを使うのは後で実装変えられるようにするためだけど、それと同じ
URLリンク(msdn.microsoft.com)

273:デフォルトの名無しさん
08/10/02 12:33:01
>>271
List<>を返すということは元の値を直接操作してもいいよと言っているようなものだから
1人でプログラミングする分には覚えていればいいが、多分忘れる

274:デフォルトの名無しさん
08/10/02 12:50:20
C#てWindows専用?

275:デフォルトの名無しさん
08/10/02 12:58:11
配列で返すようにしたんだけど、foreachだと使えないんだけど
こういう場合どうすればいいんでしょうか?
あと、配列を初期化したい場合どうすればいいですか?

struct Point
{
  public int X;
  public int Y;
}


class Zahyou
{
  public void GetArray()
  {
    List<Point> pList=new List<Point>();
    .
    .
    return pList.ToArray();
  }
}

class Main()
{
  Point[] pArr;

  foreach()
  {
    pArr=GetArray();
  }
}

276:デフォルトの名無しさん
08/10/02 12:59:58
>>260
そいつは新しいListを作り出すメソッドだから問題なし。
内部のListの参照をそのまま見せるのがいけない。
ただしプロパティの場合は予防的コピーを返すことも非推奨となっている。


277:デフォルトの名無しさん
08/10/02 13:10:59
264とか275が何を言いたいのか良く分からない

278:275
08/10/02 13:19:15
Zahyouクラスで計算したPoint[]を
kitai内の座標を保存している配列にコピーしたいんだけど
やり方がわからないんです

foreach(Tekiki kitai in Guntai)
{
  kitai.PArray=Zahyou.GetArray();
}

↑だとエラーがでる

Tekikiのデータ構造を
Point[] PArray
ではなくて
List<Point> PList
にすれば簡単に追加できるんだけど
でも、publicでListを返したらだめなんですよね?
こういう場合どうすればいいの?

279:デフォルトの名無しさん
08/10/02 13:29:42
>>275
voidなのにreturnしてるとか、
foreachの中に何も書いてないとかは関係してないの?

280:デフォルトの名無しさん
08/10/02 13:30:17
エラーが出る(笑)

281:デフォルトの名無しさん
08/10/02 13:39:58
>>275
あとclass Main()ってのもおかしいな

282:275
08/10/02 13:46:33
>>279
>>281
すいません。要点だけわかればと思って他はさらっと書いたので
foreach内は実際はいろいろ処理してます。
List<>を返して、AddRangeで追加していたときは普通にいけましたが
配列を返すようにしたら、どうすればいいかよくわかりません

エラー内容
'kitai' は 'foreach 繰り返し変数' であるため、このメンバを変更できません。

283:デフォルトの名無しさん
08/10/02 13:48:14
どれをどこにAddRangeするのよ

284:275
08/10/02 13:57:52
変更点はList<>を返すところを配列を返すようにしただけです

struct Tekiki
{
 public string Name;
 public List<Point> pList;
}

class ShoriMain
{
 public void SetZahyou()
 {
  foreach(Tekiki kitai in Guntai)
  {
   kitai.pList.AddRange(ZahyouKeisan.GetZahyou());
  }
 }
}

static class ZahyouKeisan
{
 public static List<Point> GetZahyou()
 {
  List<Point> pList=new List<Point>();
  //いろいろ計算
  return pList;
 }
}

こんな感じだとうまくいきます。
GetZahyouをList<>ではなく、配列で返す方法がわからないんです

285:デフォルトの名無しさん
08/10/02 14:00:56
kitai.AddRange(ZahyouKeisan.GetArray());

こんなんでいいだろ
AddRangeの中で内部のListのAddRangeを呼んでやればいい

286:デフォルトの名無しさん
08/10/02 14:07:26
C#ってはやってるの?
Javaとどっちが強い?

287:275
08/10/02 14:13:02
>>285
それって同じことじゃないんですか?
List<>.AddRangeに配列を格納することはできないですよね?

288:デフォルトの名無しさん
08/10/02 14:13:12
>>286
当然Javaの方が主流。
ただし、Winアプリを作るだけならC#3.0の方が生産性が高い。

スキルとして持っていた方が有利なのはJava、
Winアプリのみを作る状況で生産性が高いのはC#。

Javaの求人の方がまだまだ多いな。

289:デフォルトの名無しさん
08/10/02 14:20:44
C#で作ったアプリって.NETだったら
linuxでもmacでも動くんだよね?

290:デフォルトの名無しさん
08/10/02 14:21:04
そして結局日本で一番多いのはVB/VBA

291:デフォルトの名無しさん
08/10/02 14:23:16
>>287
コレクションなら全て入れられる
配列でもなんでも

292:デフォルトの名無しさん
08/10/02 14:54:19
>>291
kitai.pList.AddRange(new List<Point>(ZahyouKeisan.GetToArray()));

適当に記述してたらこれでいけたっぽいんだけど、これでいいのでしょうか?

293:275
08/10/02 14:57:54
>>284の部分で

struct Tekiki
{
 public string Name;
 public Point[] pArr;
}

static class ZahyouKeisan
{
 public static List<Point> GetZahyou()
 {
  List<Point> pList=new List<Point>();
  //いろいろ計算
  return pList.ToArray();
 }
}

こういう場合foreach内はどう記述すればいいですか?

294:デフォルトの名無しさん
08/10/02 14:59:56
>>282
> エラー内容
> 'kitai' は 'foreach 繰り返し変数' であるため、このメンバを変更できません。

このエラーが重要。

foreach(Kitai kitai in Guntai){
kitai = Zahyou.GetArray(); // (A)
}

(A)のように、foreachの()内部で宣言した変数は
変更できない。だから、エラーがでてるんだと思う。

これが、

foreach(Kitai kitai in Guntai){
kitai.pArr = Zahyou.GetArray();
}

のように、変数のメンバーとかなら変更可能。

295:294
08/10/02 15:01:39
あれ。違うか。
メンバも変更出来ないんだっけ?

296:デフォルトの名無しさん
08/10/02 15:10:07
違う。
foreach(var item in collection)
のitem変数はコレクション内のオブジェクトのコピーだから、
構造体配列等の値型のコレクションにおいてそれをやってもダメだよ~って話。
変数のメンバといってもその変数自体がコピーされたものだから、メンバを変更しても
元のコレクションには当然反映されない。

参照型のコレクションだったらコピーされた変数はそのまま参照が渡されているので、
foreach内でメンバの変更が可能となる。

せっかくC#を使っているのにCでゴリゴリ書いているコードとレベルが変わらんぞ。

297:294
08/10/02 15:10:48
structだと変更不可能なようですorz

だとすると、forで回すのがよさそう。

for(int i = 0; i < Guntai.Length; ++i){
Tekki kitai = Guntai[i];
      kitai.pArr = ZahyouKeisan.GetArray();
   }


298:デフォルトの名無しさん
08/10/02 15:13:19
kitai.pList.AddRange(new List<Point>(ZahyouKeisan.GetToArray()));
まずnew Listはいらない
kitai.pList.AddRange(ZahyouKeisan.GetToArray());

pListを直接公開するのはオススメしない

>>293
List<Point>を返すメソッドで配列を返しちゃいけない
AddRangeでPointを増やしていく予定があるならpArrは配列にすべきじゃない
あとZahyouKeisanクラスがkitaiの情報をもっていないのに
Zahyouを返せる理由が分からない

299:294
08/10/02 15:22:29
>>296
解説どうもです。

300:デフォルトの名無しさん
08/10/02 15:35:35
>>293
どうしても配列でやりたいみたいだから書いてみた。

void ShoriMain(){
int now_enemyCount = enemy.pArr.Length;
Point[] tmpArr = ZahyouKeisan.GetZahyou();
int add_enemyCount = tmpArr.Length;
int new_enemyCount = now_enemyCount + add_enemyCount;
//配列の長さを変更
Array.Resize(ref enemy.pArr, new_enemyCount);

//新しい配列を末尾に追加
int count = now_enemyCount;
for (int i = 0; i < tmpArr.Length; i++)
{
count += i;
enemy.pArr[count] = tmpArr[i];
}
}

struct Tekiki{
 public string Name;
 public Point[] pArr;
}
static class ZahyouKeisan{
 public static Point[] GetZahyou(){
   List<Point> pList=new List<Point>();
  //いろいろ計算
  return pList.ToArray();
 }
}

301:デフォルトの名無しさん
08/10/02 15:38:06
変数名が now_enemyCount と new_enemyCount ってのは殺人的だぞ

302:300
08/10/02 15:42:45
VS2008使ってるなら拡張メソッド使ってもうちょっと楽に書けそうだな。

Tekiki enemy = new Tekiki();

void ShoriMain(){
enemy.pArr.Concat(ZahyouKeisan.GetZahyou());
}

struct Tekiki{
 public string Name;
 public Point[] pArr;
}
static class ZahyouKeisan{
 public static Point[] GetZahyou(){
   List<Point> pList=new List<Point>();
  //いろいろ計算
  return pList.ToArray();
 }
}

303:デフォルトの名無しさん
08/10/02 15:59:34
あまりにも汚いコードなんで俺が書き直してやったぞ

struct Tekiki
{
public string Name;
public void AddPoints(IEnumerable<Point> newPoints){
this.pList.AddRange(newPoints);
}
private List<Point> pList;
public Point[] pArr{
get { return pList.ToArray(); }
}
}

class ShoriMain
{
public void SetZahyou(){
foreach (Tekiki kitai in Guntai){
kitai.AddPoints(ZahyouKeisan.GetZahyou());
}
}
}

static class ZahyouKeisan
{
public static List<Point> GetZahyou()
{
List<Point> pList = new List<Point>();
//いろいろ計算
return pList;
}
}

304:300
08/10/02 16:07:17
あー悪い、>>303は俺です。

当然GetZahyou関数がTekkiの座標計算関係のみに使うのであれば、
Tekiki構造体のstaticメンバにしてもっと簡潔に書くことも出来る。

struct Tekiki
{
public string Name;
public void AddPoints(IEnumerable<Point> newPoints){
this.pList.AddRange(newPoints);
}
private List<Point> pList;
public Point[] ZahyouArr{
get { return pList.ToArray(); }
}
public static List<Point> GetZahyou(){
List<Point> pList = new List<Point>();
//いろいろ計算
return pList;
}
}

class ShoriMain
{
List<Tekiki> Guntai = new List<Tekiki>();
public void SetZahyou(){
foreach (Tekiki kitai in Guntai){
kitai.AddPoints(Tekiki.GetZahyou());
}
}
}

305:デフォルトの名無しさん
08/10/02 16:50:39
だめだめじゃないか

- GetZahyouメソッド
  × 戻り値がList<T>
- ZahyouArrプロパティ
  × 型が配列
  × ToArrayが内部状態のコピーとみなせる

てか、それ以前に値型使ってること自体が不適切という指摘をしてあげないと
URLリンク(msdn.microsoft.com)

306:デフォルトの名無しさん
08/10/02 17:02:04
WebBrowserコントロールで、DocumentCompleteを使ってElementにマウスイベント登録すると、
javascriptトリガー用の"href=URLリンク(hoge.com)"をクリックしたときにまでNavigate系のイベントが発生するようになるんだが、
コレは仕様なの?(登録先がBody又は対象のA要素のとき発生)
しかも結果的にナビゲートに失敗するから困ってる。

イベント登録しなければ発生しないみたい。
またハンドラの中身が空でもなるみたい。
誰か回避方法知らない?

307:300
08/10/02 17:47:30
>>305
すまん良く分からないんだが、戻り値がList<T>の関数がガイドライン違反なのか?
リンク先を見てみたがその記述はどこにあるの?
この場合は特に問題ないと思うんだけどなあ。

ZahyouArrプロパティについても、配列を返すプロパティがもしかしてガイドライン違反?
っていうか俺よくList<T>のカプセル化のときにこういうプロパティをよく使ってた・・・
インデクサを使えってことなのかな。

仮に返されるものが参照型の配列だったりしたら内部を変更される可能性があって良くないとは思うけど、
この場合は構造体の配列だし、private List<Point> pListについては安全なように見えるんだけどな。
内部状態のコピーが危険なのは参照型コレクションだけとかではないの?
いまいち納得出来ん。

まあTekiki構造体についてはクラスにすべきだと言う意見は納得できる。

308:デフォルトの名無しさん
08/10/02 17:52:37
グーグーレーカースー

309:300
08/10/02 18:09:52
オーケー分かった。

配列を返す操作と内部状態のコピーの時はメソッドを使用して下さいと書いてあったな。
ZahyouArrプロパティ
の代わりに
public Point[] GetZahyouArr(){
return pList.ToArray();
}

とでもしておくか。

しかし戻り値がList<T>のメソッドは使うなという記事は見つけられんかった。
リンク先おせーてくれよ。

310:デフォルトの名無しさん
08/10/02 18:11:36
その代用で使う
~Collectionってやつがうざい

311:デフォルトの名無しさん
08/10/02 18:22:46
俺もList<T>を返すメソッドを書く事はある
だめだというガイドラインがあるなら俺も知りたい

312:デフォルトの名無しさん
08/10/02 18:24:22
リスト返したらセットアクセッサが無意味化するぞ

313:デフォルトの名無しさん
08/10/02 18:28:44


314:デフォルトの名無しさん
08/10/02 18:29:29
とゆーかカプセル化が崩壊

315:デフォルトの名無しさん
08/10/02 18:30:56
ジェネリック リストを公開しません
URLリンク(msdn.microsoft.com)
Code Analysis Team Blog : FAQ: Why does DoNotExposeGenericLists recommend that I expose Collection<T> instead of List<T>? [David Kean]
URLリンク(blogs.msdn.com)

だそうです。

316:デフォルトの名無しさん
08/10/02 18:31:05
>>275
特別にいいもの教えてやる。

っ インデクサ

317:デフォルトの名無しさん
08/10/02 18:32:13
"do not return list" c# とか適当な英文でググるといいよ
URLリンク(blogs.msdn.com)

318:デフォルトの名無しさん
08/10/02 18:35:34
>>315
それはprivateフィールドのList<T>を公開するなってことでしょ?
そんなことがまずいのはみんな知ってるだろw

static List<Point> GetZahyou()
{
List<Point> pList = new List<Point>();
//いろいろ計算
return pList;
}

このメソッドがガイドライン違反というのが納得できないだけ。
中でnewしたListをいろいろ計算して、その結果を返すメソッドがガイドライン違反という説明にはなってない。

319:デフォルトの名無しさん
08/10/02 18:41:49
計算結果を返すだけなら別にいいんじゃね
それをどういじくろうが誰も困らないし

320:デフォルトの名無しさん
08/10/02 18:45:04
constがないからな

321:デフォルトの名無しさん
08/10/02 18:46:05
List<T>返す云々以前にまずまともな設計をするべき

322:デフォルトの名無しさん
08/10/02 18:49:40
>>318
わざわざList<T>で返されたら追加することに意味があるのかと思っちゃうじゃないか……

323:デフォルトの名無しさん
08/10/02 18:54:56
>>273
List<>を返すのも配列を返すのもかわらなくね?
結局どうすればいいんだろ

324:デフォルトの名無しさん
08/10/02 18:57:16
パフォーマンスを考えればToArrayしとくべきだろ
で、引数や返り値の配列は変更しないというのは暗黙の了解にしとく

325:デフォルトの名無しさん
08/10/02 18:59:55
Dictionary.ValueCollection みたいに

326:デフォルトの名無しさん
08/10/02 19:01:04
>>323
だよね
わざわざ、ToArrayしてまたList<>にいれるわけでしょ?
変換するのは無意味な気がするんだが

327:デフォルトの名無しさん
08/10/02 19:03:32
> わざわざ、ToArrayしてまたList<>にいれるわけでしょ?
これが言い切れるようなinternalな場合はどうでもいいよ

328:デフォルトの名無しさん
08/10/02 19:03:52
書き込み可能な配列で返すのもよろしくない。

329:デフォルトの名無しさん
08/10/02 19:19:57
それを言ったらオブジェクトを返すこと自体良くないきがするんだが

330:デフォルトの名無しさん
08/10/02 19:21:55
たとえば>>325のは返す本人以外は要素の取得しか出来なかったりする

331:デフォルトの名無しさん
08/10/02 19:25:54
親戚も弄れるけどなw

332:デフォルトの名無しさん
08/10/02 19:27:01
今時ならジェネレータにして使う側がToList()なりToArray()なりするというのが良さそう

333:デフォルトの名無しさん
08/10/02 19:34:11
>>321
まともな設計をお願いします

334:デフォルトの名無しさん
08/10/02 19:41:17
引数なしのstaticメソッドで座標を作ってそれを様々な敵機に入れるなんてのはまともな設計じゃないな
普通に考えたら全部同じ座標になるし、それなら何度もメソッドを実行する意味がない

335:デフォルトの名無しさん
08/10/02 19:58:19
なるほど
やっぱりガイドライン違反じゃないんだな


336:デフォルトの名無しさん
08/10/02 20:23:45
>>334
引数無しなのは質問の要点をわかりやすくするために省略しただけ
実際は玉をよけたり、当たり判定だったりあるし、
敵機の目的地点までの経由地点の座標群を敵機ごとに保持しているだけ
「usingディレクティブがない」と揚げ足取るぐらい蛇足な指摘だと思うんだがな

337:デフォルトの名無しさん
08/10/02 20:29:41
>>335
お前がそう思うんなら そうなんだろう お前ん中ではな

338:デフォルトの名無しさん
08/10/02 20:30:54
>>334
怒るな
怒ったら負けだ

339:デフォルトの名無しさん
08/10/02 20:39:39
既に負けてる

340:デフォルトの名無しさん
08/10/02 20:48:35
なんでわざわざ作りにくい実装にするのよ


341:デフォルトの名無しさん
08/10/02 21:03:40
>>340
作りやすい実装をお願いします

342:デフォルトの名無しさん
08/10/02 21:30:54
戻り値の型にList<T>がまずいのは当然として、
IList<T>なら遥かにいいと思っているんだが違う?

343:デフォルトの名無しさん
08/10/02 21:49:22
List<T>を返すのがなんでまずいんだ?初めて聞いたぞ
それを言ったらオブジェクトの中にList<T>が含まれてたら何にも返せなくなっちゃう

344:デフォルトの名無しさん
08/10/02 21:50:05
>>343
ラッパを返せばいい

345:デフォルトの名無しさん
08/10/02 21:56:16
っ ほい

URLリンク(msdn.microsoft.com)

346:デフォルトの名無しさん
08/10/02 22:04:54
いちいち継承してらんねーよ

347:デフォルトの名無しさん
08/10/02 22:10:43
今日のレスは勉強になったなー

348:デフォルトの名無しさん
08/10/02 22:14:52
なんしか、フィールド変数の値を返す場合はプロパティで
オブジェクトを返す場合メソッドを通して値のやり取りをしろってことでしょ?

349:デフォルトの名無しさん
08/10/02 22:28:04
ボタンをクリックしたら、エクスプローラで全選択するように、ボタンにCtrl+Aを割り当てたプログラムを作ろうとしています。
ところが、当然ボタンをクリックするときには、エクスプローラではなく、作っているプログラムがアクティブになってしまうので、アクティブにならないようにしてみました。
しかし、ボタンを押しても全選択はできないままです。
アドバイスお願いします。

namespace CtrlA {
public partial class CtrlA : Form {
const int WM_MOUSEACTIVATE = 0x0021;
const int WA_NOACTIVATE = 3;
public CtrlA() {InitializeComponent();}

protected override void WndProc(ref Message m){
switch (m.Msg) {
case WM_MOUSEACTIVATE:
m.Result = (IntPtr)WA_NOACTIVATE;
return;}
//Console.WriteLine(m.Msg);
base.WndProc(ref m);
}

private void CtrlA_Click(object sender, EventArgs e) { SendKeys.SendWait("^A") ;}
}
}


350:デフォルトの名無しさん
08/10/02 22:28:11
変更可能なオブジェクトの参照を流出させることのリスク、
そのリスクの管理ができていればどうしようとかまわないと思う。
ようは外部から参照経由で変更された場合に、
そのオブジェクトを内包させているクラスが
値が変わったことを知ることができないということ。

メソッドの場合はメソッド名で内部の参照をさらしているのか、安全なコピーを返しているのか
区別が付くような名前にしておくとか工夫して置けばよい。
プロパティの場合はメソッドを使うよりはいろいろルールがある。


351:デフォルトの名無しさん
08/10/02 22:34:21
>>349
エクスプローラの画面のハンドルが必要になるような。
どうやるかはWin32APIの範疇になる。

352:デフォルトの名無しさん
08/10/02 22:38:51
>>350
>そのリスクの管理ができていればどうしようとかまわないと思う。
そのリスクを減らすためのものがガイドラインでしょ?守らないと不幸なことが起きるかもしれないのがガイドライン。
俺仕様がしっかりしてるならそれでもかまわないが、それが通用しないところではガイドラインが役に立つ。

Delphiで言うと、クラス名はTうんちゃらで始めるという習慣があるが、厳密な言語仕様でもないので守る必要はない
ただ、守らない理由なんて無いけどな(Delphi.netは例外)
TTBaseって支援ソフトがあるんだが、これのプラグインSDKにはTTTBasePluginというクラスがあって、1カ所(ry

353:デフォルトの名無しさん
08/10/02 22:50:36
>>346
何を継承して何をしたいのか知らんが、
>>344-345をするならAsReadOnly()呼ぶだけじゃん

354:デフォルトの名無しさん
08/10/02 22:57:18
>>352
プロパティに関してはそういうガイドラインがあることは承知しているが、
通常のメソッドに関しては見たことがないな。
メソッドの場合は自己責任じゃないかと。


355:デフォルトの名無しさん
08/10/02 23:08:30
まとめるとFramework Design Guidelines第二版買ってねってことだな
URLリンク(www.amazon.co.jp)

おk、アジソンからマージンゲット

356:デフォルトの名無しさん
08/10/02 23:18:33
そういえば全然関係ないけど名前付け関係なら我等が .NET
ライブラリにも MessageSecurityVersion とかいうネタクラスが
ありますよ。
この命名規則はさすがにどうなんだろうね

357:デフォルトの名無しさん
08/10/02 23:30:56
>>356
あれはよくわからないけどWS-*とかSOAPとかのネーミングルールなんじゃない(笑


358:デフォルトの名無しさん
08/10/02 23:51:55
MessageSecurityVersionのどこが変なの?

359:デフォルトの名無しさん
08/10/02 23:58:35
ガイドラインって本しかないの?

360:デフォルトの名無しさん
08/10/03 00:08:32
>>359
>>315

361:デフォルトの名無しさん
08/10/03 00:09:20
>>358
WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005
WSSecurityPolicy11BasicSecurityProfile10 プロパティとか。

ちなみにサンプルコード片。

CustomBinding binding = new CustomBinding();
binding.Elements.Add(
 SecurityBindingElement.CreateMutualCertificateDuplexBindingElement(
  MessageSecurityVersion.WSSecurity10WSTrustFebruary2005
   WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10
 )
);

横スクロールはいやというやむを得ない事情により改行を入れさせていただきました
本来識別子なので入れてはいけません

362:デフォルトの名無しさん
08/10/03 00:13:05
>>318はガイドライン違反じゃないよね?

363:デフォルトの名無しさん
08/10/03 00:13:11
>>360
なんだその記事w
日本語でおkなんだがw

364:デフォルトの名無しさん
08/10/03 00:13:47
>>361
これはギャグなのか?w

365:デフォルトの名無しさん
08/10/03 00:15:30
>>361
ネームスペースというのが使えるのにこれだけ長い名前になるんでしょ?
C言語時代のメソッドや変数の名前って相当長かったんだろうな

366:デフォルトの名無しさん
08/10/03 00:27:33
C言語時代は8文字規制とかあたじゃん

367:40
08/10/03 00:27:36
ディレクトリの操作をするときのパス指定で

@"c:\tmp\path"

というような書き方をしますが、 @ ってどういう意味ですか?


368:デフォルトの名無しさん
08/10/03 00:30:42
>>367
URLリンク(ufcpp.net)

369:40
08/10/03 00:33:12
>>368さん

参照URLを拝見しました。理解できました。ありがとうございました。

370:デフォルトの名無しさん
08/10/03 00:36:55
>>367
\ -> \\

本来、文字列の中で \ はエスケープなので、\\ と書かなくちゃいけない。
それを \ で済ますことができるようになる

371:デフォルトの名無しさん
08/10/03 00:37:04
>>367
「@文字列」ですな。
例えばファイルのパスを記述する時、「\」はエスケープ文字を意味する記号になるので
通常は「"C:\\Windows"」など[「\\」と\を2個記述しなければいけないのですが、
@を先頭に付ければ「\」を文字列として扱い、一つしか記述しなくても済みます。

372:40
08/10/03 00:41:57
>>370さん, 371さん

丁寧な補足解説ありがとうございます。
おかげでよくわかりました。

373:デフォルトの名無しさん
08/10/03 00:43:01
>>365
逆。昔はエディタの補完機能なんてのもないし、長い名前付けなかった。

ほんと大昔、初期の初期はプログラムの規模が小さいから
名前の衝突の危険性が低かったからいいんだけど、それはすぐに破たん。

結果どうなったかというと、意味のわからない頭文字略語だらけで、
書いた人にしか意味が分からない名前だらけに。
例えば、>>361 のコードなら、
cb_t b;
add(&b.elem, sbe_create_mcdbe(msg_sec_v10feb05, ws_sec_feb05_11b10)
とかになるんじゃないかと。

374:デフォルトの名無しさん
08/10/03 00:43:50
質問です、エクスプローラでファイルを右クリックして、[プロパティ]画面の
[概要]タブを開くと、そのファイルの作成者やコメントなどの情報を設定したり
閲覧したりすることができます。これを何かの処置で非表示にすることは
可能ですか?設定は随時行い、表示はさせない、という使い方をしたい
のですが、方法についてご存知の方がいらっしゃいましたらご指導お願いします。

.NETからは、dsofile.dll というDLLで設定と参照ができることはわかったのですが、
これをそのファイルごとに非表示にしたり表示したりできれば思います。

375:デフォルトの名無しさん
08/10/03 00:48:04
@"blah\" とかやっても平気なのは何気に凄いね

376:デフォルトの名無しさん
08/10/03 00:50:55
MSDNって、どうしてあんなに遅いんですか?

377:デフォルトの名無しさん
08/10/03 00:51:13
スペッコ不足です

378:デフォルトの名無しさん
08/10/03 00:53:15
つーかパスはC:\\\\\\\\\\\\\\\windows\\\\\\\system32\\\\\\
とかやっても動くぞ
二つ以上連続の\は勝手にOSが読み替えてくれる

379:デフォルトの名無しさん
08/10/03 00:54:41
>>376
仕様です。

IE で見るのが苦痛なサイトを自前で作ってるって笑われてる。

380:デフォルトの名無しさん
08/10/03 00:55:43
MSDNの分かりづらさはなんとかならないのか
専門の校閲係とか雇って分かりやすくしとけよ

381:デフォルトの名無しさん
08/10/03 00:56:13
>>374
プログラムというより、OS の設定の領域。
プログラム的には、シェルエクステンションの仕組みでうんぬんかんぬん・・・


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