传递引用类型对象并更改值
我试图将引用类型对象传递给方法并从那里更改它。 当我更改它时,我没有对传递给方法的变量进行更改。
这是一个例子:
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
或者使用,但我不能使用它们。
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);
..那可行。 为什么? 有几个原因。
- 它不再是
null
,我们“new
起来”。 - 您不是在
CreateTeacher
方法中“new
”它,因此将复制的引用指向一个全新的对象。 这意味着您正在更改两个引用所指向的对象。
令人困惑的是……是的,但是当你玩这样的例子时,你就明白了。
编辑:
我不得不点燃油漆并展示我非常棒的MSPaint技能:
这是您的第一个代码段:
这是我的片段(和你的第二个):
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"}; }
- 标识列上具有父/子关系的SqlBulkCopy和DataTables
- 如何使用WPF和Linq-to-entities模型搜索数据库
- 如果没有将模型类的实例传递给视图,如何避免Create.cshtml中的EditorFor(x = x.Prop)生成的nullexception?
- 嵌套LINQ返回此方法无法转换为存储表达式exception
- 如何使用TreeViewDrawMode.OwnerDrawAll更改TreeView中所选节点的背景颜色?
- 在C#Winforms中的DataGridViewCell内绘制一个实心圆或矩形
- C#关联数组
- 旋转 – 使用LINQ C#转置列表<List >
- 在VS 2010中的Winforms项目中添加WPF窗口