- PR -

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

投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-11 10:06
引用:

じゃんぬねっとさんの書き込み (2006-08-11 09:33) より:

ま た 釣 り 糸 が ...


           ↑
実は一番疑っている人は、この方だったりorz

引用:

じゃんぬねっとさんの書き込み (2006-08-11 09:33) より:

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



ついさっき、ロジックが複雑になってきたので書き換えた内容で早速使いましたが・・・

コード:

#region CodeItem Class
//**************************************************************************
// CodeItem Class
//**************************************************************************
public class CodeItem
{
#region Constructor
//**************************************************************************
// Constructor
//**************************************************************************
private List<string> convertCodes;
private string convertCode;

public CodeItem() : base() {}

public CodeItem(string sourceCode) {
this.Source = sourceCode;
}

#endregion

#region Source Property
//**************************************************************************
// Source Property
//**************************************************************************
public string Source {
get {
return this._Source;
}
private set {
this._Source = value;
this.ConvertSet(value);
}
}

private string _Source;

#endregion

#region ConvertSet
//**************************************************************************
// ConvertSet
//**************************************************************************
private void ConvertSet(string code) {
string s = code;

string[] a = s.Split('\\\\'');
s = a[0]; // Comment Delete

s = s.Replace('\\\\t', ' '); // Tab to Space

s = s.Trim();
s = s.Trim(':');
s = s.Trim();

// " で囲まれた文字列(定数)は対象外にするため、偶数要素数のみ処理する
string[] a = s.Split('\\\\"');
for (int i = 0; i < a.Length; i = i + 2) {
a[i] = a[i].ToUpper(); // 英字大文字にする。

}
this.convertCode = String.Join("\\\\"", a);
}
#endregion
:
:



こいつをコレクションに持って、foreach でグルグル回してやろうかと・・・

引用元の記述を間違えました。下記、じゃんぬねっとさんの投稿によるご指摘を受けて修正させていただきました。_(_+_)_


[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-08-11 13:17 ]
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-08-11 10:28
引用:

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

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

コード:
foreach(MyClass c in MyCollection)

{
c.Width = 50;
}


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


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



コレクションの中身、列挙されるものはあくまで参照であって、参照先のプロパティに依存してたらおかしいですね…。
MyCollection.XXX()とかで得られるイテレータであれば、そういう可能性もあるでしょうが。

いずれにしても、foreachによるコレクション書き換えは、「シナリオが想定できない」というじゃんぬさんの言葉に同意。

#最後の一行がべるさんのコードにかかってるように誤解されそうだったので修正。

[ メッセージ編集済み 編集者: mio 編集日時 2006-08-11 10:30 ]
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2006-08-11 10:40
こんちは

> 予期しない動作を防ぐため、コレクション内容の変更には使用しないでください。
一見代入に見えても、演算子がオーバーライドされているかも知れないからじゃないですかね?

実装によっては s.Width = 10 とかをやったときに他のコレクションメンバが更新されたりする場合があるからじゃないですか?

ま、創造の域を超えませんが...

[ メッセージ編集済み 編集者: 未記入 編集日時 2006-08-11 12:03 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-08-11 12:40
釣 り 氏 に 認 定 。

引用:

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

引用:

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

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




これを書いたのは、私のはず...
それと、タイトルが foraech になっているのも釣りですよね? (w

引用:

未記入さんの書き込み (2006-08-11 10:40) より:

一見代入に見えても、演算子がオーバーライドされているかも知れないからじゃないですかね?
実装によっては s.Width = 10 とかをやったときに他のコレクションメンバが更新されたりする場合があるからじゃないですか?


私が、読み違えているだけかもしれませんが、
これは、foreach に限定する 'まずさ' ではないように思えますが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-11 13:23
引用:

じゃんぬねっとさんの書き込み (2006-08-11 12:40) より:

引用:

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

引用:

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

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




これを書いたのは、私のはず...
それと、タイトルが foraech になっているのも釣りですよね? (w


上記2点修正させていただいました。_(_a_)_
引用元を間違えるのはいけないですね。
また、皆の共有情報という点を考慮すると題名のタイポもいけませんね。
ご指摘ありがとうございました。

引用:

じゃんぬねっとさんの書き込み (2006-08-11 12:40) より:

釣 り 氏 に 認 定 。


違いますってば(T-T)
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-08-11 13:44
知らない間に面白い話で盛り上がってますね。

String を例に出すから若干不自然に感じるのでしょう。
コード:
List<string> programCode;

public void CodeConvert() {
    foreach(string s in this.programCode) {
        s = "aaa";
    }
}


上の例は、意味的には以下のように書いているのと同義なので、「意味ねー」ってコンパイラが教えてくれるだけですよね。
コード:
List<string> programCode;

public void CodeConvert() {
    foreach(string s in this.programCode) {
        s = new String("aaa");
    }
}



コレクションに対する変更は駄目だって言ってるのは、
コード:
public void CodeConvert() {
    foreach(string s in this.programCode) {
        this.programCode.Add("aaa");
    }
}


なんて事をしちゃ駄目だって話です。実際実行時に例外がスローされます。
「System.InvalidOperationException:コレクションが変更されました。列挙操作は実行されない可能性があります。」

コレクションのアイテムが変更されるのはOKでしょう。
_________________
囚人のジレンマな日々
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-08-11 14:50
引用:
つりじゃないですってば(^^;)
・・・ううっ、べるさんまで・・・orz

スレ自体が釣りじゃないのはわかってますよ(笑)。真面目な話なのにつられた気分になる不思議なスレなんです。

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

はい、実装次第かなと思ったんです。IEnumerator.MoveNext実装が
「次にWidthの大きいものに移る」だったら、とか。いや。。foreachにかけただけで無限ループするような
コレクションを作れるんだから、そこまで考える必要はないのか。

[ メッセージ編集済み 編集者: べる 編集日時 2006-08-11 15:00 ]

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