Dil*_*hod 3 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;
Run Code Online (Sandbox Code Playgroud)
运行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";
}
Run Code Online (Sandbox Code Playgroud)
第一个例子和第二个例子有什么区别?是因为传递的价值是null?
谢谢您的帮助!
C#按值传递,而不是引用.在您的情况下,您将通过值传递您尝试更改的引用.您希望明确表示您希望使用ref关键字通过引用传递您的引用:
public void CreateTeacher(ref IPerson teacher)
{
teacher = new Teacher() { Name = "Teacher name", LastName = "Teacher's last name"};
}
Run Code Online (Sandbox Code Playgroud)
或者更好的是:
public Teacher CreateTeacher()
{
return new Teacher() { Name = "Teacher name", LastName = "Teacher's last name"};
}
Run Code Online (Sandbox Code Playgroud)
除了RedPolygon的答案之外......我觉得这可能会让事情变得清晰起来.
如上所述,您正在更改引用的值..而不是引用指向的对象.
将您的代码更改为:
public interface IPerson {
string Name { get; set; }
}
public void CreateTeacher(IPerson teacher) {
teacher.Name = "Teacher name";
}
IPerson teacher = new Teacher();
CreateTeacher(teacher);
Run Code Online (Sandbox Code Playgroud)
..那可行.为什么?有几个原因.
null不再是,我们" new它".new在CreateTeacher方法中"it"" ,从而将复制的引用指向一个全新的对象.这意味着您正在更改两个引用所指向的对象.这是令人困惑的......是的,但是当你玩这样的例子时你就明白了.
编辑:
我不得不点燃油漆并展示我非常棒的MSPaint技能:
这是您的第一个代码段:

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

| 归档时间: |
|
| 查看次数: |
4256 次 |
| 最近记录: |