ふらっとC#,C♯,C#(初心者用) Part31
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2008/09/29(月) 12:39:47「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問など、
勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
前スレ
ふらっとC#,C♯,C#(初心者用) Part30
http://pc11.2ch.net/test/read.cgi/tech/1219220127/
0232デフォルトの名無しさん
2008/10/02(木) 00:56:30それ>>155へのヒントですよね
メインってのを2個にすればいいんですか?
それとも現在2つあるので1つにすればいいですか?
何から何まですいません
よろしく^^
0233デフォルトの名無しさん
2008/10/02(木) 01:00:06氏ね低学歴。お前には一生プログラム無理
0234デフォルトの名無しさん
2008/10/02(木) 01:00:320235デフォルトの名無しさん
2008/10/02(木) 01:01:05お前は>>231を100万回読んでから氏ねカス
0236デフォルトの名無しさん
2008/10/02(木) 01:01:55質問回答以外はあおりですね
さよなら煽りくん
もうこなくていいからね
0237デフォルトの名無しさん
2008/10/02(木) 01:02:590238デフォルトの名無しさん
2008/10/02(木) 01:03:58お前が低学歴なのはこのスレの住民のせいではない
八つ当たりもほどほどにしておけよハゲ
お前はまず概念理解しろ
それすらもできない低学歴は2度と来るなカス
悔しいのか?悔しいから荒らすのか?
もっとポジティブな思考ができないのかねぇこの池沼はw
0239デフォルトの名無しさん
2008/10/02(木) 01:05:01解決したんじゃなかったのか?
0240デフォルトの名無しさん
2008/10/02(木) 01:06:02わかったよ
あんまし怒らなくていいだろ
仲良くしよう
これからも応援よろしく^^
0241デフォルトの名無しさん
2008/10/02(木) 01:11:26質問回答以外はあおりですね
さよなら煽りくん
もうこなくていいからね
0242デフォルトの名無しさん
2008/10/02(木) 01:14:34てゆーかソース自体に問題は無いような…
using namespace System;
using namespace System::Diagnostics;
using namespace System::Net;
using namespace System::Text;
int main(array<System::String ^> ^args)
{
String ^url = "http://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;
}
0243デフォルトの名無しさん
2008/10/02(木) 01:18:34using 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("http://www.yahoo.co.jp/");
Console.WriteLine(text);
return 0;
}
}
サイトにアクセスする前に Encoding 設定するのが良くないね
DownloadString じゃ無理なのかな
0244デフォルトの名無しさん
2008/10/02(木) 01:22:20>エラー表示とかは無いです
コンソールが勝手に閉じるからだろ
0245デフォルトの名無しさん
2008/10/02(木) 01:27:56>>243
お疲れのところ本当にありがとうございます
>>243さんのコードでエラーなくリクエスト送信は成功していることを確認できました
ありがとうございます^^
0246デフォルトの名無しさん
2008/10/02(木) 01:28:050247デフォルトの名無しさん
2008/10/02(木) 01:28:280248デフォルトの名無しさん
2008/10/02(木) 01:33:42GET するユーティリティの実装ってそうしてるのかな?
今回はとりあえずバイト列として読み込んでそのまま吐いて妥協
WebClient ua = new WebClient();
Stream stream = ua.OpenRead("http://www.yahoo.co.jp/");
StreamReader streamReader = new StreamReader(stream);
Console.WriteLine(streamReader.ReadToEnd());
stream.Close();
return 0;
0249デフォルトの名無しさん
2008/10/02(木) 01:35:35応援ありがとう
ヘッダから文字列取得は今日のところはやめておくよ
ここの>>155に貼り付けたのと
リクエスト成功した>>243さんのコードとの違いを調べてみるよ
ありがと
0250デフォルトの名無しさん
2008/10/02(木) 01:45:372度とくるなカス
0251デフォルトの名無しさん
2008/10/02(木) 02:06:270252デフォルトの名無しさん
2008/10/02(木) 02:59:46{
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;
}
問)この場合コンソールには何が表示されるでしょうか?
0253デフォルトの名無しさん
2008/10/02(木) 04:07:180254デフォルトの名無しさん
2008/10/02(木) 04:24:170255デフォルトの名無しさん
2008/10/02(木) 06:21:08何かひねったのかと思いきや予想通り0なんだけど何が言いたいの…?
0256デフォルトの名無しさん
2008/10/02(木) 09:06:40http://msdn.microsoft.com/en-us/vstudio/products/cc948977.aspx
0257デフォルトの名無しさん
2008/10/02(木) 09:18:07それの日本語記事↓
http://itpro.nikkeibp.co.jp/article/NEWS/20080930/315630/
「詳細は,数カ月以内に発表する予定」だそうだ。
0258デフォルトの名無しさん
2008/10/02(木) 10:37:40とりあえず複数渡したい・返したいときは配列が速い
List<>を可視メンバの戻り値や引数にしたらマイクロソフトのガイドライン違反!
0259デフォルトの名無しさん
2008/10/02(木) 11:11:51最悪半分ぐらいの容量が使われてなかったりするし
気分的に嫌だから作業が終わったらすぐToArrayしちゃう
0260デフォルトの名無しさん
2008/10/02(木) 11:14:52せんせー、Enumerable.ToList がガイドライン違反ですー
0261デフォルトの名無しさん
2008/10/02(木) 11:15:22そういう意味合いだった気がするが
0262デフォルトの名無しさん
2008/10/02(木) 11:25:32自分の知らないところでListの中身が増えたり減ったりするのを許容するってことだろ
じゃあそのListを管理してるのは誰なのよという話になるだろ
0263デフォルトの名無しさん
2008/10/02(木) 11:35:26同じの作ってFxCopで検査したら違反になるよ
ToListやToDictionaryはコンストラクタのヘルパみたいなもんなんだから
>>261の意味合いから考えれば問題ない
0264デフォルトの名無しさん
2008/10/02(木) 11:36:56ToArrayにする作業のほうが時間がかかったりすることはないの?
>>258
可視メンバって、privateメソッドとか?
>>262
なるほど。それはありますね
追加などの作業が終わったら、配列に戻すのがいいのかな
でも、戻り値を配列にした場合、foreach内でそのメソッドを使用するとなると
AddRangeができないから、手間ですよね?
0265デフォルトの名無しさん
2008/10/02(木) 11:39:49publicな型のpublicメンバとprotectedメンバ
0266デフォルトの名無しさん
2008/10/02(木) 11:46:560267デフォルトの名無しさん
2008/10/02(木) 11:48:120268デフォルトの名無しさん
2008/10/02(木) 11:48:14publicで使っちゃだめなのかー
確かにわけわからなくなるもんなー
ガイドライン天才だなー
0269デフォルトの名無しさん
2008/10/02(木) 11:59:57Content.Loadってキャッシュでしょ?
弄る前提でList返すのはダメだろ
配列でも微妙だけど
0270デフォルトの名無しさん
2008/10/02(木) 12:10:27いや中身読んだら終わりなんだけど、中が配列の配列だったからさらに配列にしたくなかっただけ。
まあいったん配列にしますわ。
0271デフォルトの名無しさん
2008/10/02(木) 12:21:100272デフォルトの名無しさん
2008/10/02(木) 12:32:22フィールドじゃなくてプロパティを使うのは後で実装変えられるようにするためだけど、それと同じ
http://msdn.microsoft.com/ja-jp/library/ms182142.aspx
0273デフォルトの名無しさん
2008/10/02(木) 12:33:01List<>を返すということは元の値を直接操作してもいいよと言っているようなものだから
1人でプログラミングする分には覚えていればいいが、多分忘れる
0274デフォルトの名無しさん
2008/10/02(木) 12:50:200275デフォルトの名無しさん
2008/10/02(木) 12:58:11こういう場合どうすればいいんでしょうか?
あと、配列を初期化したい場合どうすればいいですか?
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();
}
}
0276デフォルトの名無しさん
2008/10/02(木) 12:59:58そいつは新しいListを作り出すメソッドだから問題なし。
内部のListの参照をそのまま見せるのがいけない。
ただしプロパティの場合は予防的コピーを返すことも非推奨となっている。
0277デフォルトの名無しさん
2008/10/02(木) 13:10:590278275
2008/10/02(木) 13:19:15kitai内の座標を保存している配列にコピーしたいんだけど
やり方がわからないんです
foreach(Tekiki kitai in Guntai)
{
kitai.PArray=Zahyou.GetArray();
}
↑だとエラーがでる
Tekikiのデータ構造を
Point[] PArray
ではなくて
List<Point> PList
にすれば簡単に追加できるんだけど
でも、publicでListを返したらだめなんですよね?
こういう場合どうすればいいの?
0279デフォルトの名無しさん
2008/10/02(木) 13:29:42voidなのにreturnしてるとか、
foreachの中に何も書いてないとかは関係してないの?
0280デフォルトの名無しさん
2008/10/02(木) 13:30:170281デフォルトの名無しさん
2008/10/02(木) 13:39:58あとclass Main()ってのもおかしいな
0282275
2008/10/02(木) 13:46:33>>281
すいません。要点だけわかればと思って他はさらっと書いたので
foreach内は実際はいろいろ処理してます。
List<>を返して、AddRangeで追加していたときは普通にいけましたが
配列を返すようにしたら、どうすればいいかよくわかりません
エラー内容
'kitai' は 'foreach 繰り返し変数' であるため、このメンバを変更できません。
0283デフォルトの名無しさん
2008/10/02(木) 13:48:140284275
2008/10/02(木) 13:57:52struct 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<>ではなく、配列で返す方法がわからないんです
0285デフォルトの名無しさん
2008/10/02(木) 14:00:56こんなんでいいだろ
AddRangeの中で内部のListのAddRangeを呼んでやればいい
0286デフォルトの名無しさん
2008/10/02(木) 14:07:26Javaとどっちが強い?
0288デフォルトの名無しさん
2008/10/02(木) 14:13:12当然Javaの方が主流。
ただし、Winアプリを作るだけならC#3.0の方が生産性が高い。
スキルとして持っていた方が有利なのはJava、
Winアプリのみを作る状況で生産性が高いのはC#。
Javaの求人の方がまだまだ多いな。
0289デフォルトの名無しさん
2008/10/02(木) 14:20:44linuxでもmacでも動くんだよね?
0290デフォルトの名無しさん
2008/10/02(木) 14:21:040291デフォルトの名無しさん
2008/10/02(木) 14:23:16コレクションなら全て入れられる
配列でもなんでも
0292デフォルトの名無しさん
2008/10/02(木) 14:54:19kitai.pList.AddRange(new List<Point>(ZahyouKeisan.GetToArray()));
適当に記述してたらこれでいけたっぽいんだけど、これでいいのでしょうか?
0293275
2008/10/02(木) 14:57:54struct 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内はどう記述すればいいですか?
0294デフォルトの名無しさん
2008/10/02(木) 14:59:56> エラー内容
> 'kitai' は 'foreach 繰り返し変数' であるため、このメンバを変更できません。
このエラーが重要。
foreach(Kitai kitai in Guntai){
kitai = Zahyou.GetArray(); // (A)
}
(A)のように、foreachの()内部で宣言した変数は
変更できない。だから、エラーがでてるんだと思う。
これが、
foreach(Kitai kitai in Guntai){
kitai.pArr = Zahyou.GetArray();
}
のように、変数のメンバーとかなら変更可能。
0295294
2008/10/02(木) 15:01:39メンバも変更出来ないんだっけ?
0296デフォルトの名無しさん
2008/10/02(木) 15:10:07foreach(var item in collection)
のitem変数はコレクション内のオブジェクトのコピーだから、
構造体配列等の値型のコレクションにおいてそれをやってもダメだよ〜って話。
変数のメンバといってもその変数自体がコピーされたものだから、メンバを変更しても
元のコレクションには当然反映されない。
参照型のコレクションだったらコピーされた変数はそのまま参照が渡されているので、
foreach内でメンバの変更が可能となる。
せっかくC#を使っているのにCでゴリゴリ書いているコードとレベルが変わらんぞ。
0297294
2008/10/02(木) 15:10:48だとすると、forで回すのがよさそう。
for(int i = 0; i < Guntai.Length; ++i){
Tekki kitai = Guntai[i];
kitai.pArr = ZahyouKeisan.GetArray();
}
0298デフォルトの名無しさん
2008/10/02(木) 15:13:19まずnew Listはいらない
kitai.pList.AddRange(ZahyouKeisan.GetToArray());
pListを直接公開するのはオススメしない
>>293
List<Point>を返すメソッドで配列を返しちゃいけない
AddRangeでPointを増やしていく予定があるならpArrは配列にすべきじゃない
あとZahyouKeisanクラスがkitaiの情報をもっていないのに
Zahyouを返せる理由が分からない
0300デフォルトの名無しさん
2008/10/02(木) 15:35:35どうしても配列でやりたいみたいだから書いてみた。
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();
}
}
0301デフォルトの名無しさん
2008/10/02(木) 15:38:060302300
2008/10/02(木) 15:42:45Tekiki 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();
}
}
0303デフォルトの名無しさん
2008/10/02(木) 15:59:34struct 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;
}
}
0304300
2008/10/02(木) 16:07:17当然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());
}
}
}
0305デフォルトの名無しさん
2008/10/02(木) 16:50:39- GetZahyouメソッド
× 戻り値がList<T>
- ZahyouArrプロパティ
× 型が配列
× ToArrayが内部状態のコピーとみなせる
てか、それ以前に値型使ってること自体が不適切という指摘をしてあげないと
ttp://msdn.microsoft.com/ja-jp/library/ms229017.aspx
0306デフォルトの名無しさん
2008/10/02(木) 17:02:04javascriptトリガー用の"href=http://hoge.com/#"をクリックしたときにまでNavigate系のイベントが発生するようになるんだが、
コレは仕様なの?(登録先がBody又は対象のA要素のとき発生)
しかも結果的にナビゲートに失敗するから困ってる。
イベント登録しなければ発生しないみたい。
またハンドラの中身が空でもなるみたい。
誰か回避方法知らない?
0307300
2008/10/02(木) 17:47:30すまん良く分からないんだが、戻り値がList<T>の関数がガイドライン違反なのか?
リンク先を見てみたがその記述はどこにあるの?
この場合は特に問題ないと思うんだけどなあ。
ZahyouArrプロパティについても、配列を返すプロパティがもしかしてガイドライン違反?
っていうか俺よくList<T>のカプセル化のときにこういうプロパティをよく使ってた・・・
インデクサを使えってことなのかな。
仮に返されるものが参照型の配列だったりしたら内部を変更される可能性があって良くないとは思うけど、
この場合は構造体の配列だし、private List<Point> pListについては安全なように見えるんだけどな。
内部状態のコピーが危険なのは参照型コレクションだけとかではないの?
いまいち納得出来ん。
まあTekiki構造体についてはクラスにすべきだと言う意見は納得できる。
0308デフォルトの名無しさん
2008/10/02(木) 17:52:370309300
2008/10/02(木) 18:09:52配列を返す操作と内部状態のコピーの時はメソッドを使用して下さいと書いてあったな。
ZahyouArrプロパティ
の代わりに
public Point[] GetZahyouArr(){
return pList.ToArray();
}
とでもしておくか。
しかし戻り値がList<T>のメソッドは使うなという記事は見つけられんかった。
リンク先おせーてくれよ。
0310デフォルトの名無しさん
2008/10/02(木) 18:11:36〜Collectionってやつがうざい
0311デフォルトの名無しさん
2008/10/02(木) 18:22:46だめだというガイドラインがあるなら俺も知りたい
0312デフォルトの名無しさん
2008/10/02(木) 18:24:220313デフォルトの名無しさん
2008/10/02(木) 18:28:440314デフォルトの名無しさん
2008/10/02(木) 18:29:290315デフォルトの名無しさん
2008/10/02(木) 18:30:56http://msdn.microsoft.com/ja-jp/library/ms182142.aspx
Code Analysis Team Blog : FAQ: Why does DoNotExposeGenericLists recommend that I expose Collection<T> instead of List<T>? [David Kean]
http://blogs.msdn.com/fxcop/archive/2006/04/27/585476.aspx
だそうです。
0316デフォルトの名無しさん
2008/10/02(木) 18:31:05特別にいいもの教えてやる。
っ インデクサ
0317デフォルトの名無しさん
2008/10/02(木) 18:32:13ttp://blogs.msdn.com/kcwalina/archive/2004/03/15/89860.aspx
0318デフォルトの名無しさん
2008/10/02(木) 18:35:34それはprivateフィールドのList<T>を公開するなってことでしょ?
そんなことがまずいのはみんな知ってるだろw
static List<Point> GetZahyou()
{
List<Point> pList = new List<Point>();
//いろいろ計算
return pList;
}
このメソッドがガイドライン違反というのが納得できないだけ。
中でnewしたListをいろいろ計算して、その結果を返すメソッドがガイドライン違反という説明にはなってない。
0319デフォルトの名無しさん
2008/10/02(木) 18:41:49それをどういじくろうが誰も困らないし
0320デフォルトの名無しさん
2008/10/02(木) 18:45:040321デフォルトの名無しさん
2008/10/02(木) 18:46:050322デフォルトの名無しさん
2008/10/02(木) 18:49:40わざわざList<T>で返されたら追加することに意味があるのかと思っちゃうじゃないか……
0323デフォルトの名無しさん
2008/10/02(木) 18:54:56List<>を返すのも配列を返すのもかわらなくね?
結局どうすればいいんだろ
0324デフォルトの名無しさん
2008/10/02(木) 18:57:16で、引数や返り値の配列は変更しないというのは暗黙の了解にしとく
0325デフォルトの名無しさん
2008/10/02(木) 18:59:550326デフォルトの名無しさん
2008/10/02(木) 19:01:04だよね
わざわざ、ToArrayしてまたList<>にいれるわけでしょ?
変換するのは無意味な気がするんだが
0327デフォルトの名無しさん
2008/10/02(木) 19:03:32これが言い切れるようなinternalな場合はどうでもいいよ
0328デフォルトの名無しさん
2008/10/02(木) 19:03:520329デフォルトの名無しさん
2008/10/02(木) 19:19:570330デフォルトの名無しさん
2008/10/02(木) 19:21:550331デフォルトの名無しさん
2008/10/02(木) 19:25:54■ このスレッドは過去ログ倉庫に格納されています