传递引用类型对象并更改值

时间:2013-06-28 14:02:18

标签: c# methods interface reference-type

我正在尝试将引用类型对象传递给方法并从那里更改它。当我更改它时,我没有对传递给方法的变量进行更改。

以下是示例:

public interface IPerson
{
    string Name { get; }
}

public class Teacher : IPerson
{
    public string Name { get; set; }

    public string LastName { get; set; }
}

//......

public void CreateTeacher(IPerson teacher)
{
    teacher = new Teacher() { Name = "Teacher name", LastName = "Teacher's last name"};
}
//.....

//I am trying this, but after I call CreateTeacher() variable teacher is null
IPerson teacher=null;
CreateTeacher(teacher);
string n = teacher.Name;

运行CreateTeacher()变量后,老师仍为空?有谁能解释为什么? 我知道我可以在IPerson方法上返回CreateTeacher()或使用out,但我无法使用它们。

IPerson接口位于不同的dll中,Teacher类位于不同的dll中。方法CreateTeacher与class相同。

更新

这是我尝试过的其他内容:

  IPerson teacher=new Teacher();
  CreateTeacher(teacher);
  string n = teacher.Name;//I have the changes here now

  //......

    public void CreateTeacher(IPerson teacher)
    {
        ((Teacher)teacher).Name = "My Name";
    }

第一个例子和第二个例子有什么区别?是因为传递的值是null

感谢您的帮助!

2 个答案:

答案 0 :(得分:7)

C#按值传递,而不是引用。在您的情况下,您将通过值传递您尝试更改的引用。您希望明确说明您希望使用ref关键字引用您的引用:

public void CreateTeacher(ref IPerson teacher)
{
    teacher = new Teacher() { Name = "Teacher name", LastName = "Teacher's last name"};
}

或者更好:

public Teacher CreateTeacher()
{
    return new Teacher() { Name = "Teacher name", LastName = "Teacher's last name"};
}

答案 1 :(得分:5)

除了RedPolygon的答案之外......我觉得这可能会让事情变得清晰。

如上所述,您正在更改引用的值..而不是引用所指向的对象。

将您的代码更改为:

public interface IPerson {
    string Name { get; set; }
}

public void CreateTeacher(IPerson teacher) {
    teacher.Name = "Teacher name";
}

IPerson teacher = new Teacher();
CreateTeacher(teacher);

..这会奏效。为什么?有几个原因。

  1. 不再是null,我们“new了”。
  2. 您在new方法中不是“CreateTeacher”,因此将复制的引用指向一个全新的对象。这意味着您正在更改两个引用所指向的对象。
  3. 令人困惑......是的,但是当你玩这样的例子时,你明白了。

    编辑:

    我必须点燃油漆并展示我非常棒的MSPaint技能:

    这是您的第一个代码段:

    Pass by value for reference types 1

    这是我的片段(和你的第二个):

    Pass by value for reference types 2