3

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

这是示例:

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与类所在的dll相同。

更新:

这是我尝试过的其他东西:

  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吗?

谢谢您的帮助!

4

2 回答 2

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"};
}
于 2013-06-28T14:04:57.177 回答
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,从而将复制的引用指向一个全新的对象。这意味着您正在更改两个引用所指向的对象。

令人困惑.. 是的,但是当您玩弄这样的示例时,您就会理解它。

编辑:

我不得不启动油漆并展示我出色的 MSPaint 技能:

这是您的第一个片段流:

按值传递引用类型 1

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

按值传递引用类型 2

于 2013-06-28T14:15:48.887 回答