我为一个类声明了一个变量,并将其传递给一个方法来实例化它,但原始变量仍未实例化

本文关键字:一个 实例化 变量 方法 原始 声明 | 更新日期: 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() 时,myPathp引用相同的 Path 实例。但是,myPathp 仍然是两个单独的引用,它们恰好指向同一实例。

也就是说,直到以下代码运行:

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 标识的引用本身"通过引用"传递,其效果是 myPathp 是单个引用。

然后,当您在方法中创建 Path 的新实例时,myPathp 保持单个引用,都指向新实例。(您的原始实例仍在内存中的某个地方,但不再引用它。

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就像传递指向指针的指针。

如果要在函数中更改变量的值,则需要使用 refout