我为一个类声明了一个变量,并将其传递给一个方法来实例化它,但原始变量仍未实例化
本文关键字:一个 实例化 变量 方法 原始 声明 | 更新日期: 2023-09-27 18:15:06
我知道类总是通过引用传递与按值传递的结构不同。
如果你看一下下面的代码,你可以看到我调用了一个没有ref
关键字的函数(据说不需要它,因为Path
是一个类,因此它应该总是由 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()
中初始化,但事实并非如此。
我正在研究全球价值。这会改变什么吗?
您必须用"out"标记参数。
有关"out"的更多信息,请查看以下内容:
https://msdn.microsoft.com/en-us/library/t3c3bfhx.aspx
最初调用 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
标识的引用本身"通过引用"传递,其效果是 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
}
通过引用传递值与使用ref
关键字有很大不同。将其转换为 C 或 C++ 术语:
- 传递对象就像传递指针
- 传递对象
ref
就像传递指向指针的指针。
如果要在函数中更改变量的值,则需要使用 ref
或 out
。