2013-07-16 3 views
10

それは、反復変数foreachループのオブジェクト値を変更しますか?私は、私は下記のコードのように文字列の値を変更することができています、その場合には、文字列のリストを使用して</p> <pre><code>foreach(string item in itemlist.ToList()) { item=someValue; //I am able to do this } </code></pre> <p>しかし、クラスのオブジェクトのために、私は変更することはできませんよ午前一箇所に

+9

いいえ、実際には最初のスニペットでコードを実行できません。反復変数は読み込み専用です。 –

+0

リストのコピーを作成してそのコピーを繰り返し処理する.ToList()のためにできます。 –

+0

いいえ、それはできません。やってみなよ。コード*はコンパイルされません。あなたが本当にそれが信じられるなら、それが失敗するのを見ることを示す短いしかし完全なプログラムを作りなさい。 –

答えて

16

foreachループの反復変数を変更することはできませんが、反復変数のメンバーを変更することはできます。従ってstudentDTOが参照型であることを

private void ChangeName(StudentDTO studentDTO) 
{ 
    studentDTO.name = SomeName; 
} 

注にChangeName方法を変更します。したがって、変更された学生を返す必要はありません。 ChangeNameメソッドが取得するのは、生徒のコピーではなく、ユニークな生徒オブジェクトへの参照です。反復変数とstudentDTOListは両方とも、メソッドのstudentDTOパラメータと同じ生徒オブジェクトを参照します。

そして

foreach(StudentDTO student in studentDTOList) 
{ 
    ChangeName(student); 
} 

にループを変更しかし、ChangeNameのような方法が珍しいです。進むべき道は、あなたは、あなたがあなたのことを言うコメントで

foreach(StudentDTO student in studentDTOList) 
{ 
    student.Name = SomeName; 
} 

EDIT

にループを変更することができますプロパティにフィールドをカプセル化する

private string name; 
public string Name 
{ 
    get { return name; } 
    set { name = value; } 
} 

です多くの分野を変えなければならない。その場合は、すべての変更を行うメソッドUpdateStudentを使用しても構いません。しかし、私はまだプロパティを保持します。

値を渡す以外にプロパティにロジックが追加されていない場合は、自動実装された便利なプロパティで置き換えることができます。

public string Name { get; set; } 

この場合、フィールドnameを削除する必要があります。

+0

よろしくお願いします。すでに質問したことがあります... –

+1

だから、すでに参照型の引数を取得しているので、関数から何も返さないでください。 –

+1

はい。生徒を返却しても、戻り値は無視して反復変数に代入しないでください。生徒を返すと、メソッド呼び出しを連鎖させることができます: 'student.UpdateValues()。StoreChanges()。PrintReport();' –

17

ですので、あなたが実際にとにかくあなたが参照しているオブジェクトを変更していない割り当てることができませんので、あなた:オブジェクトのメンバー値はコードは以下の通りです、

public class StudentDTO 
{ 
    string name; 
    int rollNo; 
} 

studentDTOList=GetDataFromDatabase(); 

foreach(StudentDTO student in studentDTOList.ToList()) 
{ 
     studentDTO=ChangeName(studentDTO); //Not working 
} 

private StudentDTO ChangeName(StudentDTO studentDTO) 
{ 
    studentDTO.name=SomeName; 
    return studentDTO; 
} 

エラーがありますちょうど使用することができます:

foreach (StudentDTO student in studentDTOList) 
{ 
    student.name = SomeName; 
} 

や静止メソッドを呼び出します。どちらの場合も

foreach (StudentDTO student in studentDTOList) 
{ 
    ChangeStudent(student); 
} 

を、コードは、反復変数(student)の値を変更しませんので、それは大丈夫です。

しかし元の例はとにかくコンパイルされません。foreachループによって導入された反復変数は読み取り専用です。

+0

はプライベートになります現在のところ+1どちらかの方法 – Sayse

+0

実際には私の元のコードは、その変数から多くの値を変更していますが、平面foreach()とそれは動作していないエラーの例です。 –

+1

@ user2553512: "それはエラーを示しています"は決して十分な情報ではありません。オブジェクト内のデータを大量に変更しても問題ありません。反復変数自体に新しい値を割り当てることはできません。つまり、ChangeStudent(student)を呼び出してデータを変更することができます。単にstudent = ChangeStudent(student)を実行することはできません。 –

関連する問題

 関連する問題