【问题标题】:Passing reference type objects and changing the values传递引用类型对象并更改值
【发布时间】:2013-06-26 07:59:13
【问题描述】:

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

示例如下:

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()变量teacher仍然为空?谁能解释为什么? 我知道我可以在我的CreateTeacher() 方法上返回IPerson 或使用out,但我不能使用它们。

IPerson 接口在不同的 dll 中,Teacher 类在不同的 dll 中。方法CreateTeacher 与class 所在的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

感谢您的帮助!

【问题讨论】:

  • 这里为什么不能使用return

标签: c# methods interface reference-type


【解决方案1】:

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
  • @Dilshod 在您的更新中,您仍在按值传递引用,但您不会在那里更改引用!您正在更改引用“指向”的值(这里没有指针,但您知道我的意思)。您的问题是您试图直接更改引用本身,而不是引用的对象。
  • @RedPolygon 这很有意义。谢谢!
  • @RomainMeresse 死链接 :(
【解决方案2】:

除了 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 it up”。
  2. CreateTeacher 方法中,您不是“new'ing it up”,从而将复制的引用指向一个全新的对象。这意味着您正在更改两个引用所指向的对象。

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

编辑:

我必须启动油漆并展示我出色的 MSPaint 技能:

这是您的第一个 sn-p 流程:

这是我的 sn-p(也是你的第二个):

【讨论】:

  • 希望我令人难以置信的图表也能有所帮助:P
猜你喜欢
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2021-04-01
  • 1970-01-01
  • 2022-09-21
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多