【发布时间】:2019-04-21 11:51:26
【问题描述】:
我在以不同方式调用 4 种方法时得到不同的结果:
static void Main(string[] args)
{
var emp = new Employee { Name = "ABC" };
ChangeName1(emp);
Console.WriteLine(emp.Name); //XYZ
ChangeName2(ref emp);
Console.WriteLine(emp.Name); //XYZ
ChangeToNull1(emp);
Console.WriteLine(emp.Name); // XYZ
ChangeToNull2(ref emp);
Console.WriteLine(emp.Name); // Null Reference Exception
Console.ReadLine();
}
static void ChangeName1(Employee e)
{
e.Name = "XYZ";
}
static void ChangeName2(ref Employee e)
{
e.Name = "XYZ";
}
static void ChangeToNull1(Employee e)
{
e = null;
}
static void ChangeToNull2(ref Employee e)
{
e = null;
}
正如你看到的前 2 个方法,我正在更改 Name 属性的值,从该方法返回后,原始对象属性被更改。
但是当设置对象为null时,ChangeToNull1方法不会改变原来的对象但是ChangeToNull2方法会。
所以我的问题是:
1. 为什么 C# 会这样?
2. C# 在传递给方法时是否会复制原始对象?
3. 如果是,那么它如何改变原始对象属性,如Name,为什么不改变原始对象?
4. c# 通过ref 传递时是否复制原始对象?
【问题讨论】:
-
问题是您正在通过按值调用和按引用调用来传递对内存中对象的引用。东西变得很奇怪。另请注意:不要尝试使用 String 来学习类行为!它的行为与正常的引用类型不同。它的设计更像是像 lint 这样的原始值类型。
-
stackoverflow.com/questions/30585483/…也许这个解释对你有帮助。
-
@Christopher 你能解释一下
string的行为何时不同于其他类型吗?我还没有遇到过这种情况
标签: c#