我为class声明了一个变量,并将其传递给一个方法来实例化它,但是原始变量仍然没有实例化
I declared a variable for a class, and passed it into a method to instantiate it, but the original variable remains uninstantiated
我知道 classes 总是通过引用传递,这与通过值传递的结构不同。
如果你看一下下面的代码,你会发现我调用了一个没有 ref
关键字的函数(假设没有必要,因为 Path
是一个 class因此它应该总是由 ref 自动调用而不需要 ref
关键字)。
public MainWindow()
{
InitializeComponent();
Func(myPath);
if (myPath == null)
MessageBox.Show("AAAARGH");
}
Path myPath;
private void Func(Path p)
{
if (p == null)
p = new Path();
}
所以在函数调用之后,我希望 myPath
不再是 null
,因为它已在 Func()
中初始化,但事实并非如此。
我正在研究全球价值。这会改变什么吗?
通过引用传递值与使用 ref
关键字有很大不同。将其翻译成 C 或 C++ 术语:
- 传递一个对象就像传递一个指针
- 传递对象
ref
就像将指针传递给指针。
如果你想在函数内部改变变量的值,你需要使用ref
或out
。
您必须用 'out' 标记参数。
有关 'out' 的更多信息,请查看:
当您最初调用 Func()
时,myPath
和 p
引用 Path
的相同实例。但是,myPath
和 p
仍然是两个独立的引用,它们恰好指向同一个实例。
也就是说,直到运行以下代码:
p = new Path();
之后,p
引用了 Path
的一个新实例,该实例与原始实例分开。在 p
引用的实例中更改属性不会反映在 myPath
引用的实例中。
换句话说:
private void Func(Path p) // p is a separate reference, referencing same Path as myPath
{
if (p == null) // p still references same Path as myPath
p = new Path(); // now p references a new instance of Path, separate from myPath
}
您可以使用 ref
(或 out
)关键字,以便由 myPath
标识的引用本身被传递 "by reference",其效果是 myPath
和 p
是一个单一的引用。
然后当您在方法中创建 Path
的新实例时,myPath
和 p
仍然是一个引用,都指向新实例。 (您的原始实例仍在内存中某处,但不再引用它。)
Path myPath = null;
private void Func(ref Path p) // p is same reference as myPath
{
if (p == null)
p = new Path(); // p and myPath are still same reference,
// now referencing a new instance of Path
}
或者:
Path myPath;
private void Func(out Path p) // p is same reference as myPath
{
if (p == null)
p = new Path(); // p and myPath are still same reference,
// now referencing a new instance of Path
}
我知道 classes 总是通过引用传递,这与通过值传递的结构不同。
如果你看一下下面的代码,你会发现我调用了一个没有 ref
关键字的函数(假设没有必要,因为 Path
是一个 class因此它应该总是由 ref 自动调用而不需要 ref
关键字)。
public MainWindow()
{
InitializeComponent();
Func(myPath);
if (myPath == null)
MessageBox.Show("AAAARGH");
}
Path myPath;
private void Func(Path p)
{
if (p == null)
p = new Path();
}
所以在函数调用之后,我希望 myPath
不再是 null
,因为它已在 Func()
中初始化,但事实并非如此。
我正在研究全球价值。这会改变什么吗?
通过引用传递值与使用 ref
关键字有很大不同。将其翻译成 C 或 C++ 术语:
- 传递一个对象就像传递一个指针
- 传递对象
ref
就像将指针传递给指针。
如果你想在函数内部改变变量的值,你需要使用ref
或out
。
您必须用 'out' 标记参数。
有关 'out' 的更多信息,请查看:
当您最初调用 Func()
时,myPath
和 p
引用 Path
的相同实例。但是,myPath
和 p
仍然是两个独立的引用,它们恰好指向同一个实例。
也就是说,直到运行以下代码:
p = new Path();
之后,p
引用了 Path
的一个新实例,该实例与原始实例分开。在 p
引用的实例中更改属性不会反映在 myPath
引用的实例中。
换句话说:
private void Func(Path p) // p is a separate reference, referencing same Path as myPath
{
if (p == null) // p still references same Path as myPath
p = new Path(); // now p references a new instance of Path, separate from myPath
}
您可以使用 ref
(或 out
)关键字,以便由 myPath
标识的引用本身被传递 "by reference",其效果是 myPath
和 p
是一个单一的引用。
然后当您在方法中创建 Path
的新实例时,myPath
和 p
仍然是一个引用,都指向新实例。 (您的原始实例仍在内存中某处,但不再引用它。)
Path myPath = null;
private void Func(ref Path p) // p is same reference as myPath
{
if (p == null)
p = new Path(); // p and myPath are still same reference,
// now referencing a new instance of Path
}
或者:
Path myPath;
private void Func(out Path p) // p is same reference as myPath
{
if (p == null)
p = new Path(); // p and myPath are still same reference,
// now referencing a new instance of Path
}