- PR -

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

投稿者投稿内容
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-08-10 19:50
ああっこれは釣り人の人だ (究極超人あーるより)

と言うわけで、釣られました(ウソ)
まどかさん、mio さんの仰るとおりでした。
ちゃんと考えて投稿していないのがバレバレでしたね。ちょっと反省。

いきおいで書いた。
code ならなんでも良かった。
今は反省している。
# してねえだろ
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-10 20:07
引用:

ぽぴ王子さんの書き込み (2006-08-10 19:50) より:
ああっこれは釣り人の人だ (究極超人あーるより)


それは言わないお約束です^^;
ただでさえ、一部でそう囁かれているのに。

#今プリプロセッサ作ってまして、これで使いたいと思ったんです。
#ちゃんとした理由があるんですよ orz

[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-08-11 01:13 ]
kuwabala^2
会議室デビュー日: 2005/02/02
投稿数: 2
投稿日時: 2006-08-11 01:55
変数は読み取り専用(変数が参照型なら参照先は変えられない)
変数が参照しているインスタンスの操作は可能
C#のStringクラスが「内容の変更ができない」ことが問題なのでは?

「内容の変更ができる文字列クラス」をつくれば良いのでは?
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-08-11 03:09
わからない事だらけというか、つられてみるというか、私には難しい話というか。

コード:
Button b1 = new Button();
Button b2 = new Button();
Button b3 = new Button();
Button[] buttons = new Button[] {b1,b2,b3};
foreach(Button b in buttons)
{
    if(object.ReferenceEquals(b,b3))
    {
       //☆
    }
}

☆は通りますよね。参照は一緒ですよね。

コード:
foreach(MyClass c in MyCollection)
{
    c.Width = 50;
}

これはやっていいんですか。列挙する順序の決まり方にWidthが使われていたら?(そんな実装は不可能?)

MSDN
引用:
foreach ステートメントは、配列またはオブジェクト コレクションのそれぞれの要素に対して埋め込みステートメントを繰り返します。foreach ステートメントは、コレクションを繰り返し処理して目的の情報を取得するのに使用しますが、予期しない動作を防ぐため、コレクション内容の変更には使用しないでください。

わざわざ配列とコレクションにわけつつ「コレクション内容の変更には」といっているということは
配列に限っては変更してもいいのですか?(ぇ、そうじゃなくて?、、)

繰り返し変数が読み取り専用な理由は、見方を少し変えて、IEnumerator.Currentが
読み取り専用(でなければいけない)だからと解釈してもいいのでしょうか。

引用:
perl だと、書けるので、.net で駄目と言われて、じゃあ皆さん素直に案1を使っていらっしゃるのかと気になっただけなのです。

そういうことですよね。ダメなのはわかった。じゃあみんなどうしてるのかな。
for使ってるのかな。どうなんかな。というだけだったんですよね。スレ伸びたなぁ...( = =)
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2006-08-11 09:08
引用:

コード:

foreach(MyClass c in MyCollection)
{
c.Width = 50;
}


これはやっていいんですか。列挙する順序の決まり方にWidthが使われていたら?(そんな実装は不可能?)


実際の実装の詳細はわかりませんが
メンバインスタンスの型より内側に依存情報があるはずが無いと思いますが。
空メンバのクラスも実装可能ですし。
#でもGetEnumeratorの実装しだいか。。。

[ メッセージ編集済み 編集者: まどか 編集日時 2006-08-11 09:09 ]

[ メッセージ編集済み 編集者: まどか 編集日時 2006-08-11 09:14 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-11 09:08
引用:

http://msdn2.microsoft.com/ja-jp/library/ttw7t8t6.aspx
より引用

foreach ステートメントは、配列またはオブジェクト コレクションのそれぞれの要素に対して埋め込みステートメントを繰り返します。foreach ステートメントは、コレクションを繰り返し処理して目的の情報を取得するのに使用しますが、予期しない動作を防ぐため、コレクション内容の変更には使用しないでください。


基本的には、じゃんぬねっとさんに提示していただいた上記の情報で、使うべきでは無いことは明白になりました。
じゃあ「予期しない動作って何なの?」という気もしますが、これは型の性質に左右される部分が大きいので・・・と言うことなんじゃないのかな〜と勝手に解釈しました。

引用:

kuwabala^2さんの書き込み (2006-08-11 01:55) より:

「内容の変更ができる文字列クラス」をつくれば良いのでは?


そうですね。
厳密にいうと、内容の変更ができるプロパティを持ったクラスとか、内容を変更するメソッドを持ったクラス、ということになるんでしょうね。(とボクなりに理解しました。)

引用:

べるさんの書き込み (2006-08-11 03:09) より:

わからない事だらけというか、つられてみるというか、私には難しい話というか。


つりじゃないですってば(^^;)
・・・ううっ、べるさんまで・・・orz

引用:

べるさんの書き込み (2006-08-11 03:09) より:

コード:
foreach(MyClass c in MyCollection)
{
    c.Width = 50;
}


これはやっていいんですか。列挙する順序の決まり方にWidthが使われていたら?(そんな実装は不可能?)


まあ、先の「僕の理解」で行くとOKになるのですが、確かに MyCollection でforeach にどうやって対応させているのかわからないですからねぇ。

引用:

べるさんの書き込み (2006-08-11 03:09) より:

そういうことですよね。ダメなのはわかった。じゃあみんなどうしてるのかな。
for使ってるのかな。どうなんかな。というだけだったんですよね。スレ伸びたなぁ...( = =)


そうなんですよね^^;
ボクはただ皆さんの知識についていくのに精一杯でした。
皆さんに感謝です。ありがとうございました _(_@_)_
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-11 09:33
ま た 釣 り 糸 が ...

引用:

R・田中一郎さんの書き込み (2006-08-11 09:08) より:

引用:

kuwabala^2さんの書き込み (2006-08-11 01:55) より:

「内容の変更ができる文字列クラス」をつくれば良いのでは?


そうですね。


いやいや、ややこしいので止めた方が良いでしょう。
そもそも、foreach で値をセットして何かをするようなシナリオが想定できないです。
また、そういう使い方をしたいと思ったこともありません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2006-08-11 10:00
一度 C++ を体験して、イテレータのいろいろな性質(特性)を理解したら
より安定な認識に達すると思います。

> 予期しない動作を防ぐため、コレクション内容の変更には使用しないでください。
マルチな処理での排他とかの話かも。

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