Changing objects value in foreach loop?

前端 未结 2 968
一向
一向 2020-12-03 03:20

In one place i am using the list of string in that case the i am able to change the value of the string as code given below,

foreach(string item in itemlist.         


        
相关标签:
2条回答
  • 2020-12-03 03:46

    You cannot change the iteration variable of a foreach-loop, but you can change members of the iteration variable. Therefore change the ChangeName method to

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

    Note that studentDTO is a reference type. Therefore there is no need to return the changed student. What the ChangeName method gets, is not a copy of the student but a reference to the unique student object. The iteration variable and the studentDTOList both reference the same student object as does the studentDTO parameter of the method.

    And change the loop to

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

    However, methods like ChangeName are unusual. The way to go is to encapsulate the field in a property

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

    You can then change the loop to

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

    EDIT

    In a comment you say that you have to change many fields. In that case it would be okay to have a method UpdateStudent that would do all the changes; however I still would keep the properties.

    If there is no additional logic in the properties besides passing through a value, you can replace them by the handy auto-implemented properties.

    public string Name { get; set; }
    

    In that case you would have to drop the field name.

    0 讨论(0)
  • 2020-12-03 03:48

    You're not actually changing the object that you're referring to anyway, so you can just use:

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

    Or still call a method:

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

    In both cases, the code doesn't change the value of the iteration variable (student) so it's okay.

    But your original example doesn't compile anyway - an iteration variable introduced by a foreach loop is read-only.

    0 讨论(0)
提交回复
热议问题