我为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 就像将指针传递给指针。

如果你想在函数内部改变变量的值,你需要使用refout

您必须用 '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 标识的引用本身被传递 "by reference",其效果是 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
}