我正在寻找一些澄清和确认,这确实无所作为。
说我有一个对象
public class Person
{
public string Name { get; set; }
}
我将使用这个对象,由于某种原因,它必须被初始化,这应该在构造函数中发生,但是对于这个例子,它将在调用初始化函数时发生
public class myClass
{
private void doingSomething()
{
Person p = new Person();
Initialize(p);
}
private void Initialize(Person person)
{
person.Name = "";
}
}
这只是浪费错误。如果我真的想要更改值,那么它是否必须使用ref,out或返回另一个Person来传递?
如果我错了,我会感激解释。我在查看一些旧代码时发现了这一点并感到困惑,因为我无法相信它。
答案 0 :(得分:1)
是否必须使用ref,out或返回其他人来传递?
不。
考虑堆栈和堆。对于原始值(整数是一个很好的例子),它们只存在于堆栈中。当它们传递给方法时,它们的副本将提供给堆栈中的下一帧。
对于引用类型但是,什么会被传递到堆栈的下一帧? 参考可以。将其视为"指针"。一个简单的值,指示实际对象在堆中的位置。
在您的示例中只调用一次:
new Person()
因此内存中只存在一个 Person
实例。 "指针"将该实例复制到堆栈框架中。如果你改变"指针&#34的值;本身:
private void Initialize(Person person)
{
person = new Person();
}
然后对原始实例没有任何影响。但事实并非如此。 "指针"是跟随并且实例已更改:
person.Name = "";
变量person
不受此声明的影响。没有进行任何操作来修改它。但是,person
变量指向的内存中对象的属性已被修改。在该方法的内部或外部,系统中的任何位置存在对该对象的引用的任何地方都可以看到该更改。