加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 00:08:21 所属栏目:百科 来源:网络整理
导读:我试图将引用类型对象传递给方法并从那里更改它.当我更改它时,我没有对传递给方法的变量进行更改. 这是一个例子: public interface IPerson{ string Name { get; }}public class Teacher : IPerson{ public string Name { get; set; } public string LastNa
我试图将引用类型对象传递给方法并从那里更改它.当我更改它时,我没有对传递给方法的变量进行更改.

这是一个例子:

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()后,变量老师仍为空?有谁能解释为什么?
我知道我可以在CreateTeacher()方法上返回IPerson或者使用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吗?

谢谢您的帮助!

解决方法

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

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

将您的代码更改为:

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

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

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

..那可行.为什么?有几个原因.

>它不再是空的,我们“新起来”.
>您不是在CreateTeacher方法中“新建它”,因此将复制的引用指向一个全新的对象.这意味着您正在更改两个引用所指向的对象.

这是令人困惑的……是的,但是当你玩这样的例子时你就明白了.

编辑:

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

这是您的第一个代码段:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读