- PR -

foreach の変数は読み取り専用なんですか?

投稿者投稿内容
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2006-08-10 16:12
ナンダカヨクワカラナイヤリトリヲシテルケド・・・
じゃんぬ氏の言った通り、「forとforeachの違い」をよく考えてみたらどでしょ?

確か、以前読んだ本(.netじゃありませんが)によると、foreachは、イテレータを使ってすばやく連続処理出来るのが強みなのです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-10 16:15
引用:

ぽぴ王子さんの書き込み (2006-08-10 15:50) より:

どうやら私は勘違いをしていたようですね。
てっきり列挙したものを条件によって書き換えたいのだが、列挙した s が読
み取り専用なので以下略。という話だと思っていました。
んー、だとするとじゃんぬねっとさんや mio さんと同じ意見ですかね。


なにやら、このスレッドは少々ややこしいことになっていますね。
mio さんもその後、前者なのではないかと見ているようですし...

引用:

まどかさんの書き込み (2006-08-10 15:58) より:

うぅ、私のクラスメンバを変更する例に対してだと思うのですが
確かに変更しないでくださいと書いてありますね。(はじめてみました)


いえいえ、まどかさんに対してではないです。(;^-^)
(実際、まどかさんの投稿と入れ違いに投稿しています)

引用:

これをやるべきでないと言われると
もForステートメントにしろということでしょうか?


リファレンスに書いてある内容とは、ちょっと違いますよね?
リファレンスに書いてある内容、ちょっとややこしいのですね。
もう 1 度、思い込みを捨てて見てください。

# こ の ス レ ッ ド は、 誤 解 の 多 い イ ン タ ー ネ ッ ツ で す ね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-08-10 16:17
引用:

コード:
private void 例() {
    foreach (僕 s in this.僕達) {
        s.名前 = "僕の名前はR・田中一郎くんだよ。";
    }
}



こう書くのと大差ないかな〜、という認識なのです。


最初の例だとコレクションメンバがStringですよね?
Stringはクラスで値の変更により内部でNewされます。
したがって
コレクションメンバのポインタそのものが変更されるのでだめなのでは?
と書かせていたきました。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-08-10 16:43
うーん…。

元々の処理がうまくいかない理由は、元のコレクション内の参照とsの参照は別ものなんだから、sだけ書き換えても意味がない、というので決着がつくとは思いますが。
foreachの意味論になっちゃってますか?

>mio さんもその後、前者なのではないかと見ているようですし...
ああ…すみません、「あえてforeachでやるとしたら」ということです。
こういう処理でforeachは、ふつう出てきませんよね。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-08-10 16:44
ちょっと面白くなってきた自分がいます

僕の中のイメージでは、お前らプライマリキーを勝手に書き換えたらインデ
ックスを作り直す羽目になってまた数えなおしになるだろうが!(マイクたた
き付け&ゴング&武藤の物まね)
という風に理解しています(DB 風に考えました)。

コード:

private void 例() {
    foreach (僕 s in this.僕達) {
        s.名前 = "僕の名前はR・田中一郎くんだよ。";
    }
}


これだと、foreach の時点で「僕達」というテーブルを「名前」というプライマ
リキーで列挙しているので、途中で名前が若人あきらから我修院達也に変
わったらどこまで数えたか分からなくなって、だんごを買いに行くんだかどっ
こいしょを買いに行くんだかわからなくなるでしょうが!がっかりだよ!と親切
なコンパイラさんが教えてくれているのだと。

コード:

For Each c As ColumnHeader In ListView1.Columns
    c.Width = -1
Next


この場合は「名前」(プライマリキー)が変わるわけではないので問題がない
のかなぁと。

> # こ の ス レ ッ ド は、 誤 解 の 多 い イ ン タ ー ネ ッ ツ で す ね。

まったくです(お前が言うな)。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-10 16:56
引用:

mioさんの書き込み (2006-08-10 16:43) より:

sだけ書き換えても意味がない、というので決着がつくとは思いますが。


想定される実装ではそうでしょうね。(スコープを考えても)

引用:

foreachの意味論になっちゃってますか?


意味論を出したのは、どうしてもやりたいかのように見えたので、
それは望ましい実装なのかどうかも含めて、止めたかったということです。
正直、これに関しては、私も勘違いしていました。orz

引用:

ああ…すみません、「あえてforeachでやるとしたら」ということです。
こういう処理でforeachは、ふつう出てきませんよね。


了解です。(そして、最初の返信内容と被りますが同意です)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-08-10 19:13
引用:

コード:
private void 例() {
    foreach (僕 s in this.僕達) {
        s.名前 = "僕の名前はR・田中一郎くんだよ。";
    }
}


これだと、foreach の時点で「僕達」というテーブルを「名前」というプライマ
リキーで列挙しているので、途中で名前が若人あきらから我修院達也に変
わったらどこまで数えたか分からなくなって、だんごを買いに行くんだかどっ
こいしょを買いに行くんだかわからなくなるでしょうが!がっかりだよ!と親切
なコンパイラさんが教えてくれているのだと。


僕クラスのプロパティ値の変更なので、
引用:

コード:
For Each c As ColumnHeader In ListView1.Columns
    c.Width = -1
Next


この場合は「名前」(プライマリキー)が変わるわけではないので問題がない
のかなぁと。


これとなんら変わりませんよね?
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-08-10 19:28
んん…?(^_^;
よく見てなかったのがバレバレですが、プライマリキーは「名前」じゃなくて「s」ではないかと(^_^;

スキルアップ/キャリアアップ(JOB@IT)